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
codeyesyes

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