• Объявления

    • dinox

      Закрытый раздел разработчиков   21.08.2017

      У нас на форуме существует закрытый раздел для разработчиков в котором мы обсуждаем нюансы работы на нашем форуме, в каталоге дополнений и другие моменты которые интересны в большинстве случаев только разработчикам. На данный момент существует лишь 2 условия для попадания:
      1. Наличие промодерированного дополнения в нашем каталоге  2. Отсуствие варезной деятельности 
      Если эти правила выполнены, пишите запрос @ArtemPitov на попадание в раздел разработчиков

Инеграция компонента Event Dispatcher из фреймворка Symfony

   (0 отзывов)

1 изображение

Информация о файле

В продолжение темы

http://opencartforum...ная-реализация/

Сделано больше в учебных целях чтобы обратить внимание разработчиков на проблему отсутствия в данной CMS каких-либо механизмов расширения без правки кода движка напрямую или с использованием vqmod, что есть очень нехорошо и имхо очень тормозит развитие этой довольно неплохой CMS.

Что такое Event Dispatcher?

"Symfony Event Dispatcher — это PHP библиотека, представляющая собой легковесную реализацию шаблона проектирования Наблюдатель (Observer). Это хороший путь сделать ваш код гибче. Это также хороший путь сделать код пригодным для расширения сторонними разработчиками (разработка плагинов). Сторонний код прислушивается к специфическим

событиям путем создания обратных вызовов (callbacks), а диспетчер делает вызовы когда ваш код извещает эти события."

Статья об описании и использовании (немного устаревшей версии компонента) часть1 часть2

Что такое шаблон проектирования Наблюдатель (Observer) доступно описано тут

Документацию нового компонента можно найти тут

Установка:

1. Скопировать все с папки upload в корень магазина. Никакие файлы перезаписаны не будут

2. В файле index.php

после

require_once(DIR_SYSTEM . 'library/cart.php');

добавить

require_once(DIR_SYSTEM . 'library/event_dispatcher.php');require_once(DIR_SYSTEM . 'library/event.php');

перед

// Url$url = new Url($config->get('config_url'), $config->get('config_use_ssl') ? $config->get('config_ssl') : $config->get('config_url')); 

добавить

// Symfony Event Dispatcher$event_dispatcher = new EventDispatcher($registry);$event_dispatcher->loadListeners();$registry->set('event_dispatcher', $event_dispatcher);									   

Использование:

В нужном месте добавить событие, например в главном контроллере system/engine/controller.php

перед

extract($this->data);

добавить

$this->registry->get('event_dispatcher')->dispatch('controller.pre_render', new Event($this));

Эта строка оповещает диспетчер событий об новом событии 'controller.pre_render', вторым параметром передается объект собития (со ссылкой на этот объект для последующих манипуляций обработчиками). Третьим параметром можно передать массив с параметрами.

В конроллере своего модуля добавить метод listeners:

  public function listeners() {	return array(	  'controller.pre_render' => 'preRender'	);  }

который возвращает массив где ключ это событие, которое нужно слушать, значение - метод этого класса для обработки события

Добавляем метод preRender:

  public function preRender(Event $event) {	$controller = $event->getSubject();		if (isset($controller->data['informations'])) {		  unset($controller->data['informations'][0]);	}	  }

Первый параметр это объект события в котором хранится ссылка на объект вызвавший событие. Получаем объект и вносим изменения в массив data, в данном случае удаляем первый элемент из массива informations. Из объекта также можно получить информацию об шаблоне, слое, массиве children итд.

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

Мне кажется, если бы подобный механизм был добавлен в ядро то это был бы возможно идеальный вариант расширения без правки кода. По нескольким причинам:

1. Минимальное к-во кода и простота использования. Для подключения достаточно добавить несколько строк кода в index.php. Новое событие объявляется с помощью 1 строчки кода. Для обработки события нужно создать 2 простеньких метода в своем модуле.

2. Используется правильный ООП с использованием паттернов проектирования

3. Используется правильная реализация, так как это компонент Симфони, одного из самых качественных php фреймворков

4. Компоненты Симфони специально и разрабатывались с возможностью использовать их в сторонних приложениях, так так написаны с использованием Dependency Injection

5. Подобный подход использует CMF Drupal, одна из лучших на сегодня CMS. Восьмая версия Друпала, которая сейчас в разработке будет включать в ядре немало компонентов Symfony, в т.ч. компонент Event Dispatcher

Приглашаю всех до обсуждения на форуме!

Версии на которой тестировался код:

Opencart 1.5.3.1




Обратная связь

Чтобы оставить отзыв, создайте аккаунт или авторизуйтесь

Вы должны быть пользователем, чтобы оставить отзыв

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

Отзывов нет

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

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