Skip to content

События

PageBlocks цепляется к стандартным событиям MODX. Своей системы событий у него нет: один плагин слушает нужные компоненту события MODX и раздаёт их классам по имени.

Как работает раздача

Плагин pageblocks привязан к списку событий MODX. На каждом из них он собирает имя класса из имени события и запускает его, если такой класс есть:

OnUserSave  →  Boshnik\PageBlocks\Events\OnUserSave      (фреймворк)
            →  PageBlocks\App\Events\OnUserSave          (ваш сайт)

Отрабатывают оба, сперва фреймворк. В этом вся точка расширения: чтобы отреагировать на событие, положите класс с его именем в core/App/Events/. Ничего регистрировать, править плагин и пересобирать пакет не нужно.

Свой обработчик

php
<?php

namespace PageBlocks\App\Events;

use Boshnik\PageBlocks\Events\Event;

class OnUserSave extends Event
{
    public function run(): void
    {
        $user = $this->scriptProperties['user'] ?? null;
        if (!$user) {
            return;
        }

        // $this->modx - modX
        // $this->pb   - сервис PageBlocks
    }
}

Базовый класс даёт три вещи:

СвойствоЧто это
$this->modxЭкземпляр modX
$this->pbСервис PageBlocks — ассеты, пути, загрузка скриптов
$this->scriptPropertiesТо, что MODX передал в событие

run() ничего не возвращает. Чтобы что-то изменить, работайте с объектами, которые дал MODX.

Ошибки пишутся в лог, а не роняют сайт

Исключение в обработчике плагин ловит и пишет в лог MODX вместе с именем события, классом, сообщением, файлом, строкой и трейсом. Страница продолжает рендериться.

Так задумано — сломанный обработчик не должен класть сайт, — но из этого следует, что обработчик может тихо не сработать. Если что-то не произошло, сперва читайте core/cache/logs/error.log, а уже потом подозревайте раздачу.

Ловушка вложенного события

Плагин читает $modx->event->name один раз, до цикла:

php
$eventName = $modx->event->name;

$modx->event — один общий объект на всех. Если обработчик вызовет $modx->invokeEvent(), вложенный вызов его перетрёт, и без этого снимка следующая итерация собрала бы имя класса от чужого события. На этом уже обжигались — держите в голове, когда обработчик сам дёргает события.

Какие события подключены

Список того, на что подписан пакет, и что фреймворк уже делает на каждом событии — в Обработчиках.

Чтобы слушать событие MODX, которого нет в этом списке, добавьте его плагину в менеджере (Система → События или вкладка событий у плагина) и положите класс в core/App/Events/. Два отключены намеренно: OnLoadWebDocument и OnPageNotFound.

© PageBlocks 2019-present