Написание плагинов
Последнее обновление Dec 7th, 2019 | История страницы | Улучшить эту страницу | Сообщить о проблеме
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
$195 per month—let's make that $500!
Learn moreЧто такое плагин?¶
Плагины похожи на сниппеты: это фрагменты 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;
}
}
Смотрите также¶
- Системные события
- 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
- OnResourceGroupBeforeRemove
- 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
$195 per month—let's make that $500!
Learn more










