Написание плагинов
Последнее обновление Sep 24th, 2021 | История страницы | Улучшить эту страницу | Сообщить о проблеме
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
$301 per month—let's make that $500!
Learn moreЧто такое плагин?¶
Плагины похожи на Cниппеты тем, что они также представляют собой фрагменты PHP кода, которые имеют доступ к API MODX. Наибольшая разница, однако, заключается в том, когда именно выполняется этот код. Вы помещаете сниппеты внутри страницы или внутри шаблона, и они запускаются при просмотре страницы, тогда как плагины настроены на выполнение во время определенных системных событий, например сохранение чанка или очистка кеша. Поэтому, когда данное событие «срабатывает», любой плагин «прослушивает» это событие. После выполнения кода плагина управление возвращается к точке после того места, где было инициировано системное событие.
Другие CMS Каждая CMS использует некое понятие «плагин», но точная номенклатура может отличаться. Например, в WordPress плагины «подключаются» к событиям, называемым «действиями» или «фильтрами».
Поскольку они выполняются во время различных событий, плагины не ограничиваются обработкой внешнего интерфейса. Многие события запускаются событиями, которые происходят только в менеджере MODX. Список системных событий MODX можно посмотреть здесь.
Любой закрывающий тег php?>
будет удален из кода вашего плагина при его сохранении. Это не нужно (и нежелательно), потому что код плагина при запуске будет находиться внутри другого кода PHP.
Модель события¶
MODX вызывает системные события в своих процессах кода, чтобы вы могли изменять функциональность ядра без взлома ядра. К этим системным событиям может быть прикреплено любое количество плагинов, и они будут запускать каждый плагин в соответствии с его приоритетом (сначала самые низкие номера)
Обработка события¶
В вашем плагине способ обработки выходных данных зависит от системного события, в котором вы находитесь. Для некоторых системных событий вы возвращаете значение из плагина. Для других вы получаете доступ к выводу по ссылке и изменяете его.
Если вам нужно знать, какое событие вызвало ваш плагин (скажем, для плагина, который прослушивает более одного события), вы можете получить доступ к имени события следующим образом:
$eventName = $modx->event->name;
Код для плагина, прослушивающего более одного события, выглядит следующим образом:
$eventName = $modx->event->name;
switch($eventName) {
case 'OnWebPageInit':
/* сделать что-то */
break;
case 'OnWebPagePrerender':
/* сделать что-то другое */
break;
}
Примеры плагинов¶
Плагины могут быть использованы для различных целей, ниже приведены несколько примеров:
Сообщение пользователю¶
Описание: Отправьте сообщение пользователю при создании/редактировании страницы. Системные события: OnDocFormPrerender
$modx->event->output('Привет, пользователь!');
Пользовательская проверка¶
Описание: Выполните некоторую пользовательскую проверку при сохранении ресурса страницы. Системные события: OnBeforeDocFormSave
// Сделать какую-нибудь логичную штуку... если проверка не удалась:
$modx->event->output('Что-то не прошло проверку!');
return "Этот текст пойдет в логи";
Хитрость в том, что то, что вы хотите сообщить пользователю, должно быть передано функции $modx->event->output()
; любой текст, который вы хотите записать в журналы, может быть просто возвращен плагином. Если вы прошли валидацию, просто верните ноль.
HTML код не разрешен
Выходные данные, которые вы устанавливаете в $modx->&event->output()
, не должны содержать HTML! Используйте только простой текст! Это связано с тем, что сообщение передается пользователю через модальное окно JavaScript.
Возвращаемое значение должно быть строкой. Если возвращаемое значение будет числом, объедините его с пустой строкой.
Фильтр слов¶
Описание: Отфильтруйте слова из документа перед его отображением в Интернете. Системные события: OnWebPagePrerender
$words = array("snippet", "template"); // слова для фильтрации
$output = &$modx->resource->_output; // получить ссылку для вывода
$output = str_replace($words,"<b>[отфильтровано]</b>",$output);
Перенаправитель страницы "Не найдено"¶
Описание: Перенаправляет пользователя на выбранный документ и отправляет сообщение. Системные события: OnPageNotFound Системные настройки:
- pnf.page: Идентификатор ресурса (ID)
- pnf.mailto: E-mail адрес получателя
- pnf.mailfrom: E-mail адрес отправителя
if ($modx->event->name == 'OnPageNotFound') {
$errorPage = $modx->getOption('pnf.page');
if (empty($errorPage)) {
$modx->sendErrorPage();
} else {
$mailto = $modx->getOption('pnf.mailto');
if (!empty($mailto)) {
// отправить сообщение на локальный профиль
$resourceId = $modx->resource->get('id');
$subject = 'Страница не найдена';
$body = 'Кто-то пытался зайти на страницу с 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
- OnBeforeManagerLogout
- OnBeforeSaveWebPageCache
- OnBeforeWebLogout
- OnCacheUpdate
- OnChunkFormDelete
- OnChunkFormPrerender
- OnChunkFormRender
- OnChunkFormSave
- OnDocFormDelete
- OnDocFormPrerender
- OnDocFormRender
- OnDocFormSave
- OnDocPublished
- OnDocUnPublished
- OnLoadWebPageCache
- OnManagerLogin
- OnManagerLogout
- OnSiteRefresh
- OnUserChangePassword
- OnWebLogin
- OnWebLogout
- OnWebPagePrerender
- OnManagerPageBeforeRender
- OnTemplateVarBeforeSave
- OnTemplateVarSave
- OnTemplateVarBeforeRemove
- OnTemplateVarRemove
- OnBeforeEmptyTrash
- OnBeforeManagerLogin
- OnBeforeManagerPageInit
- OnBeforePluginFormDelete
- OnBeforePluginFormSave
- OnBeforeSnipFormDelete
- OnBeforeSnipFormSave
- OnBeforeTempFormDelete
- OnBeforeTempFormSave
- OnBeforeTVFormDelete
- OnBeforeTVFormSave
- OnBeforeUserActivate
- OnBeforeUserFormDelete
- OnBeforeUserFormSave
- OnBeforeWebLogin
- OnCategoryBeforeRemove
- OnCategoryBeforeSave
- OnCategoryRemove
- OnCategorySave
- OnChunkBeforeRemove
- OnChunkBeforeSave
- OnChunkRemove
- OnChunkSave
- OnContextBeforeRemove
- OnContextBeforeSave
- OnContextFormPrerender
- OnContextFormRender
- OnContextRemove
- OnContextSave
- OnEmptyTrash
- OnFileManagerUpload
- OnHandleRequest
- OnInitCulture
- OnLoadWebDocument
- OnManagerAuthentication
- OnManagerLoginFormPrerender
- OnManagerLoginFormRender
- OnManagerPageAfterRender
- OnManagerPageInit
- OnPageNotFound
- OnPageUnauthorized
- OnParseDocument
- OnPluginBeforeRemove
- OnPluginBeforeSave
- OnPluginEventRemove
- OnPluginFormDelete
- OnPluginFormPrerender
- OnPluginFormRender
- OnPluginFormSave
- OnPluginRemove
- OnPluginSave
- OnPropertySetBeforeRemove
- OnPropertySetBeforeSave
- OnPropertySetRemove
- OnPropertySetSave
- OnResourceGroupBeforeRemove
- OnResourceGroupBeforeSave
- OnResourceGroupRemove
- OnResourceGroupSave
- OnRichTextBrowserInit
- OnRichTextEditorInit
- OnRichTextEditorRegister
- OnSiteSettingsRender
- OnUserActivate
- OnUserBeforeRemove
- OnUserBeforeSave
- OnUserFormDelete
- OnUserFormSave
- OnUserNotFound
- OnUserRemove
- OnUserSave
- OnWebAuthentication
- OnWebPageComplete
- OnWebPageInit
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
$301 per month—let's make that $500!
Learn more