Написание плагинов
Последнее обновление Oct 20th, 2026 | История страницы | Улучшить эту страницу | Сообщить о проблеме
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
Budget
$194 per month—let's make that $500!
Learn moreЧто такое плагин?¶
Плагин — это 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(), ни лексиконных методов.
Смотрите также¶
- Системные события
- OnBeforeCacheUpdate
- OnBeforeChunkFormDelete
- OnBeforeChunkFormSave
- OnBeforeDocFormDelete
- OnBeforeDocFormSave
- OnBeforeEmptyTrash
- OnBeforeManagerLogin
- OnBeforeManagerLogout
- OnBeforeManagerPageInit
- OnBeforePluginFormDelete
- OnBeforePluginFormSave
- OnBeforeRegisterClientScripts
- OnBeforeSaveWebPageCache
- OnBeforeSnipFormDelete
- OnBeforeSnipFormSave
- OnBeforeTempFormDelete
- OnBeforeTempFormSave
- OnBeforeTVFormDelete
- OnBeforeTVFormSave
- OnBeforeUserActivate
- OnBeforeUserFormDelete
- OnBeforeUserFormSave
- OnBeforeWebLogin
- OnBeforeWebLogout
- OnCacheUpdate
- OnCategoryBeforeRemove
- OnCategoryBeforeSave
- OnCategoryRemove
- OnCategorySave
- OnChunkBeforeRemove
- OnChunkBeforeSave
- OnChunkFormDelete
- OnChunkFormPrerender
- OnChunkFormRender
- OnChunkFormSave
- OnChunkRemove
- OnChunkSave
- OnContextBeforeRemove
- OnContextBeforeSave
- OnContextFormPrerender
- OnContextFormRender
- OnContextRemove
- OnContextSave
- OnDocFormDelete
- OnDocFormPrerender
- OnDocFormRender
- OnDocFormSave
- OnDocPublished
- OnDocUnPublished
- OnElementNotFound
- OnEmptyTrash
- OnFileManagerBeforeUpload
- OnFileManagerDirCreate
- OnFileManagerDirRemove
- OnFileManagerDirRename
- OnFileManagerFileCreate
- OnFileManagerFileRemove
- OnFileManagerFileRename
- OnFileManagerFileUpdate
- OnFileManagerUpload
- OnHandleRequest
- OnInitCulture
- OnLoadWebDocument
- OnLoadWebPageCache
- OnManagerAuthentication
- OnManagerLogin
- OnManagerLoginFormPrerender
- OnManagerLoginFormRender
- OnManagerLogout
- OnManagerPageAfterRender
- OnManagerPageBeforeRender
- OnManagerPageInit
- OnMODXInit
- OnPackageInstall
- OnPackageRemove
- OnPackageUninstall
- OnPageNotFound
- OnPageUnauthorized
- OnParseDocument
- OnPluginBeforeRemove
- OnPluginBeforeSave
- OnPluginEventRemove
- OnPluginFormDelete
- OnPluginFormPrerender
- OnPluginFormRender
- OnPluginFormSave
- OnPluginRemove
- OnPluginSave
- OnPropertySetBeforeRemove
- OnPropertySetBeforeSave
- OnPropertySetRemove
- OnPropertySetSave
- OnBeforeResourceGroupRemove
- OnResourceGroupBeforeSave
- OnResourceGroupRemove
- OnResourceGroupSave
- OnRichTextBrowserInit
- OnRichTextEditorInit
- OnRichTextEditorRegister
- OnSiteRefresh
- OnSiteSettingsRender
- OnTemplateVarBeforeRemove
- OnTemplateVarBeforeSave
- OnTemplateVarRemove
- OnTemplateVarSave
- OnUserActivate
- OnUserBeforeRemove
- OnUserBeforeSave
- OnUserChangePassword
- OnUserFormDelete
- OnUserFormSave
- OnUserNotFound
- OnUserRemove
- OnUserSave
- OnWebAuthentication
- OnWebLogin
- OnWebLogout
- OnWebPageComplete
- OnWebPageInit
- OnWebPagePrerender
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
Budget
$194 per month—let's make that $500!
Learn more










