Jump to main content Jump to doc navigation

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

Плагины похожи на сниппеты: это фрагменты PHP-кода с доступом к API MODX. Главное отличие в том, когда выполняется код. Сниппеты вы вставляете в страницу или шаблон, и они запускаются при просмотре. Плагины срабатывают на системные события: сохранение чанка, очистка кеша и т. п. Когда событие «стреляет», выполняется каждый плагин, который на него подписан. После выполнения управление возвращается к точке сразу после места вызова системного события.

Другие CMS В каждой CMS есть аналог «плагина», но термины могут отличаться. В WordPress, например, плагины «цепляются» к событиям «actions» или «filters».

Плагины не ограничены фронтендом. Многие события возникают только в менеджере MODX. Список системных событий 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. Сообщение показывается в модальном окне JavaScript.

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

Фильтр слов

Описание: Отфильтруйте слова в документе перед выводом на сайт. Системные события: 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->getService('mail', 'mail.modPHPMailer');
            $modx->mail->set(modMail::MAIL_BODY, $body);
            $modx->mail->set(modMail::MAIL_FROM, $modx->getOption('pnf.mailfrom'));
            $modx->mail->set(modMail::MAIL_FROM_NAME, 'MODX');
            $modx->mail->set(modMail::MAIL_SENDER, 'MODX');
            $modx->mail->set(modMail::MAIL_SUBJECT, $subject);
            $modx->mail->address('to',$mailto);
            $modx->mail->setHTML(true);
            $modx->mail->send();
         }
         $url = $this->makeUrl($scriptProperties['page']);
         $modx->sendRedirect($url, 1);
         exit;
    }
}

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

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

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

Learn more