Думаю многие разработчики сталкивались с ситуацией, когда нужно выполнить какое-то действие при определенном событии на сайте. Многие сразу делают врезку через модификатор в нужный контроллер или модель со своей логикой. Но на мой взгляд это в корне не правильно, учитывая тот факт, что в опенкарт давно уже есть функционала событий который позволяет переопределить данные или выполнить свой скрипт в момент определенного события на сайте.
Предлагаю разобрать как все работает на реальном примере. Реализуем простую отправку данных о заказе на сторонний сервис.
Для того что бы мы могли создать событие нужно для начала создать самый простой модуль и повесить на его активацию установку нашего события.
Идем в папку admin/controller/extension/module и создаем файл mymodule.php со следующим содержимым:
<?php class ControllerExtensionModuleMymodule extends Controller { //Сработает только 1 раз при установке public function install() { $this->load->model('setting/event'); $this->model_setting_event->addEvent('sm-send-order-1c', 'catalog/model/checkout/order/addOrder/after', 'extension/module/mymodule/Send'); } //Сработает только 1 раз при удалении (удалит действие) public function uninstall() { $this->load->model('setting/event'); $this->model_setting_event->deleteEvent('sm-send-order-1c'); } private $error = array(); public function index() { $this->load->language('extension/module/mymodule'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('setting/setting'); if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('module_mymodule', $this->request->post); $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true)); } if (isset($this->error['warning'])) { $data['error_warning'] = $this->error['warning']; } else { $data['error_warning'] = ''; } $data['breadcrumbs'] = array(); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('text_extension'), 'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true) ); $data['breadcrumbs'][] = array( 'text' => $this->language->get('heading_title'), 'href' => $this->url->link('extension/module/mymodule', 'user_token=' . $this->session->data['user_token'], true) ); $data['action'] = $this->url->link('extension/module/mymodule', 'user_token=' . $this->session->data['user_token'], true); $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true); if (isset($this->request->post['module_mymodule_status'])) { $data['module_mymodule_status'] = $this->request->post['module_mymodule_status']; } else { $data['module_mymodule_status'] = $this->config->get('module_mymodule_status'); } $data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer'); $this->response->setOutput($this->load->view('extension/module/mymodule', $data)); } protected function validate() { if (!$this->user->hasPermission('modify', 'extension/module/mymodule')) { $this->error['warning'] = $this->language->get('error_permission'); } return !$this->error; } }
Весь код описывать не буду. Может в другой статье. А сейчас сосредоточимся на двух функцияю:
public function install() {$this->load->model('setting/event');$this->model_setting_event->addEvent('sm-send-order-1c', 'catalog/model/checkout/order/addOrder/after', 'extension/module/mymodule/Send');}
Тут мы регистрируем наше событие в момент установки модуля. Вызываем метод “addEvent” и передаем туда 3 параметра:
1.'sm-send-order-1c' - название события (произвольное) 2.'catalog/model/checkout/order/addOrder/after' - путь к контроллеру, модели, языку или загрузчику шаблона. У нас мы указали путь к модели создания заказа. Обратите внимание данный параметр состоит с двух частей 2.1. catalog/model/checkout/order/addOrder - непосредственно пусть к модели 2.2 after - время выполнения вашего нового события. Если after то ваш код будет выполнен уже после выполнения основного кода Функции "addOrder". Если вы укажете before - то сначала выполниться ваш код, а потом уже остальной код. Нас интересует выполнение уже после добавления заказа. Поэтому мы указали after. 3. 'extension/module/mymodule/Send' - путь к функции нашего контроллера где будет описана вся логика которую надо выполнить после создания заказа (отправка данных о заказе на сторонний сервис) Вторая функция - это функция удаления события. public function uninstall() { $this->load->model('setting/event'); $this->model_setting_event->deleteEvent('sm-send-order-1c'); }
Создаем файл mymodule.twig в папке admin\view\template\extension\module\mymodule.twig с кодом:
{{ header }}{{ column_left }}<div id="content"> <div class="page-header"> <div class="container-fluid"> <div class="pull-right"> <button type="submit" form="form-module" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button> <a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a></div> <h1>{{ heading_title }}</h1> <ul class="breadcrumb"> {% for breadcrumb in breadcrumbs %} <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> {% endfor %} </ul> </div> </div> <div class="container-fluid"> {% if error_warning %} <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }} <button type="button" class="close" data-dismiss="alert">×</button> </div> {% endif %} <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3> </div> <div class="panel-body"> <form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-module" class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label> <div class="col-sm-10"> <select name="module_mymodule_status" id="input-status" class="form-control"> {% if module_mymodule_status %} <option value="1" selected="selected">{{ text_enabled }}</option> <option value="0">{{ text_disabled }}</option> {% else %} <option value="1">{{ text_enabled }}</option> <option value="0" selected="selected">{{ text_disabled }}</option> {% endif %} </select> </div> </div> </form> </div> </div> </div></div>{{ footer }}
Здесь я думаю все всем понятно и по сути нечего объяснять. Дальше нужно создать файл переводов в папке admin\language\ru-ru\extension\module\mymodule.php с кодом:
<?php // Heading $_['heading_title'] = 'Мой новый модуль с событием отправки заказа'; $_['text_module'] = 'Модули'; $_['text_success'] = 'Настройки успешно изменены!'; $_['text_edit'] = 'Редактирование'; // Entry $_['entry_status'] = 'Статус'; // Error $_['error_permission'] = 'У вас недостаточно прав для внесения изменений!';
После создания нашего нового модуля идем и активируем его в разделе Дополнения-модули.
После этого если все сделано правильно наше событие “sm-send-order-1c” должно появиться в списке событий в разделе “Разширения-События”
Если все так. То идем дальше.
Создаем файл catalog\controller\extension\module\mymodule.php с кодом:
<?php class ControllerExtensionModuleSm1c extends Controller { public function Send(&$route, &$args, &$output) { $this->log->write(print_r($route,true)); $this->log->write(print_r($args,true)); $this->log->write(print_r($output,true)); } }
В функции ” Send” я просто вывел данные в журнал логов опенкарта. Но тут можно делать с данными все что угодно. В переменной $args будут все данные по заказу которые вы можете смело отправлять на сторонний сервис например при помощи CURL.
Спасибо всем за внимание.
Очень многие сталкиваются с проблемой вібора шаблона для своего нового…
В CMS Opencart 3 и в его русской зборке OcStore…
В CMS Opencart есть возможность создавать опции. Данный тип контента…
Ваш email никому не покажем
Сохранить моё имя, email и адрес сайта в этом браузере для последующих моих комментариев.