Системные события (триггеры) фреймворка Zoo

4.3/10 оценка (3 голосов)

Практически в любом фреймворке есть такое понятие, как системные события (event’ы, триггеры, хуки, ловушки). В Joomla они оформлены как плагины, а в классической литературе это добро обычно называют Observer или слушатель.

Смысл в следующем. В разных местах кода расставлены вызовы событий, например, после удаления любого материала будет вызвано событие item:deleted. Все функции, которые подключены к этому событию, будут выполнены в порядке подключения. Таким образом, будут удалены зависимости от материала, такие как картинки или записи в базе данных.

Как это работает?

В рамках Zoo все выполнено довольно в упрощенном варианте (собственно как и во всей Joomla) и собрано все в единственном хелпере event.

Создаем и подключаем класс события. Далее:

$event      = $this->app->event;
$dispatcher = $event->dispatcher;
// производим регистрацию своего класса
$event->register('MyEventClass');
// подключаемся к событию
$dispatcher->connect('myevent:function', array('MyEventClass', 'handler'));

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

$dispatcher->notify($event->create($var, 'myevent:function', array( /* ассоц массив с доп параметрами */))); // $var - основной объект события

Пример простейшего класса для обработки событий

// Класс нужно подключить вручную
class MyEventClass
{
    /**
     * Simple event handler
     * @param AppEvent $event
     */
    public static function handler($event)
    {
          $app = App::getInstance('zoo'); // не забываем, что это статический метод, где нет $this
          $subject = $event->getSubject(); // получаем объект события
          $params = $event->getParameters(); // получаем доп параметры
         
    }
}

Существующие события системы

JBZoo регистрирует классы «пустышки» для удобства расширения функционала. Их можно найти тут — /media/zoo/applications/jbuniversal/framework/events/jbevent.*.php. Заодно так можно узнать, какие события есть в системе.

Важно понимать что:

  • Обработчики событий — это только статические классы.
  • Все объекты передаются по ссылке, т.е. их изменения коснутся остального кода.
  • Не важно, что вы вернете из события — это нигде не используется.
  • Цепочку действий в событии не прервать.
  • Можно легко уйти в цикл, например, в init вызывать создание аналогичного экземпляра.
API

У меня остались вопросы, где я могу их задать?

Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.