Jump to main content Jump to doc navigation

Написание плагинов

Other versions: 3.x — Other languages: EN RU — Found a problem? Please edit this page or report an issue.

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

Плагины похожи на сниппеты тем, что они представляют собой кусочки кода 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->gt;output(); любой текст, который вы хотите записать в журналы, может быть просто возвращен плагином. Если вы прошли валидацию, просто верните ноль.

HTML код не разрешен Выходные данные, которые вы устанавливаете в $modx->gt;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;
    }
}

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

  1. Системные события
  2. OnBeforeCacheUpdate
  3. OnBeforeChunkFormDelete
  4. OnBeforeChunkFormSave
  5. OnBeforeDocFormDelete
  6. OnBeforeDocFormSave
  7. OnBeforeManagerLogout
  8. OnBeforeSaveWebPageCache
  9. OnBeforeWebLogout
  10. OnCacheUpdate
  11. OnChunkFormDelete
  12. OnChunkFormPrerender
  13. OnChunkFormRender
  14. OnChunkFormSave
  15. OnDocFormDelete
  16. OnDocFormPrerender
  17. OnDocFormRender
  18. OnDocFormSave
  19. OnDocPublished
  20. OnDocUnPublished
  21. OnLoadWebPageCache
  22. OnManagerLogin
  23. OnManagerLogout
  24. OnSiteRefresh
  25. OnUserChangePassword
  26. OnWebLogin
  27. OnWebLogout
  28. OnWebPagePrerender
  29. OnManagerPageBeforeRender
  30. OnTemplateVarBeforeSave
  31. OnTemplateVarSave
  32. OnTemplateVarBeforeRemove
  33. OnTemplateVarRemove
  34. OnBeforeEmptyTrash
  35. OnBeforeManagerLogin
  36. OnBeforeManagerPageInit
  37. OnBeforePluginFormDelete
  38. OnBeforePluginFormSave
  39. OnBeforeSnipFormDelete
  40. OnBeforeSnipFormSave
  41. OnBeforeTempFormDelete
  42. OnBeforeTempFormSave
  43. OnBeforeTVFormDelete
  44. OnBeforeTVFormSave
  45. OnBeforeUserActivate
  46. OnBeforeUserFormDelete
  47. OnBeforeUserFormSave
  48. OnBeforeWebLogin
  49. OnCategoryBeforeRemove
  50. OnCategoryBeforeSave
  51. OnCategoryRemove
  52. OnCategorySave
  53. OnChunkBeforeRemove
  54. OnChunkBeforeSave
  55. OnChunkRemove
  56. OnChunkSave
  57. OnContextBeforeRemove
  58. OnContextBeforeSave
  59. OnContextFormPrerender
  60. OnContextFormRender
  61. OnContextRemove
  62. OnContextSave
  63. OnEmptyTrash
  64. OnFileManagerUpload
  65. OnHandleRequest
  66. OnInitCulture
  67. OnLoadWebDocument
  68. OnManagerAuthentication
  69. OnManagerLoginFormPrerender
  70. OnManagerLoginFormRender
  71. OnManagerPageAfterRender
  72. OnManagerPageInit
  73. OnPageNotFound
  74. OnPageUnauthorized
  75. OnParseDocument
  76. OnPluginBeforeRemove
  77. OnPluginBeforeSave
  78. OnPluginEventRemove
  79. OnPluginFormDelete
  80. OnPluginFormPrerender
  81. OnPluginFormRender
  82. OnPluginFormSave
  83. OnPluginRemove
  84. OnPluginSave
  85. OnPropertySetBeforeRemove
  86. OnPropertySetBeforeSave
  87. OnPropertySetRemove
  88. OnPropertySetSave
  89. OnResourceGroupBeforeRemove
  90. OnResourceGroupBeforeSave
  91. OnResourceGroupRemove
  92. OnResourceGroupSave
  93. OnRichTextBrowserInit
  94. OnRichTextEditorInit
  95. OnRichTextEditorRegister
  96. OnSiteSettingsRender
  97. OnUserActivate
  98. OnUserBeforeRemove
  99. OnUserBeforeSave
  100. OnUserFormDelete
  101. OnUserFormSave
  102. OnUserNotFound
  103. OnUserRemove
  104. OnUserSave
  105. OnWebAuthentication
  106. OnWebPageComplete
  107. OnWebPageInit