Системные события Vestnik

Vestnik2 мин чтенияСтраница 11 из 12
На этой странице 3

Vestnik регистрирует три системных события MODX. Подпишитесь на них обычным плагином, чтобы отменять отправку, дополнять данные или вести свою статистику, не меняя код компонента.

Сигнал плагин возвращает так: $modx->event->output('prevent');. В OnVestnikBeforeQueue значения prevent, defer, cancel, false отменяют постановку всего события. В OnVestnikBeforeSend cancel отменяет письмо, а prevent, defer, false откладывают его.

СобытиеКогдаПараметрыЗачем
OnVestnikBeforeQueueВ trigger(), до постановки писем события в очередь — для всего события.eventKey, source, data (по ссылке)Отменить по условию или дополнить данные шаблона.
OnVestnikBeforeSendПри разборе очереди, перед каждым письмом.queue, queueIdprevent — письмо остаётся в очереди и проверяется снова через vestnik_retry_delay, попытка не тратится («тихие часы»); cancel — в журнал со статусом «Отменено».
OnVestnikAfterSendПосле попытки отправки (успешной или нет); для отложенных и отменённых не срабатывает.queueId, success, result, error, attempts, logId, mailСтатистика, лог, вебхук.

Пример 1. OnVestnikBeforeQueue

// Не ставить в очередь тестовые заказы
if ($eventKey === 'shop.order.new' && !empty($data['is_test'])) {
    $modx->event->output('prevent'); // отменить всё событие
    return;
}

// Дополнить данные шаблона (data передаётся по ссылке) — в шаблоне будет [[+shop_name]]
$modx->event->params['data']['shop_name'] = 'Мой магазин';

Пример 2. OnVestnikBeforeSend

$to = $queue->get('to_email');

if (in_array($to, ['blocked@example.com'], true)) {
    $modx->event->output('cancel'); // в журнал со статусом «Отменено»
}

// Тихие часы: письмо останется в очереди и будет проверено позже
if ((int)date('G') < 8) {
    $modx->event->output('prevent');
}

Пример 3. OnVestnikAfterSend

$result — sent, failed или retry; $logId — id записи журнала (0 при повторе); $mail — копия письма массивом.

$text = $success ? 'отправлено' : 'ошибка: ' . $error;
$modx->log($modx::LOG_LEVEL_ERROR, "Vestnik: {$mail['to_email']} — {$text}");

Не путайте эти события с ключом события правила (shop.order.new): ключ определяет, какое письмо отправить, а OnVestnik* — как Vestnik его обрабатывает.