Skip to content
  1. Extras
  2. Sendex
  3. Events

Events ​

Sendex registers sxOn* system events on package install. After upgrade, reinstall the package via Extras → Installer if events are missing under Manage → System events.

Plugin setup ​

  1. Elements → Plugins → Create
  2. System events tab — check the sxOn* events you need
  3. Paste PHP code into the plugin
  4. Save and clear the MODX cache

Cancel a Before event: $modx->event->output('error message'). The user sees that text; the operation aborts.

Подсказка

Calling $modx->invokeEvent('sxOnSubscribe', …) by name works even before transport registration, but explicit plugin subscription is easier to manage.

Subscribe and unsubscribe flow ​

Re-subscribe, invalid code, or mismatched newsletter_id — the operation is ignored, events do not fire.

Subscribe and unsubscribe ​

EventWhenCancel
sxOnBeforeSubscribeBefore creating a subscriberyes
sxOnSubscribeAfter successful saveno
sxOnBeforeUnsubscribeBefore removing a subscriberyes
sxOnUnsubscribeAfter successful removeno

Subscribe / unsubscribe parameters ​

ParameterBeforeSubscribeSubscribeBeforeUnsubscribeUnsubscribe
newsletteryesyesyesyes
newsletter_idyesyesyesyes
user_idyesyesyesyes
emailyesyesyesyes
subscribernullobjectobjectobject
sourceyesyesyesyes
code——yesyes

source values ​

ValueDescription
snippetNormal form POST
ajaxAJAX request
confirmEmail confirmation link
guestInstant guest subscribe without confirm
mgrManager action
groupBulk group subscribe (events not fired)

Email queue flow ​

Email queue ​

EventWhenCancel
sxOnBeforeAddQueuesBefore building the queueyes (whole batch)
sxOnAddQueuesAfter queue rows createdno
sxOnBeforeQueueSendBefore sending one row (after claim)yes (row removed, no requeue)
sxOnQueueSendAfter successful sendno
sxOnQueueSendFailedAfter SMTP error (claim released)no
sxOnQueueFlushCompleteAfter batch flushno

Queue parameters ​

EventParameters
sxOnBeforeAddQueuesnewsletter, subscribers (array, mutable)
sxOnAddQueuesnewsletter, created (new row count)
sxOnBeforeQueueSendqueue, message (headers+body array, mutable)
sxOnQueueSendqueue, message
sxOnQueueSendFailedqueue, error (string)
sxOnQueueFlushCompletenewsletter_id, stats (sent, skipped, failed, firstError)

On sxOnBeforeQueueSend a plugin may change $scriptProperties['message'] before send. Cancel via $modx->event->output() — row is removed with no requeue.

MODX events (Sendex plugin) ​

MODX eventBehavior
OnManagerPageInitManager CSS
OnUserActivateMerge guest subscribers onto user by email
OnUserSaveSame on user save

OnBeforeUserActivate is not used — cancelled activation must not attach guest rows.

Plugin examples ​

Block a domain ​

php
<?php
switch ($modx->event->name) {
    case 'sxOnBeforeSubscribe':
        $email = $modx->event->getParam('email');
        if (preg_match('/@spam\.example$/i', (string) $email)) {
            $modx->event->output('Subscriptions from this domain are blocked');
        }
        break;
}

Log subscriptions ​

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;
}

Filter subscribers before queue ​

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);

Personalize email subject ​

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);

Alert on SMTP failure ​

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
);