Механизм "хуков"
Механизм "хуков"
Как было сказано в предыдущих статьях PrestaShop позволяет создавать модули, предназначенные для изменения отображаемого содержимого или реакции на события.
Механизм хуков позволяет модулям реагировать на определенные события или выводить содержимое в фронт или бэк офисе. Таким образом хуки можно разделить на:
- Обработчики событий (например отправка email при регистрации пользователя или оповещение о добавлении заказа)
- Визуальные хуки (предназначенные для отображения содержимого, например в левой колонке)
Иногда визуальный хук можно использовать также в качестве обработчика события (например фиксировать заход на главную страницу с помощью обработки хука «home»). При этом модуль не обязан возвращать какое-либо визуальное содержимое.
В стандартной теме PrestaShop для главной страницы можно выделить следующие визуальные хуки:
- header - класс FrontController
- top - класс FrontController
- leftColumn - класс FrontController
- home - контроллер IndexController
- rightColumn - класс FrontController
- footer - класс FrontController
В каждом хуке может быть расположено неограниченное количество независимых друг от друга модулей.
Использование хуков
Прежде всего для правильного использования хуков в классе нашего модуля нужно создать не статический public метод, название которого начинается с ключегового слова «hook» и имени спользуемого хука (например для хука «home» метод будет выглядеть как «hookHome»). В созданный метод передается только один аргумент - массив различных параметров, зависящих от хука.
public function hookNameOfHook($params) { //... }
Вторым шагом является регистрация модуля в хуке. Это можно сделать вручную на вкладке Модули/Позиции, либо при установке модуля выполнить автоматическую регистрацию.
public function install() { return parent::install() && $this->registerHook('NameOfHook'); }
При удалении модуля нет необходимости в удалении регистрации в хуке, PrestaShop очистит информацию об этом самостоятельно.
Также можно использовать чужие хуки в собственном модуле. Это можно сделать вызвав функцию hookExec.
$params = array( 'param_1' => 'value_1' , 'param_2' => 'value_2' , ); Module :: hookExec ( 'NameOfHook' , $params );
Добавление нового хука
Для начала новый хук нужно добавить в таблицу хуков. Сделать это можно двумя способами. Добавлением при помощи класса Hook:
$hook = new Hook(); $hook->name = 'NameOfHook'; $hook->add();
Либо прямой записью в базу данных (более гибкий способ):
INSERT INTO `ps_hook` (`name`, `title`, `description`, `live_edit`) VALUES ('nameOfHook', 'Name Of Hook', 'It is a custom hook !', 1);
Затем добавим в контроллер или класс вызов созданного нами хука. Например для создания визуального хука, действующего во всем фронт-оффисе переопределим класс FrontController следующим образом:
<?php class FrontController extends FrontControllerCore { public function displayHeader() { self::$smarty->assign('HOOK_NameOfHook', Module::hookExec('NameOfHook')); parent::displayHeader(); } }
Дальнейшие действия по регистрации модуля в хуке и его обработке аналогичны, выполняемым при использовании уже существующего хука.