Перейти к содержанию
sv2109

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

Рекомендуемые сообщения

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


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


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

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


 

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

буду признателен если отдельно выложите файлы, которые были изменены в пункте Установка

и небольшой пример как это можно применить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

буду признателен если отдельно выложите файлы, которые были изменены в пункте Установка

и небольшой пример как это можно применить

не знаете? или не хотите? ответ-то будет?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не знаете? или не хотите? ответ-то будет?

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

Извините, просто реально не хватает времени на все..

Это не есть какой-то готовый модуль, который можно установить в 2 клика и который после этого будет что-то делать. Это текстовый пример интеграции.

Мне казалось, там достаточно внятно описан процесс установки. Для установки необходимо скопировать все файлы и внести минимум изменений в файл index.php. Все, все установлено.

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

После этого его можно добавлять обработчики этого события из своих модулей. В описании описано как добавить такой обработчик, для этого нужно открыть файл контролера модуля в папке /catalog/controller/module/, можно свой модуль, можно для теста взять любой другой установленный и добавить туда 2 метода. Названия и примеры написаны в описании.

Пользователь cmd установил и у него все заработало. Если у вас что-то не получается напишите, пожалуйста последовательность ваших действий, может что не так делаете..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Пример применения есть в описании.. После слова "Использование:" начинается пример применения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

http://www.opencart...._download_id=29 вот тоже замена вкмоду

Не совсем.. Ответил в другой теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень красивое решение. Я признаться пошел простым путем: на сервере заказчика развернул в поддомене mysf.example.com вторую версию симфони, "рядышком" с установленной CMS OpenCart и некоторые задачи решаю на симфони, (главным образом администранивные и по обслуживанию), Ваш подход более универсален и мощнее. У меня выходит вроде "параллельной вселенной", у Вас непосредсвенное внедрение оной =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень красивое решение. Я признаться пошел простым путем: на сервере заказчика развернул в поддомене mysf.example.com вторую версию симфони, "рядышком" с установленной CMS OpenCart и некоторые задачи решаю на симфони, (главным образом администранивные и по обслуживанию), Ваш подход более универсален и мощнее. У меня выходит вроде "параллельной вселенной", у Вас непосредсвенное внедрение оной =)

Спасибо, хоть кто-то оценил :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

сделайте простую установку с примером как я просил - попробую отпишу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

сделайте простую установку с примером как я просил - попробую отпишу

То есть вы считаете что если у вас времени нету то у кого-то его вагон? :)) Было бы время давно бы уже сделал более простой и красивый инсталятор..

Ок.. постараюсь на днях выкроить пару часов и немного доделать, но не обещаю.

  • +1 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пошел немного другому пути в настоящее время. Остановил свои работы по подвешиванию обработчика событий.

Много времени уходит на сопровождению текущих проектов (главным образом больше объясняю пользователям, как успешно применять опенкарт и пишу по необходимости код интеграции к той или иной конфигурации 1С). Симфони впрочем использую не в виде отдельных компонент, а просто как параллельный блок кода: альтернативные задачи администрирования, построенные на базе бандлов Сонаты и создание консольных утилит.

Структура каталогов выглядит в общем случае так:

путь/к/корню/сайта/upload - тут и ниже код опенкарт

И в этом же каталоге структура каталогов симфони

путь/к/корню/сайта/app

путь/к/корню/сайта/src

путь/к/корню/сайта/vendor

путь/к/корню/сайта/web

и в конфиг-файле апача/нгинкса/лайти создается несколько "сайтов"

1) сайт собственно самого магазина

2) сайт - поддомен в домене магазина

И комфортно (у меня так), когда имеется доступ по SSH - посредством которых управляю консольными утилитами и кроном.

Консольные утилитки в каждом конкретном случае решают различные задачи: от регулярного обновления цен поставщика, до обмена с 1С разных версий.

В сущности, при таком подходе можно применять различные фреймворки, но СФ2 мне нравится это во первых, и очень удобно создавать законченные собственные бандлы, которые у меня "кочуют" от магазина к магазину, это во вторых. В третьих - данные бандлы лягут в основу свободных, которые со временем окажутся на гитхабе.

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

Активно применяется также входящая в систав СФ2, Доктрина2. БД и связи в ОпенКарте так то разобраны достаточно давно. И тут доктрина+утилиты+свои бандлы предоставляют хороший мощный подход.

Готовых решений я естественно не выложу. Как и многое не договариваю, зачем именно я так устраиваю все свои магазинчики по единому образу и подобию, каждый может решать сам :).

Зачем мне нужна своя вторая админка - думаю и так понятно. Она решает дополнительные задачи администрирования магазина не путем выискивания модулей (часто не совсем и трудных в реализации), а путем создания Бандлов и реализации нужной в них функциональности.

Идея моего подхода надеюсь понятна. Следующим бандл, который у меня в разработке - это "складской" учет. Надеюсь никого убеждать в необходимости качественного складского учета ни у кого нет. А существующие "решения" остаются к сожалению (пока) именно в скобках... А складской учет писать в виде модуля для Окарта не совсем верно, и вот почему:

1) такой модуль будет трудиться только с окарт

2) модуль в терминах окарта трудно пристроить для взаимодействия с различными бухпрогами

Использование бандлов Сф дает нам возможности бОлее широкие:

1) СФ код может работать в РАЗНЫМИ системами электронной торговли (опенкарт, екоммерце и так далее)

2) СФ код удобно "припиливать" к другим системам складского учета (даже версии 1С и те имеют свои особенности)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

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

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

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

Войти

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

Войти

  • Похожий контент

    • От sv2109
      В продолжение темы
      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 пользователей онлайн

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.