Здравствуй, уважаемый друг!

Кажется, ты используешь AdBlock. Этот проект развивается и существует за счет доходов от рекламы.
Добавь, пожалуйста, нас в исключения.

Спасибо за понимание.

Система событий в Opencart 2.x: как использовать event

Автор: в категории Интересное в мире 0 комментариев

В продолжение изучения новых возможностей Opencart 2.x рассмотрим Event-систему данной CMS, которую мы слегка затронули при изучении установщика расширений (Extension Installer) в Opencart 2.x, который позволяет устанавливать модификации и расширения.

Система событий и триггеров в Opencart 2

В данной статье мы разберемся как работает система событий в Opencart 2.x, и как ее использовать при написании своих модулей.

Данная система позволяет писать код, который будет выполняться при определенных событиях, происходящих в OpenCart. Такими событиями могут быть:

  • создание учетной записи (регистрация);
  • оформление заказа;
  • редактирование адресов пользователя;

или другие ключевые события, которые имеют строку с вызовом триггера, и все это без необходимости использования vQmod или OCMOD, или изменения файлов системы! С помощью системы событий, вы можете избежать ошибок, которые происходят, когда вы используете систему модификаций вроде vQmod или OCMOD.

Как работают события Opencart 2.x

Для использования системы событий достаточно выполнить два действия:

  1. регистрация обработчика событий;
  2. реализация обработчика событий;

Обработчики событий — просто методы, определенные в файлах контроллера. Вы можете использовать один файл для всех ваших методов или вы можете создать отдельный контроллер для ваших обработчиков событий.

Для регистрации обработчики событий необходимо использовать модель extension/event (для OpenCart 2.0.1+) или модель tool/event (для OpenCart 2.0.0.0).

В модели extension/event есть 2 метода:

  1. addEvent($code, $trigger, $action);
  2. deleteEvent($code).

Не сложно догадаться, что функция addEvent() используется для регистрации обработчиков событий, а deleteEvent() используется для отмены регистрации. Это позволяет зарегистрировать свои обработчики событий в методе install() контроллера вашего модуля в admin разделе, а также удалить их, когда ваш модуль удаляется, для чего используется метод uninstall() этого же файла контроллера.

Аргумент $code — используется для группы обработчиков событий. Здесь вы указываете название вашего модуля.

Аргумент $trigger  -название события, на которые вы хотели бы установить обработчик. Список всех доступных триггеров, можно найти здесь: https://github.com/opencart/opencart/wiki/Events-(script-notifications).

Аргумент $action путь к вашей функции обработчика. Указывается в виде стандартного адреса к контроллеру. Например: module/mymodule/on_install.

Пример событий Opencart 2.x

В данном примере предполагается, что мы работаем с OpenCart 2.0.1+. Теперь давайте предположим, что мы создаем модуль под названием «My Module». Файл-контроллер администратора для модуля будет admin/controller/module/mymodule.php. Файл-контроллер каталога для модуля будет catalog/controller/module/mymodule.php.

Модуль будет реализовывать 2 простые функции:

  1. отправку сообщения электронной почты администратору, когда удаляется магазин (мультимагазин);
  2. отправку сообщения электронной почты администратору при регистрации клиента.

Триггеры, которые мы будем использовать в pre.admin.store.delete и post.customer.add.

Для начала, мы зарегистрируем наши обработчики событий в методе install() нашего модуля:

public function install() {
    $this->load->model('extension/event');
    $this->model_extension_event->addEvent('mymodule', 'pre.admin.store.delete', 'module/mymodule/on_store_delete');
    $this->model_extension_event->addEvent('mymodule', 'post.customer.add', 'module/mymodule/on_customer_add');
}

Мы также должны позаботиться о процессе удаления, и удалить обработчики событий в случае удаления модуля:

public function uninstall() {
    $this->load->model('extension/event');
    $this->model_extension_event->deleteEvent('mymodule');
}

Далее, мы должны реализовать обработчики событий. События, название которых начинается с pre, вызываются перед выполнением действия, а события, название которых начинаются с postпосле завершения действия.

