Большую часть функциональности можно реализовать в шаблонах eZ Publish. Выборки, сортировки, преобразование изображений, отправка простых форм и много другое доступно «из коробки».
Но что делать с нетривиальной логикой? Сложные фильтры, улучшение корзины товаров, обмен с публичной частью асинхронными сообщениями? Всё это недоступно в шаблонизаторе! Для таких задач eZ Publish имеет механизм создания расширений системы php-файлами, в которых можно реализовывать новые функции и операторы шаблонизатора, создавать API или просто возвращать какую-то информацию по URL-ам.
Чтобы создать расширение нужно добавить папку (либо символьную ссылку на нее) в каталог расширений ~/extension, находящийся в корневом каталоге eZ ~/ezpublish-legacy/extension, реализовать необходимую структуру папок и файлов, переопределить базовые настройки.
Код расширения располагается в нескольких папках:
autoloads - скрипты дополнения функциональности шаблонов.
Например, получение ссылки в нужном формате или сортировка массива массивов. Также в этой папке находится своеобразный справочник этих функций (eztemplateautoload.php), в котором находятся данные для корректного расширения базовой функциональности добавленными скриптами.
classes - классы бизнес-логики.
Их использование необязательно, но с ними код получается более структурированным и понятным. К этим классам можно обращаться из любого места расширения. Например, в файле Comments.php будет находиться соответствующий класс для работы с комментариями.
design - шаблоны используемые в расширении.
Синтаксис этих файлов такой же как в других шаблонах.
libs - файлы сторонних библиотек
Это могут быть, к примеру, Stripe, Twitter, Яндекс.Касса и многие другие.
modules - код, доступный по различным http-адресам.
Разделение логики на модули, а модулей - на функции (не путать с функциями кода), нужно для управления правами доступа из панели администратора. В каждом модуле есть файл Module.php, который определяет роутинг (какому файлу передавать управление при обращении по конкретному адресу). Остальные файлы реализуют какую-либо логику и могут быть объединены в подкаталоги.
settings - настройки расширения.
Подробнее о папке Autoloads
Обязательно наличие файла eztemplateautoload.php, который будет реализовать своеобразный роутинг операторов шаблонизатора. Для добавления нового оператора необходимо добавить элемент в массив. Делается это следующим образом:
$eZTemplateOperatorArray[] = array(
'script' => __DIR__ . '/MyOperators.php',
'class' => 'MyOperators',
'operator_names' => array('operator_1', 'operator_2', ....')
);
Где
- script - путь к файлу, в котором описывается логика,
- class - php-класс, в котором описывается логика,
- operator_names - названия новых операторов шаблонизатора, которые будут описываться в данном файле.
Подробнее о папке Design
Расположение файлов аналогично основным шаблонам. Отличаются лишь корневой директорией. Для расширения вложенность немного больше - “~/extension/common/design/standard”. И уже в этой папке будут находиться подкаталоги override и templates.
Подробнее о папке Module
В каждом модуле имеется файл Module.php (роутинг). В нем имеется массив $ViewList = array(), который и будет содержать настройки управления.
Пример из модуля одного из наших проектов:
$ViewList['remove_image'] = array(
'script' => 'remove_image.php',
'functions' => array('images'),
'params' => array('node_id')
);
- Ключ “remove_image” - элемент адреса (/extension_name/remove_image/10).
- Script - путь к php-файлу.
- Functions - функция панели управления (для ограничения прав доступа).
- Params - именованный параметр, передаваемый в скрипт. В данном случае “node_id” = 10.
Подробнее о папке Settings
Минимально необходимые настройки находятся в файле module.ini.append.php:
[ModuleSettings]
ExtensionRepositories[]=extension_name
ModuleList[]=extension_name
Для использования шаблонов в расширении необходимы настройки design.ini.append.php:
[ExtensionSettings]
DesignExtensions[]=extension_name
Новые операторы шаблонизатора требуют настроек site.ini.append.php:
[TemplateSettings]
ExtensionAutoloadPath[]=extension_name
Реализовав структуру расширения и прописав необходимые настройки, необходимо подключить это расширение к основному сайту и панели администратора в файлах site.ini.append.php:
[ExtensionSettings]
ActiveAccessExtensions[]=extension_name
Чтобы использовать modules (url’ы) нужно настроить права доступа в панели администратора для интересующей роли. Например, чтобы сделать доступным расширений для всех пользователей, придется выполнить следующие шаги:
- Авторизоваться в панели администратора;
- Перейти в настройки расширений (Setup->Extensions - /setup/extensions);
- Нажать кнопку update для обновления списка доступных расширений;
- Перейти в настройки пользователей (User accounts - /Users);
- Перейти в настройки прав и ролей (Roles and policies - /role/list);
- Выбрать в списке ролей Anonymous;
- Зайти в режим редактирования (кнопка Edit);
- Добавить новые права (New policy);
- На странице добавления выбираем module (наше расширение) и functions (набор функций из modules нашего расширения);
- Сохраняем изменения.
Если в расширении используются классы, то после добавления соответствующий файлов необходимо обновлять массив автозагрузок классов. Для этого есть специальная кнопка “Regenerate autoload arrays for extensions” на странице настроек расширений.
Никита Надолинский
6.06.2017Неплохая статья. Ребята, спасибо!