Система Событий (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 как нам угодно.
 
"Как добавить новый Обработчик События в своем модуле" читайте во второй части этой статьи.
 

Добавить комментарий

CAPTCHA
Защита от спама
Target Image