Если нам необходимо включить домен магазина в наше сообщение, выбираем событие «pre» вместо «post», т.к. при использовании post.admin.store.delete мы не сможем получить домен магазина.

Событие pre.admin.store.delete генерируется в админке, так что его обработчик должен быть реализован в файле контроллера администратора для нашего модуля. Мы хотим, чтобы наш обработчик событий уведомлял администратора об удалении магазина, и наш обработчик будет выглядеть примерно так:

public function on_store_delete($store_id) {
    $this->load->model('setting/store');
    $store_info = $this->model_setting_store->getStore($store_id);
    $admin_mail = $this->config->get('config_email');
    mail($admin_mail, "A store has been deleted", "The store " . $store_info['url'] . " was deleted.");
}

Все, что осталось сделать, это реализовать обработчик для события post.customer.add. Мы будем делать это в каталоге контроллера нашего модуля. Метод будет уведомлять администратора, когда регистрируется новый клиент и будет выглядеть примерно так:

public function on_customer_add($customer_id) {
    $this->load->model('account/customer');
    $customer_info = $this->model_account_customer->getCustomer($customer_id);
    $admin_mail = $this->config->get('config_email');
    mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info['email']);
}

Внимание: в примере используется функция mail() для отправки электронной почты для простоты. В реальной ситуации для этого необходимо использовать класс OpenCart.

Окончательные версии наших файлов выглядит следующим образом:
admin/controller/module/mymodule.php

<?php class ControllerModuleMyModule extends Controller { public function install() { $this->load->model('extension/event');
        $this->model_extension_event->addEvent('mymodule', 'pre.admin.store.delete', 'module/mymodule/on_store_delete');
        $this->model_extension_event->addEvent('mymodule', 'post.customer.add', 'module/mymodule/on_customer_add');
    }
    
    public function uninstall() {
        $this->load->model('extension/event');
        $this->model_extension_event->deleteEvent('mymodule');
    }
    
    public function on_store_delete($store_id) {
        $this->load->model('setting/store');
        $store_info = $this->model_setting_store->getStore($store_id);
        $admin_mail = $this->config->get('config_email');
        mail($admin_mail, "A store has been deleted", "The store " . $store_info['url'] . " was deleted.");
    }
}

catalog/controller/module/mymodule.php

<?php class ControllerModuleMyModule extends Controller { public function on_customer_add($customer_id) { $this->load->model('account/customer');
        $customer_info = $this->model_account_customer->getCustomer($customer_id);
        $admin_mail = $this->config->get('config_email');
        mail($admin_mail, "New Customer", "A new customer has just registered with the following e-mail: " . $customer_info['email']);
    }
}

Дополнительно

Помимо стандартного использования, система событий может быть использована для создания кросс-модульной интеграции. Используя объект Event ($this->event), вы можете вызвать любое событие в любой точке, а также чтобы вызвать свои собственные события.

Представьте себе, что вы разрабатываете модуль для комментариев. Вы создаете событие на действие по отправке комментария, например, что позволит другим разработчикам модулей создать методы-обработчики событий для ваших и выполнить код без необходимости vQmod или OCMOD. Это будет гарантировать, лучшую стабильность системы и лучший потребительский опыт. Вы также можете использовать систему для регистрации и запуска собственных событий во время выполнения.

Класс событий определяется в файле system/engine/event.php, так что вы можете взглянуть на нее для дальнейшего использования.

Заключение

Освоение системы событий в OpenCart выгодно во многих отношениях! И я рекомендую использовать события вместо системы модификации vQmod или OCMOD везде, где это возможно. Это позволит сократить количество глюков и несовместимостей модулей и дополнений других разработчиков с вашими. Также это позволяет создавать и использовать межмодульные связи, так что вы можете сделать несколько модулей, работающих вместе красиво и элегантно.

comments powered by HyperComments

Не забудь подписаться на группы в социальных сетях, чтобы всегда быть вкурсе последних событий!

Вверх!

Меню блога

Категории блога

Облако тегов