Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

OpenCart 3.x добавляем event, но событие не вызывается


neon009

Recommended Posts

Изучаю события в OpenCart. Столкнулся с проблемой: событие регестрируется, но событие не вызывается. 

В коде создаю модуль: (OpenCart/admin/controller/extension/module/helloworld.php)

<?php
class ControllerExtensionModuleHelloworld extends Controller
{
   private $error = array();



   public function index()
   { ... }
   protected function validate()
   {}
public function install()
{
       echo "instaledddddddddddddddddddddd";


   $this->load->model('setting/setting');
   $this->model_setting_setting->editSetting('module_helloworld', ['module_helloworld_status' => 1]);




       $this->load->model('setting/event'); //admin\view\template\common
       $this->model_setting_event->addEvent('my_event', 'admin/view/common/header/before', 'myevent/before_view');
}

public function uninstall()
{
    echo "uninstaled111111111111111111";


   $this->load->model('setting/setting');
   $this->model_setting_setting->deleteSetting('module_helloworld');

       $this->load->model('setting/event');
       $this->model_setting_event->deleteEventByCode('my_event');
}

(OpenCart/catalog/controller/event/myevent.php)

<?php
class ControllerEventMyevent extends Controller {
   public function before_view($eventRoute, &$data) {

        $eventRoute = str_replace('common/header', 'mypage/page', $eventRoute);

       echo "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";

       
   }
}

Обработчик не вызывется.'mypage/page' - валидный route 

Где я ошибся? помогите!

Змінено користувачем neon009
Надіслати
Поділитися на інших сайтах


31 минуту назад, neon009 сказал:

$this->model_setting_event->addEvent('my_event', 'admin/view/common/header/before', 'myevent/before_view');

В админке шаблон так подтягивается

return $this->load->view('common/header', $data);

Затем в методе view

$result = $this->registry->get('event')->trigger('view/' . $trigger . '/before', array(&$route, &$data, &$template));

Получается триггер view/common/header/before, а у тебя admin/view/common/header/before т.е. наверное admin/ лишнее

Надіслати
Поділитися на інших сайтах


31 минуту назад, i3bepb сказал:

$result = $this->registry->get('event')->trigger('view/' . $trigger . '/before', array(&$route, &$data, &$template));

а почему trigger? ведь везде addEvent...

может я не все понимаю...

 

а можно про метод view подробнее. по какому пути можно посмотреть пример. пожалуста!

Змінено користувачем neon009
Надіслати
Поділитися на інших сайтах


41 минуту назад, neon009 сказал:

а почему trigger? ведь везде addEvent...

Есть класс для работы с событиями system/engine/event.php, он собственно регистрирует событие, выполняет, unregister... что-то еще. Вот в нем есть метод trigger, оно же выполнение события.

 

47 минут назад, neon009 сказал:

а можно про метод view подробнее. по какому пути можно посмотреть пример. пожалуста!

Есть класс для автоматического подключения контроллера, модели, вида... Это файл system/engine/loader.php и в нем как раз метод view, этот метод по определенному пути ищет шаблон и собственно обрабатывает его. Дак вот в нем перед обработкой

 

51 минуту назад, neon009 сказал:

$result = $this->registry->get('event')->trigger('view/' . $trigger . '/before', array(&$route, &$data, &$template));

 

Вообще чтобы лучше все понять надо просто читать код по цепочки от точки входа index.php -> system/startup.php -> system/framework.php

Надіслати
Поділитися на інших сайтах


О событиях в опенкарте в научно-популярном виду с примерами где почитать можно?

Разработчик делает гайды по новым возможностям?

Понимаю, что лучше изучать прямо по коду движка, но все же.

Надіслати
Поділитися на інших сайтах

Разобрался! Вот рабочий пример. 

Распаковываем в папку OpenCart. В админке в меню Extensions->Extensions устанавливаем модуль HelloWorld. Перегружаем страницу. и вот в конце менб с лева должно появится Example extension.

 

Внимание! хоть и второй параметр в AddEvent по логике должен быть

admin/view/template/common/column_left/before

должно быть 

admin/view/common/column_left/before

я так понял что это справедливо для всех view's.

Пользуйтесь!

helloworld.zip

  • +1 1
Надіслати
Поділитися на інших сайтах


  • 5 months later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.