Skip to content
Sendex
Sendex
Email-рассылки в MODX — подписчики, очередь писем и форма подписки на сайте
  1. Компоненты
  2. Sendex
  3. События

События

Sendex регистрирует системные события sxOn* при установке пакета. После обновления переустановите пакет через Extras → Installer, если события не появились в Управление → Системные события.

Подключение плагина

  1. Элементы → Плагины → Создать
  2. Вкладка Системные события — отметьте нужные sxOn*
  3. Вставьте PHP-код в поле плагина
  4. Сохраните и очистите кэш MODX

Отмена Before-события: $modx->event->output('текст ошибки'). Пользователь увидит это сообщение; операция не выполнится.

Подсказка

Вызов $modx->invokeEvent('sxOnSubscribe', …) по имени работает и до регистрации события в transport, но для менеджера удобнее подписать плагин явно.

Поток подписки и отписки

Повторная подписка, неверный code или несовпадение newsletter_id — операция игнорируется, события не срабатывают.

Подписка и отписка

СобытиеКогдаОтмена
sxOnBeforeSubscribeПеред созданием подписчикада
sxOnSubscribeПосле успешного сохранениянет
sxOnBeforeUnsubscribeПеред удалением подписчикада
sxOnUnsubscribeПосле успешного удалениянет

Параметры subscribe / unsubscribe

ПараметрBeforeSubscribeSubscribeBeforeUnsubscribeUnsubscribe
newsletterдададада
newsletter_idдададада
user_idдададада
emailдададада
subscribernullобъектобъектобъект
sourceдададада
codeдада

Значения source

ЗначениеОписание
snippetОбычный POST формы
ajaxAJAX-запрос
confirmПодтверждение email по ссылке
guestМгновенная подписка гостя без подтверждения
mgrДействие из менеджера
groupМассовая подписка группы (события не вызываются)

Поток очереди писем

Очередь писем

СобытиеКогдаОтмена
sxOnBeforeAddQueuesПеред формированием очередида (вся партия)
sxOnAddQueuesПосле создания строк очерединет
sxOnBeforeQueueSendПеред отправкой одного письма (после claim)да (строка удаляется, без requeue)
sxOnQueueSendПосле успешной отправкинет
sxOnQueueSendFailedПосле ошибки SMTP (claim снят)нет
sxOnQueueFlushCompleteПосле пакетной отправкинет

Параметры очереди

СобытиеПараметры
sxOnBeforeAddQueuesnewsletter, subscribers (массив, можно изменить)
sxOnAddQueuesnewsletter, created (число новых строк)
sxOnBeforeQueueSendqueue, message (массив headers+body, можно изменить)
sxOnQueueSendqueue, message
sxOnQueueSendFailedqueue, error (строка)
sxOnQueueFlushCompletenewsletter_id, stats (sent, skipped, failed, firstError)

На sxOnBeforeQueueSend плагин может изменить $scriptProperties['message'] до отправки. Отмена через $modx->event->output() — строка удаляется, повторной постановки нет.

События MODX (плагин Sendex)

Событие MODXПоведение
OnManagerPageInitПодключение CSS менеджера
OnUserActivateСлияние guest-подписчиков на пользователя по email
OnUserSaveТо же при сохранении пользователя

OnBeforeUserActivate не используется — отменённая активация не должна прикреплять guest-строки.

Примеры плагинов

Блокировка домена

php
<?php
switch ($modx->event->name) {
    case 'sxOnBeforeSubscribe':
        $email = $modx->event->getParam('email');
        if (preg_match('/@spam\.example$/i', (string) $email)) {
            $modx->event->output('Подписка с этого домена запрещена');
        }
        break;
}

Лог подписок

php
<?php
switch ($modx->event->name) {
    case 'sxOnSubscribe':
        $modx->log(
            modX::LOG_LEVEL_INFO,
            '[Sendex] subscribe: ' . $modx->event->getParam('email')
            . ' newsletter=' . $modx->event->getParam('newsletter_id')
            . ' source=' . $modx->event->getParam('source')
        );
        break;
    case 'sxOnUnsubscribe':
        $modx->log(
            modX::LOG_LEVEL_INFO,
            '[Sendex] unsubscribe: ' . $modx->event->getParam('email')
        );
        break;
}

Исключение подписчиков перед очередью

php
<?php
if ($modx->event->name !== 'sxOnBeforeAddQueues') {
    return;
}

$subscribers = $modx->event->getParam('subscribers');
if (!is_array($subscribers)) {
    return;
}

$filtered = array();
foreach ($subscribers as $subscriber) {
    if (strpos((string) $subscriber->get('email'), '@internal.local') !== false) {
        continue;
    }
    $filtered[] = $subscriber;
}

$modx->event->setParam('subscribers', $filtered);

Персонализация темы письма

php
<?php
if ($modx->event->name !== 'sxOnBeforeQueueSend') {
    return;
}

$message = $modx->event->getParam('message');
if (!is_array($message)) {
    return;
}

$queue = $modx->event->getParam('queue');
$attempts = $queue ? (int) $queue->get('attempts') : 0;
if ($attempts > 1) {
    $message['subject'] = '[retry] ' . $message['subject'];
}

$modx->event->setParam('message', $message);

Уведомление при ошибке SMTP

php
<?php
if ($modx->event->name !== 'sxOnQueueSendFailed') {
    return;
}

$error = $modx->event->getParam('error');
$queue = $modx->event->getParam('queue');
$modx->log(
    modX::LOG_LEVEL_ERROR,
    '[Sendex] queue id ' . ($queue ? $queue->get('id') : '?') . ': ' . $error
);

Связанные разделы