• Блог
  • Фронтэнд события MODX

В MODX все события разделены на две группы — события для сайта (frontend) и события для менеджера сайта (backend). При загрузке страницы MODX инициирует события, разбивая загрузку на этапы. Когда событие срабатывает, MODX запускает все плагины (объекты MODX, содержащие php-код), которые привязаны к данному событию. Давайте рассмотрим все frontend события в порядке их срабатывания.

OnInitCulture

Самое первое событие. Честно говоря, функциональная необходимость в этом событии не совсем понятна — MODX ещё не до конца инициализировался, а следующие 2 метода запускаются сразу же следом, но уже с полностью инициализированным объектом MODX.

OnMODXInit

Срабатывает в конце инициализации MODX после загрузки всех необходимых сервисов (modError, modLexicon, modRegistry, cacheManager), загрузки пакетов из ExtensionPackages и инициализации сессии, в которой определяется пользователь. В плагине, срабатывающем на это событие, можно, например, загружать модели своих компонентов (если они не загружаются через ExtensionPackages). Запускается это событие в классе modX.

Важно знать!

Это событие срабатывает всегда в отличие от других событий не зависимо от режима запроса (обычный или API). Все остальные события срабатывают только для запросов в обычном режиме. API режим используется, если нужно получить доступ к функционалу MODX и xPDO, и обработка текущего запроса не требуется. Часто этот режим используется для аякс запросов. Включается он так — define('MODX_API_MODE', true); (подробнее).

OnHandleRequest

Срабатывает в самом начале обработки запроса пользователя. Данное событие можно использовать для маршрутизации запроса — перенаправлять пользователя на определенную страницу в зависимости от условий (аналогично .htaccess).

Если используется режим дружественных URLS, то происходит поиск идентификатора ресурса с соответствующим алиасом. Если такой не найден, то идёт переадресация на страницу ошибок с вызовом события OnPageNotFound.

OnWebPageInit

Срабатывает в конце обработки запроса перед подготовкой ответа. Статус сайта уже определён и идентификатор ресурса (id) найден (он доступен в $modx->resourceIdentifier).

После этого события MODX загружает ресурс и проверяет права доступа к нему для текущего пользователя. И если проверки не прошли, то запускается одно из 2-х следующих событий — «OnPageNotFound» или «OnPageUnauthorized».

OnPageNotFound

Если ресурс с указанным id не найден, то срабатывает данное событие, формируется ответ «404 Page not found» и пользователь перенаправляется на страницу, указанную в системных параметрах (ключ error_page). Иногда это событие используют для настройки особенной маршрутизации. Вот пример.

OnPageUnauthorized

Событие срабатывает, когда пользователь пытается открыть страницу, доступ к которой ему запрещён. MODX вернёт ответ с кодом «HTTP/1.1 401 Unauthorized» и перенаправит пользователя на страницу для неавторизованных пользователей, указанную в системных настройках (ключ unauthorized_page).

Если проверки прошли успешно, то MODX запускает следующие события.

OnLoadWebPageCache

Это событие сработает, если ресурс загружается из кэша. В MODX 2.3 и выше для доступа к свойствам ресурса можно использовать объект Event.

$modx->event->params['resource']->_content = 'Новый контент'; // Заменить содержание страницы
$modx->event->params['resource']->pagetitle = 'Новый заголовок'; // Изменить заголовок страницы

OnLoadWebDocument

Как видно из названия, событие срабатывает после того, как все проверки пройдены и документ загружен, но перед тем, как он будет распарсен (т.е. обработаны все теги). В плагине ресурс доступен через $modx->resource. Любое сообщение, которое возвращает плагин, будет записано в журнал ошибок MODX. В этом событии можно изменить параметры ресурса

// Сделать ресурс некешируемым
$modx->resource->set('cacheable', 0);
// Или назначить ему другой шаблон
$modx->resource->set('template', 6);

