Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

Событие в 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” должно появиться в списке событий в разделе “Разширения-События”

image.png

Если все так. То идем дальше.

Создаем сам обработчик события

Создаем файл 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.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...