Система Событий (Event) в OpenCart. Часть 1 из 3 - Обработка Событий.
Как я уже писал ранее, наиболее интерестным новшеством в OpenCart 2.0 стало появление в этой версии Событий (Event).
Так что же это?
Что такое События (Event) в OpenCart?
Система Событий OpenCart это инструмент, с помощью которого можно изменить логику работы OpenCart из своего модуля не изменяя при этом код самого OpenCart. Подобные инструменты есть во всех серьезных системах: в Drupal есть система хуков, в Sypfony те же События. Такой системы просто катастрофически не хватало в OpenCart, так как единственным способом что-то изменить из своего модуля до недавнего времени был vQmod который является причиной огромного количества конфликтов и одним из самых больших недостатков OpenCart.
Важное замечание! Система Событий только появилась в OpenCart 2.0 и находится в разработке, поэтому со временем может немного измениться. Если вы обнаружили такие изменения - напишите об этом в комментариях, добавлю в статью.
Регистрация Событий
Класс, который отвечает за регистрацию Событий и запуск Обработчиков этих Событий находится в system/engine/event.php
Он подключается, как обычно, через system/startup.php:
require_once(modification(DIR_SYSTEM . 'engine/event.php'));
который вызывается в index.php:
// Startup require_once(DIR_SYSTEM . 'startup.php');
Этот класс небольшой, можно привести весь его код:
class Event { private $data = array(); public function __construct($registry) { $this->registry = $registry; } public function register($key, $action) { $this->data[$key][] = $action; } public function unregister($key, $action) { unset($this->data[$key]); } public function trigger($key, &$arg = array()) { if (isset($this->data[$key])) { foreach ($this->data[$key] as $event) { $action = new Action($event, $arg); $action->execute($this->registry); } } } }
Мы видим, что в классе Event содержится 3 метода:
1. register для регистрации новых Событий
2. unregister для удаления событий из реестра. Этот метод на данный момент нигде не используется.
3. trigger для запуска Обработчиков Событий. Метод получает аргументы $arg по ссылке, это значит что мы их можем изменить в Обработчике. На одно событие могут быть
добавлены несколько Обработчиков. Например, 2 модуля могут обрабатывать одно Событие по очереди.
Сами События добавляются в OpenCart в index.php:
// Event $event = new Event($registry); $registry->set('event', $event); $query = $db->query("SELECT * FROM " . DB_PREFIX . "event"); foreach ($query->rows as $result) { $event->register($result['trigger'], $result['action']); }
Мы видим, что сначала создается объект Event, добавляется в реестр, после чего с базы данных получаются все События и регистрируются.
Запуск Обработчиков Событий
Каждый раз, когда в коде встретится:
$this->event->trigger('event_name', $args);
будут вызываться Обработчики, которые привязаны к этому Событию.
например в catalog/model/checkout/order.php в методе addOrder есть код:
$this->event->trigger('pre.order.add', $data);
Это значит, что мы можем в своем модуле создать Обработчик для этого События 'pre.order.add', в котором можем изменить все переменные из $data как нам угодно.
"Как добавить новый Обработчик События в своем модуле" читайте во второй части этой статьи.