OnParseDocument

Событие срабатывает для каждого тега MODX, т.е. столько раз, сколько тегов будет на странице. В плагине содержание тега доступно через переменную $content.

OnBeforeRegisterClientScripts

Добавлено в версии 2.7.0. Оно даёт удобную возможность проверить списки зарегистрированных скриптов и стилей, например, чтобы не их дублировать. Но для полноценной работы в этом режиме необходимо все скрипты и стили регистрировать через соответствующие методы, а не просто вставлять в разметку.

OnWebPagePrerender

MODX инициализирует это событие после того, как все теги обработаны и перед тем, как страница отправится в браузер. На данном этапе можно обработать содержание страницы, например, заменить запрещённые слова.

$words = array("козёл", "сволочь"); // слова, которые будут заменены
$output = &$modx->resource->_output; // получаем доступ к содержанию страницы
$output = str_replace($words,"<b>нехороший человек</b>",$output);  // заменяем слова

OnBeforeSaveWebPageCache

Срабатывает после того, как ресурс уже загружен, но ещё не закэшировался. Если ресурс не кэшируемый, то это событие не сработает.

Доступ к ресурсу возможен через $modx->resource.

OnWebPageComplete

Это самое последнее событие. Оно срабатывает, когда страница уж отправлена в браузер и подготовленный ресурс сохранен в кэш.

Заключение

Теперь, зная последовательность, можно изменять поведение MODX или решать собственные задачи создавая плагины на соответствующие события. Можно создать плагин на каждое событие, а можно один плагин на несколько событий.

switch ($modx->event->name) {
    case 'OnMODXInit':
        // ...
        break;
    case 'OnPageNotFound':
        // ...
        break;	
    case 'OnWebPagePrerender':
        // ...
        break;
}

Также в MODX предусмотрена возможность добавления пользовательских событий. Правила их срабатывания определяются программистом при создании сайта. Подробнее про события можно почитать в официальной документации.

2   13318

Комментарии ()

  1. Илья Уткин 04 февраля 2016 # 0
    О, спасибо, про
    $modx->event->params
    я как-то упустил…
    1. Сергей Шлоков 04 февраля 2016 # 0
      Пожалуйста, не зря столько писал.:)
    2. sergey 06 декабря 2016 # 0
      ребятки подскажите как можно реализовать переключение контекста определив язык пользователя ???
      1. Сергей Шлоков 06 декабря 2016 # 0
        Определить язык пользователя можно так
        $lang = $modx->getOption('cultureKey');
        Переключить контекст так
        $modx->switchContext($context); // $context - название контекста
        Ну а дальше написать условие.
        1. sergey 06 декабря 2016 # 0
          Сергей спасибо огромное, но это уже включено в то что я сделал, т.е что я щас имею,
          1) определяю к примеру страну пользователя и переключаю на нужный контекст
          2) записываю в куки (возможно не нужно)
          но если я так делаю то у меня перестают работать ссылки и переключение языка в BabelLinks, типа Page not Found, хотя ссылка в адр строке верная, вот тут я не пойму что делать
          1. Сергей Шлоков 06 декабря 2016 # 0
            Скорее всего не хватает каких-то настроек. Вот статья по контекстам. Проверьте, всё ли делаете правильно.
            С BabelLinks не работал, поэтому помочь с ним не смогу.
      2. Максим 15 января 2019 # 0
        Доброго времени суток, помогите разобраться) мне нужно сменить шаблон на лету, при этом смена шаблона должна произойти после сравнения сессии. К примеру если $_SESSION['see'] = «on» то сменить шаблон. Пробовал повесить на событие OnLoadWebDocument, но не получается, сессия вроде как не срабатывает. Какое событие нужно применять?
        1. Максим 15 января 2019 # 0
          Вопрос снят) оказалось забыл указать session_start();

        Вы должны авторизоваться, чтобы оставлять комментарии.

        Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.