Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

В связи с блокировкой банка QIWI оплата через сайт не возможна.
Для оплаты и получения дополнений просьба писать в личные сообщения 
Admin*у
или в Телеграмм https://t.me/pascha_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” должно появиться в списке событий в разделе “Разширения-События”

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.

Последние посетители 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.