Настройка Magento С Использованием Event/Observer

За 2 года работы с Magento я много раз видел, когда при изменении модуля под свои нужды разработчики часто меняли сам модуль (блок, модель, помощник), не используя возможности, предоставляемые самим Magento. Magento — продукт, который очень удобен для сторонних разработчиков в плане добавления и изменения базовой логики и дает большие возможности разработчикам, реализующим данную систему.

Для настройки Magento вы можете использовать методы перезаписи в блоках и модулях (это самый распространенный метод), но вы можете использовать и другой метод — создание наблюдателя и нового события.

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

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

Создание модуля описано в нескольких других статьях на Хабре, поэтому я не буду описывать полную структуру модуля, а ограничусь лишь самым необходимым.

Например: После успешного добавления товара на карточку мы хотим изменить стандартное поведение модуля оформления заказа.

Вместо перенаправления в указанное место верните данные json для модуля ajax. Создайте новую структуру модуля и добавьте ее в конфиг.

xml В Глобальный часть этого представляет собой фрагмент кода:

  
  
  
  
  
  
  
  
  
   

<global> <events> <checkout_cart_add_product_complete> <observers> <ajax_addtocart_complete> <type>singleton</type> <class>ajaxcart/observer</class> <method>addToCartComplete</method> </ajax_addtocart_complete> </observers> </checkout_cart_add_product_complete> </events> </global>

Давайте рассмотрим эту часть более подробно.



<events>

— указывает magento, что мы будем использовать собственное событие в своем

<type>

— задаем, как будет называться модель наблюдателя.

Вы также можете указать модель и объект

<checkout_cart_add_product_complete>

— указать какое событие прослушивать

<observers>

— в этом блоке мы определяем собственное событие

<ajax_addtocart_complete>

— создаем свое событие (любое имя, но лучше назвать как-нибудь понятно, чтобы потом не путаться).



<class>ajaxcart/observer</class>

— путь к модели, где будет находиться наш метод, указанный в событии

<method>addtocartcomplete</method>

— непосредственно сам метод в указанном выше классе.

То есть в этой части мы указали, что при возникновении «checkout_cart_add_product_complete» вам нужно будет вызвать метод addToCartComplete с помощью ajaxcart/observer. Далее мы создаем нашу модель в нашем новом модуле и добавляем туда метод.

<Эphp class My_Model_ObserverModel{ function addToCartComplete($observer){ Mage::getSingleton('checkout/session')->setNoCartRedirect(true); $response['sidebarcart'] = Mage::helper(‘helperName’)->renderSidebarCart(); Mage::app()->getFrontController()->getResponse()->setBody(Mage::helper('core')->jsonEncode($response)); } }

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

Также, например, я добавил вызов пользовательской функции, которая отображает блок Mage_Checkout_Block_Cart_Sidebar в html, а затем мы возвращаем этот html как json нашей функции javascript. Чтобы немного понять, как это работает, давайте посмотрим на событие, которое мы слушаем «checkout_cart_add_product_complete».

Когда товар добавляется на карту, вызывается публичная функция добавитьДействие() от Mage_Checkout_CartController. Если товарная позиция успешно добавлена, то она выполняется

Mage::dispatchEvent('checkout_cart_add_product_complete', array('product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse()) );

Что происходит на самом деле.

В этот момент все события для всех модулей, ожидающих checkout_cart_add_product_complete, собираются и выполняются по порядку.

Кроме того, все параметры, передаваемые через Mage::dispatchEvent, также передаются в ваш метод addToCartComplete. Тест, который вы получаете в текущем примере, — это сам добавленный продукт, а также объекты Response и Request. Чтобы точно знать, какие аргументы передаются нашему созданному событию, нам нужно найти вызов события, которое мы слушаем, и просмотреть дополнительные аргументы.

Следует отметить, что не всегда в Magento можно найти подходящее системное событие.

Иногда необходимая часть логики просто отсутствует, и тогда вам обязательно придется использовать переопределение блока или модели.

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

Теги: #magento #observer #events #php #CMS #php

Вместе с данным постом часто просматривают: