Jump to main content Jump to doc navigation

Что такое плагин?

Плагин — это PHP, который выполняется на системном событии, а не при отрисовке страницы. Сниппет работает, когда рендерится страница; плагин — когда что-то происходит: сохраняется чанк, чистится кэш, пользователь логинится. Все плагины, подписанные на сработавшее событие, выполняются по возрастанию приоритета, после чего управление возвращается вызывающему коду.

В других CMS этот механизм называют хуком, действием или фильтром — имя разное, суть одна. Большинство событий MODX возникает только в менеджере, поэтому плагины не ограничены фронтендом; полный список — в Системных событиях.

При сохранении из кода плагина удаляется любой закрывающий PHP-тег ?>. Он не нужен: при выполнении код плагина окажется внутри другого PHP-кода.

Модель событий

MODX вызывает системные события в своих процессах, чтобы вы могли менять поведение ядра без правок core. К одному событию можно привязать несколько плагинов. Они выполняются по приоритету: сначала с меньшим числом.

Обработка события

В плагине способ работы с выводом зависит от системного события. Для одних вы возвращаете значение из плагина. Для других берёте вывод по ссылке и меняете его.

Если нужно узнать, какое событие вызвало плагин (например, когда он слушает несколько событий), имя события доступно так:

$eventName = $modx->event->name;

Код плагина на несколько событий:

$eventName = $modx->event->name;
switch($eventName) {
    case 'OnWebPageInit':
        /* do something */
        break;
    case 'OnWebPagePrerender':
        /* do something else */
        break;
}

Сообщение пользователю

Описание: Отправьте пользователю сообщение при создании или редактировании страницы, например свой заголовок. Системные события: OnDocFormPrerender

$modx->event->output('Hi there user!');

Валидация при сохранении

Описание: Выполните пользовательскую валидацию при сохранении ресурса страницы. Системные события: OnBeforeDocFormSave

// Do some logical stuff.... if validation failed:
$modx->event->output('Something did not validate!');
return "This goes to the logs";

Текст для пользователя передавайте в $modx->event->output(). Сообщение в лог отправляйте через return. Если валидация прошла, верните null.

HTML не допускается Вывод в $modx->event->output() должен быть plain text, без HTML. Для OnBeforeDocFormSave этот текст становится сообщением об ошибке процессора и выводится как обычный текст.

Возвращаемое значение должно быть строкой. Если это число, склейте его с пустой строкой.

Фильтр слов

Описание: Отфильтруйте слова в документе перед выводом на сайт. Системные события: OnWebPagePrerender

$words = array("snippet", "template"); // words to filter
$output = &$modx->resource->_output; // get a reference to the output
$output = str_replace($words,"<b>[filtered]</b>",$output);

Редирект при 404

Описание: Перенаправьте пользователя на выбранный документ и отправьте сообщение. Системные события: OnPageNotFound Системные настройки: создайте эти три ключа в «Система → Настройки» — в ядре их нет:

  • pnf.page: ID ресурса ошибки
  • pnf.mailto: адрес получателя
  • pnf.mailfrom: адрес отправителя
if ($modx->event->name == 'OnPageNotFound') {
     $errorPage = $modx->getOption('pnf.page');
     if (empty($errorPage)) {
         $modx->sendErrorPage();
     } else {
         $mailto = $modx->getOption('pnf.mailto');
         if (!empty($mailto)) {
            // send a message to a local account
            $resourceId = $modx->resource->get('id');
            $subject = 'Page not found';
            $body = 'Someone tried to access document id '.$resourceId;
            $modx->mail->set(\MODX\Revolution\modMail::MAIL_BODY, $body);
            $modx->mail->set(\MODX\Revolution\modMail::MAIL_FROM, $modx->getOption('pnf.mailfrom'));
            $modx->mail->set(\MODX\Revolution\modMail::MAIL_FROM_NAME, 'MODX');
            $modx->mail->set(\MODX\Revolution\modMail::MAIL_SENDER, 'MODX');
            $modx->mail->set(\MODX\Revolution\modMail::MAIL_SUBJECT, $subject);
            $modx->mail->address('to', $mailto);
            $modx->mail->setHTML(true);
            $modx->mail->send();
         }
         $modx->sendRedirect($modx->makeUrl($errorPage), ['count_attempts' => true]);
         exit;
    }
}

[!WARNING] Внутри кода плагина используйте $modx->…, а не $this->…. В 3.x тело плагина подключается через include напрямую, без обёртки в метод, поэтому $this — это объект modPlugin, у которого нет ни makeUrl(), ни getOption(), ни лексиконных методов.

Смотрите также

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • JT Skaggs
  • deJaya
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$194 per month—let's make that $500!

Learn more