События
PageBlocks цепляется к стандартным событиям MODX. Своей системы событий у него нет: один плагин слушает нужные компоненту события MODX и раздаёт их классам по имени.
Как работает раздача
Плагин pageblocks привязан к списку событий MODX. На каждом из них он собирает имя класса из имени события и запускает его, если такой класс есть:
OnUserSave → Boshnik\PageBlocks\Events\OnUserSave (фреймворк)
→ PageBlocks\App\Events\OnUserSave (ваш сайт)Отрабатывают оба, сперва фреймворк. В этом вся точка расширения: чтобы отреагировать на событие, положите класс с его именем в core/App/Events/. Ничего регистрировать, править плагин и пересобирать пакет не нужно.
Свой обработчик
<?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 один раз, до цикла:
$eventName = $modx->event->name;$modx->event — один общий объект на всех. Если обработчик вызовет $modx->invokeEvent(), вложенный вызов его перетрёт, и без этого снимка следующая итерация собрала бы имя класса от чужого события. На этом уже обжигались — держите в голове, когда обработчик сам дёргает события.
Какие события подключены
Список того, на что подписан пакет, и что фреймворк уже делает на каждом событии — в Обработчиках.
Чтобы слушать событие MODX, которого нет в этом списке, добавьте его плагину в менеджере (Система → События или вкладка событий у плагина) и положите класс в core/App/Events/. Два отключены намеренно: OnLoadWebDocument и OnPageNotFound.