Разработка:modlibs/templater
Плагин | |
Название | templater |
Тип | modlibs |
Содержание
Принципы работы
Плагин templater отвечает за все действия по экспорту данных и за создание любых электронных документов (отчетов, приказов, графиков и т. п.)
Общие сведения
Все документы формируются следующим образом: на основе требуемого документа создается файл шаблона документа;
- собираются данные для вставки в шаблон
- формируется экспортируемый документ - производится вставка данных в шаблон;
- сформированный документ посылается клиенту по http-протоколу.
Шаблон документа формируется из документа по специальным правилам, а затем размещается в оговоренном месте плагина, из которого производится экспорт. Затем по аналогичным правилам производится вставка данных. Сбор и подготовка данных для экспорта производятся тем же плагином. В настоящее время формирование шаблона производится в ручную. Описываемый модуль получает путь к каталогу документа, данные для вставки и формат документа. На основе этих данных он формирует документ и посылает его клиенту.
Формат исходных данных
Данные, предназначенные для экспорта должны соответствовать следующим стандартам:
- Исходные данные всегда представлены в виде объекта класса stdClass (стандартный объект PHP).
- Поля объекта могут содержать строки, числа и массивы объектов (массивы строк или чисел не допускаются). Данные других типов не обрабатываются.
Строки и числа подставляются в шаблон документа "как есть", объекты обрабатываются как блоки. Объект данных для экспорта может иметь неограниченное количество вложенных блоков. Желательно для создания объекта данных для экспорта создавать отдельный класс, которые решает эту задачу.
Пример исходных данных
В этом примере мы построим объект для экспорта оценок учеников двух классов. У каждого класса есть название, предмет, и дата, за которую выставлялись оценки. В каждом классе есть несколько учеников, которые эти оценки получили.
Данные для экспорта будут выглядеть следующим образом:
stdClass Object ( [classes] => Array [0] => stdClass Object // данные о первом классе [name] => 3 "б" [date] => 21.01.09 [subject] => Математика [students] => Array [0] => stdClass Object // здесь хранятся данные первого ученика из 3-го "Б" [number] => 1 [fio] => Замеладский Алексей [grade] => 5 [1] => stdClass Object [number] => 2 [fio] => Гусева Татьяна [grade] => 4 [1] => stdClass Object // данные о втором классе [name] => 5 "б" [date] => 21.01.09 [subject] => Русский язык [students] => Array [0] => stdClass Object // здесь хранятся данные первого ученика из 5-го "Б" [number] => 1 [fio] => Коньков Сергей [grade] => 5 [1] => stdClass Object [number] => 2 [fio] => Захаров Александр [grade] => 3 )
В этом примере поля объектов представляют собой данные, которые нужно распечатать, о объекты служат для упаковки этих данных, и разделения их на блоки.
Тип документа
Каждый экспортируемый документ должен относиться к какому-либо типу. Тип документа зависти от его назначения (оценки за четверть, приказ о переводе в следующий класс, и т. д.). Внутри типа документа всегда содержатся экспортируемые данные. Каждый документ определенного типа можно экспортировать в несколько разных форматов.
Форматы экспорта
Каждый формат экспорта по-своему обрабатывает данные, указанные в типе документа. Тем не менее, какой бы формат экспорта не был выбран (например csv, odf, pdf), данные всегда используются одни и те же.
Использование
В этом разделе будет описано, как использовать плагин templater, будут приведены примеры кода.
Подготовка к экспорту
Для начала надо убедиться, что на месте вспомогательные средства. Т.е. установлен описываемый плагин templater, и плагин обеспечивающий превращения шаблона документа в документ - pear. Поэтому убедитесь, что у вас
- установлен плагин pear. Убедитесь, что на странице списка установленных плагинов, напротив модуля pear написано "Удалить, а не " "Установить".
- в нем есть библиотека HTML_Template_Sigma. Проверьте наличие файла .../modlibs/pear/libs/HTML_Template_Sigma/Sigma.php.
- установлен описываемый модуль - templater. Проверьте так же как и pear.
Использование готового документа
Самый простой способ экспортировать данные. Использование этого способа предполагает, что кто-то уже создал шаблон документа для экспорта, определил его тип и разметил его соответствующим образом. Вам остается сделать всего 2 действия:
- собрать данные
- указать какой документ в какой формат вы желаете экспортировать.
Сбор данных
Данные извлекаются из базы данных, или из форм, а затем преобразуются в нужный для экспорта формат. О том, какой формат должны иметь данные для экспорта описано в разделе Формат исходных данных. Рекомендуется выделять для сбора и упаковки данных отдельный класс, особенно если процесс сбора данных достаточно сложен.
Указание формата и типа документа
После того, как были собраны все необходимые данные можно приступать непосредственно к процессу экспорта. Нужно сначала получить объект для для экспорта, затем передать ему данные, и получить готовый файл.
Пример
- Обращаемся к плагину templater чтобы получить нужный объект.
$export = $DOF->modlib('templater')->template('im', 'genedu', $data, 'gradeslist');
Здесь:
im - тип плагина,
genedu - имя плагина,
gradeslist - директория, в которой лежит шаблон документа, который будет экспортирован.
$export - объект, который будет производить все необходимые операции.
$data - собранные на предыдущем этапе данные.
- Получив объект, обращаемся к нему выбираем формат, в который мы собираемся произвести экспорт.
$file = $export->get_file('odf');
В переменной $file будет содержаться файл нужного формата. Если вам нужно отправить файл немедленно вместе с заголовками, то воспользуйтесь методом send_file. Обратите внимание, что объект $export уже хранит в себе все необходимые данные. Если вы хотите еще раз экспортировать данные, но уже в другой формат - не нужно заново создавать объект, достаточно обратиться к нему еще раз.
Создание типа документа
В случае, когда нужно создать новый шаблон для документа требуются дополнительные операции. При работе над экспортом этот вариант будет использоваться наиболее часто.
Простое
В случае простого создания типа документа вам не потребуется писать какой-либо дополнительный код для обработки данных.
Для простого создания типа документа нужно:
- Создать все необходимые файлы и папки
- Подготовить шаблон документа
- Собрать данные
- Указать какой документ в какой формат вы желаете экспортировать.
Создание файлов и папок
Надо в корневом каталоге плагина, из которого производится экспорт, создать папку с именем templater. В ней, для каждого из документов, которые предполагается экспортировать, надо создать папку с именем типа документа. В них надо создать директории, с названиями форматов экспорта. Например, в плагине интерфейса exampleim планируется экспортировать документ с именем "тип_документа" в различные форматы. Тогда структура папок плагина должна быть такой:
.../im/exampleim/templater/<тип_документа>/<имя_формата1>/ .../im/exampleim/templater/<тип_документа>/<имя_формата2>/
Здесь:
- тип_документа - имя типа документа
- имя_формата - формат, в который нужно экспортировать файл
В свою очередь, внутри папки с именем формата должен лежать шаблон результирующего документа.
Подготовка шаблона документа
В случае, если вам нужно создать новый документ, для которого еще не создан шаблон - этот шаблон нужно создать и разметить. Файл шаблона должен быть размечен тэгами шаблонизатора PEAR::HTMLTemlateSigma. В нем оформляются места для вставки данных - поля и блоки.
- Отдельное поле помечается фигурными скобками {}.
- Внутри скобок указывается имя поля. Например, {lastname} - поле, вместо которого должна подставляться фамилия.
- Если есть блок полей, то начало блока помечается тегом ‹!-- BEGIN block_name --›.
- Окончание блока помечается тегом ‹!-- END block_name --›. Здесь block_name - имя блока, все остальное - обязательная служебная конструкция. Между этими тегами нужно размещать поля блока и другие блоки.
Например надо получить такой файл:
Тогда поля и блоки надо вставлять в файл шаблона так:
Изнутри файл, размеченный тегами Sigma будет выглядеть следующим образом:
Отчет об индивидуальной успеваемости. Ученик {name}. Предмет, Оценка ‹!-- BEGIN grades_table --› {course}, {grade} ‹!-- END grades_table --› {autor}.
Таким образом, объект данных для экспорта приведенной выше таблицы должен выглядеть так:
Сбор данных
Сбор данных при создании своего типа документа аналогичен сбору данных при использовании готового документа.
Указание формата и типа документа
Указание формата и типа документа происходит так же как и при использовании готового документа.
Возможности по настройке поведения
В случае, когда недостаточно возможностей простой разметки и обработки документа - можно задать собственную логику поведения для любого формата или класса форматов. Например, если стандартная логика обработки odf-файлов вам не подходит, вы можете переопределить ее, и задать собственное поведение для обработки своих документов. Более подробно этот процесс описан в следующем разделе - "Создание формата".
Создание формата
Если есть необходимость произвести экспорт в формат, который пока еще не предусмотрен плагином templater - у вас есть возможность самостоятельно дополнить список форматов, в которые возможен экспорт. Также в этом разделе будет описана возможность переопределения поведения существующего формата.
Все созданные форматы должны соответствовать определенным требованиям:
- располагаться в специальной папке,
- внутри modlib\templater\formats\ если вы создаете новый формат
- или внутри <тип_плагина>\<имя_плагина>\templater\<тип_документа>\
- наследовать базовый класс dof_modlib_templater_format и реализовывать все его базовые методы.
Расположение файлов
Для создания нового формата
Структура папок:
- modlib - папка всех плагинов типа modlib
- templater - папка плагина templater
- formats - папка в которой лежат все форматы
- <имя_формата> - имя созданного вами формата. Всегда задается как стандартное расширение файла указанного формата.
- init.php - файл в котором будет содержаться новый класс формата
- template.<имя_формата> - файл шаблона документа.
- formats - папка в которой лежат все форматы
- templater - папка плагина templater
Для изменения поведения существующего формата
- <тип_плагина> - тип плагина, в котором нужно переопределить класс экспорта, например im
- <имя_плагина> - имя плагина, в котором нужно переопределить класс экспорта, например genedu
- templater - папка в которой хранятся все типы документов
- <тип_документа> - папка с типом документа
- <имя_формата> - формат, в который вы хотите сделать возможным экспорт. Всегда задается как стандартное расширение файла указанного формата (например pdf).
- init.php - файл, в котором содержится переопределенный класс для формата.
- template.<имя_формата> - файл шаблона документа. Более подробно о том, как должен называться файл шаблона - см. раздел "Форматы экспорта".
- <тип_документа> - папка с типом документа
- templater - папка в которой хранятся все типы документов
- <имя_плагина> - имя плагина, в котором нужно переопределить класс экспорта, например genedu