Encodera

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

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

Оглавление

Хуки действия

Хук действия сообщает о событии: заказ оформлен, товар сохранён, покупатель зарегистрировался. Имена таких хуков начинаются с 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 или делают перенаправление. Хук срабатывает посреди чужой операции — например, оформления заказа, — и такой вызов обрывает её: заказ создан, а покупатель видит пустую страницу. Обработчик должен тихо сделать свою работу и вернуть управление, а ошибки — записать в журнал.

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

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