Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Хуки вывода

Хук вывода — место в шаблоне страницы, куда модули могут вставить свой 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 или подключите хук вручную на странице «Дизайн → Расположение модулей».

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.