Хуки вывода
Хук вывода — место в шаблоне страницы, куда модули могут вставить свой HTML. Имена таких хуков начинаются с display: displayHome — главная страница, displayFooter — подвал. Модуль подписывается на хук и пишет метод, который возвращает строку.
Подписка на хук
Подписку оформляют при установке модуля вызовом registerHook():
// modules/acmehello/acmehello.php
public function install(): bool
{
return parent::install()
&& $this->registerHook('displayHome');
}Движок запишет в базу, что модуль acmehello отвечает на хук displayHome.
Обработчик
Метод называется hook плюс имя хука с заглавной буквы:
// modules/acmehello/acmehello.php
public function hookDisplayHome(array $params): string
{
return '<p class="acme-hello">Добро пожаловать!</p>';
}Строка, которую вернул метод, попадёт на главную страницу — туда, где тема вызывает этот хук.
Как увидеть результат
Модуль уже установлен, поэтому install() заново не выполнится. Сбросьте модуль:
php bin/console prestashop:module reset acmehelloОткройте главную страницу витрины: под товарами появилась строка «Добро пожаловать!».
Откуда берётся хук
Хук вызывает шаблон темы. В файле themes/classic/templates/index.tpl главная страница выводит переменную, в которую движок заранее собрал ответы всех модулей на displayHome. В других шаблонах хук вызывают прямо на месте:
{* themes/classic/templates/catalog/product.tpl *}
{hook h='displayFooterProduct' product=$product category=$category}Атрибуты product и category попадут в массив $params обработчика.
Хук на карточке товара
Отзывы будут выводиться под описанием товара. Добавьте вторую подписку и второй метод:
// modules/acmehello/acmehello.php
public function install(): bool
{
return parent::install()
&& $this->registerHook('displayHome')
&& $this->registerHook('displayFooterProduct');
}
public function hookDisplayFooterProduct(array $params): string
{
$productId = (int) Tools::getValue('id_product');
return '<p>Отзывы о товаре № ' . $productId . ' появятся здесь.</p>';
}Tools::getValue() читает параметр запроса: на странице товара в нём лежит номер товара. После сброса модуля откройте любой товар — внизу страницы появится строка с его номером.
Частые хуки вывода
| Хук | Где выводится |
|---|---|
displayHeader | Внутри тега head |
displayTop | Шапка сайта |
displayHome | Главная страница |
displayFooter | Подвал |
displayLeftColumn, displayRightColumn | Боковые колонки |
displayProductAdditionalInfo | Карточка товара, под кнопкой покупки |
displayFooterProduct | Карточка товара, под описанием |
displayShoppingCart | Страница корзины |
displayOrderConfirmation | Страница «Спасибо за заказ» |
displayCustomerAccount | Личный кабинет, список разделов |
Полный список и порядок модулей на каждом хуке показывает страница панели «Дизайн → Расположение модулей». Там же модуль можно подключить к хуку или отключить без кода.
Свой хук
Модуль может объявить собственную точку расширения, чтобы другие модули добавляли что-то в его блок. В шаблоне модуля пишут {hook h='displayAcmeHelloAfterReviews'} — имя придумывают сами, начиная с display.
Частая ошибка
Вы добавили в install() новый вызов registerHook(), а метод хука не срабатывает. Причина: модуль уже установлен, и install() больше не запускается. Сбросьте модуль командой prestashop:module reset или подключите хук вручную на странице «Дизайн → Расположение модулей».