OpenCart Club

Разработка под Opencart

Событие в opencart 3

Думаю многие разработчики сталкивались с ситуацией, когда нужно выполнить какое-то действие при определенном событии на сайте. Многие сразу делают врезку через модификатор в нужный контроллер или модель со своей логикой. Но на мой взгляд это в корне не правильно, учитывая тот факт, что в опенкарт давно уже есть функционала событий который позволяет переопределить данные или выполнить свой скрипт в момент определенного события на сайте.

Предлагаю разобрать как все работает на реальном примере. Реализуем простую отправку данных о заказе на сторонний сервис.

Создаем модуль

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

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

Идем в папку 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');
}

Создаем файл шаблона модуля twig

Создаем файл 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">&times;</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.

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

Напишите

Ваш email никому не покажем