Статьи  : 

Работа с событиями Opencart 2.0

1 сентября 2016, 00:00

Одним из нововведений opencart 2.0 стала система событий (эвентов; также, пожалуй, можно называть их и триггерами). Теперь в коде тут и там можно встретить подобные конструкции:

$this->event->trigger('pre.customer.add', $data);
$this->event->trigger('post.customer.add', $customer_id);


и так далее...

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

Постановка задачи



Научимся работать с событиями opencart на примере модификации кода, относящегося к оформлению заказа.

Теория



Обработка событий выполняется через скрипт system/engine/event.php. Он содержит методы register (добавление события в реестр) и trigger (собственно, запуск события).

Все имеющиеся в системе события подгружаются в реестр в корневом файле index.php:

$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']);
}


Практика



Как мы видим, информация по загружаемым событиям хранится в MySQL таблице event. Поэтому без всяких сложностей добавим туда интересующий нас триггер:

INSERT INTO `event` (`code`, `trigger`, `action`)
VALUES
( 'add_order_notify', 'post.order.add', 'triggers/order/add_order_event' );


В данном случае при срабатывании события post.order.add будет вызываться контроллер catalog/triggers, а в нем метод add_order_event. Создадим этот файл:

class ControllerTriggersOrder extends Controller
{
    /**
     * последействие после добавления заказа
     */

    public function add_order_event($order_id)
    {
        $this->load->model( 'checkout/order' );
        $order_info = $this->model_checkout_order->getOrder($order_id);

        // далее оперируем с информацией по заказу
    }
}


Следует отметить особенность по передаче параметров из вызывающего кода в триггер. В данном случае мы передаем номер заказа (order_id), который, как видно, стоит аргументом в вызываемом методе. Далее мы можем оперировать с полученной переменной как нам угодно. Например, мы можем делать запросы в сторонний сервис через API, посылать уведомления и так далее, и так далее.

Выводы



В данной статье мы разобрали принцип работы с событиями opencart. В целом, их использование не представляет какой-либо сложности: достаточно добавить запись о событии в базу данных и создать соответствующий ему контроллер (или модифицировать существующий). Так что при умелом использовании они представляют собой мощное средство для доработок системы.

P.S.



Нужно заметить, что события из публичной части и админки работают раздельно. То есть из админки не получится запустить код триггера, находящегося в папке catalog, и наоборот.