sv2109

  • записи
    52
  • комментариев
    9
  • просмотра
    5 373

Система Событий (Event) в OpenCart. Часть 1 из 3 - Обработка Событий.

sv2109

2 302 просмотра

bigstock-events-7444309.jpg

Как я уже писал ранее, наиболее интерестным новшеством в 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 как нам угодно.

 

"Как добавить новый Обработчик События в своем модуле" читайте во второй части этой статьи.

---

Мои модули для OpenCart можно скачать тут: https://freecart.pro/sv2109/

 


0


0 комментариев


Нет комментариев для отображения

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас
  • Актуальные темы на форуме

  • Последние сообщения

    • Здравствуйте! Пол года назад открыл Интернет-Магазин на  Opencart 2.1.0.1 Сейчас решил изменить простой список подкатегорий - именно тот, который выводится в отдельном окне при нажатии например на категорию в меню. Знаю что размер шрифта и цвет можно задать в файле "stylesheet.css" и вполне могу сам это сделать, но не могу найти в этом файле раздел, в котором описываются стили для вывода подкатегории в отдельном окне. Ведь откуда то берется цвет шрифта а также цвет при наведении на текст! Подскажите пожалуйста - от куда подтягиваются настройки цвета и размера шрифта подкатегории, которая выводится в отдельном окне?   Заранее благодарен, Бычков Виталий
    • в опенкарте, в самом движке, это не реализовано
      + артикул это как идентификатор товара, поэтому для разных артикулов нужны разные товары, на некоторых сайтах так реализовано напр. для каждого цвета товара отдельный артикул и отдельный товар. 
    • Возможно ли создать опцию, чтобы при выборе размера менялся и артикул? Если возможно, то как это сделать?