Хуки действия
Хук действия сообщает о событии: заказ оформлен, товар сохранён, покупатель зарегистрировался. Имена таких хуков начинаются с action. В отличие от хука вывода, обработчик ничего не возвращает на страницу — он выполняет работу: пишет в журнал, отправляет письмо, обновляет свою таблицу.
Подписка
Подписка такая же, как у хуков вывода, — в install() главного класса:
// modules/acmehello/acmehello.php
public function install(): bool
{
return parent::install()
&& $this->registerHook('displayHome')
&& $this->registerHook('displayFooterProduct')
&& $this->registerHook('actionValidateOrder');
}Хук actionValidateOrder срабатывает в момент, когда заказ создан.
Обработчик
// modules/acmehello/acmehello.php
public function hookActionValidateOrder(array $params): void
{
$order = $params['order'];
PrestaShopLogger::addLog('Новый заказ ' . $order->reference, 1);
}В $params движок передаёт данные события. Здесь это объект заказа, из которого берётся его номер reference. PrestaShopLogger::addLog() пишет строку в журнал магазина; второй аргумент — важность: 1 — сообщение, 3 — ошибка.
Как увидеть результат
Сбросьте модуль, чтобы подписка заработала:
php bin/console prestashop:module reset acmehelloОформите на витрине тестовый заказ и откройте в панели «Расширенные параметры → Журналы»: в списке появится запись «Новый заказ» с номером.
Что приходит в параметрах
У каждого хука свой набор ключей в $params.
| Хук | Когда срабатывает | Ключи в $params |
|---|---|---|
actionValidateOrder | Заказ оформлен | cart, order, customer, currency, orderStatus |
actionOrderStatusPostUpdate | Состояние заказа изменилось | newOrderStatus, id_order |
actionCustomerAccountAdd | Покупатель зарегистрировался | newCustomer |
actionCartSave | Корзина сохранена | cart |
actionProductUpdate | Товар обновлён | id_product, product |
actionProductDelete | Товар удалён | id_product, product |
Если ключи неизвестны, найдите вызов хука в исходниках движка: поиск по тексту 'actionProductDelete' в папке classes покажет строку с Hook::exec() и массивом параметров.
Несколько данных из события
// modules/acmehello/acmehello.php
public function hookActionValidateOrder(array $params): void
{
$order = $params['order'];
$customer = $params['customer'];
PrestaShopLogger::addLog(
sprintf('Заказ %s от %s на сумму %.2f', $order->reference, $customer->email, $order->total_paid),
1,
);
}Теперь в журнале видно, кто оформил заказ и на какую сумму.
Хуки объектов
Движок сам вызывает хуки при сохранении любого объекта ядра. Их имена собираются по шаблону.
| Шаблон имени | Когда |
|---|---|
actionObject<Класс>AddAfter | Объект создан |
actionObject<Класс>UpdateAfter | Объект изменён |
actionObject<Класс>DeleteAfter | Объект удалён |
Например, actionObjectCustomerUpdateAfter срабатывает при любом изменении покупателя. Сам объект лежит в $params['object'].
Частая ошибка
В обработчике хука действия вызывают die(), echo или делают перенаправление. Хук срабатывает посреди чужой операции — например, оформления заказа, — и такой вызов обрывает её: заказ создан, а покупатель видит пустую страницу. Обработчик должен тихо сделать свою работу и вернуть управление, а ошибки — записать в журнал.