Vestnik регистрирует три системных события MODX. Подпишитесь на них обычным плагином, чтобы отменять отправку, дополнять данные или вести свою статистику, не меняя код компонента.
Сигнал плагин возвращает так: $modx->event->output('prevent');. В OnVestnikBeforeQueue значения prevent, defer, cancel, false отменяют постановку всего события. В OnVestnikBeforeSend cancel отменяет письмо, а prevent, defer, false откладывают его.
| Событие | Когда | Параметры | Зачем |
|---|---|---|---|
OnVestnikBeforeQueue | В trigger(), до постановки писем события в очередь — для всего события. | eventKey, source, data (по ссылке) | Отменить по условию или дополнить данные шаблона. |
OnVestnikBeforeSend | При разборе очереди, перед каждым письмом. | queue, queueId | prevent — письмо остаётся в очереди и проверяется снова через 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 его обрабатывает.