Для кастомизации magento можно использовать перезапись методов в блоках и модулях (это самый распространенный способ), но можно воспользоваться и другим способом – это создание наблюдателя и нового события.
Для начала, если вы решили использовать механизм наблюдения, вам необходимо будет отключить компиляцию. Дальше лучше всего создать новый модуль, в котором вы будете дополнять или изменять стандартную логику, и определить в нем событие с наблюдателем. Создание модуля описано в нескольких других статьях на хабра, поэтому я не буду описывать полную структуру модуля, а ограничусь лишь самым нужным.
К примеру:
после успешного добавления продукта в карточку, мы хотим изменить стандартное поведение модуля checkout. Вместо переадресации в назначенное место, — вернуть json данные для ajax модуля.
Создаем новую структуру модуля и добавляем в config.xml в global часть вот такой вот кусочек кода:
<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>
Рассмотрим эту часть подробнее.
— указывает magento что мы будем в нашем использовать собственное событие<events>
— устанавливаем, как будет вызываться модель observer. Можно также указать model и object<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)); } }
Здесь мы указываем модулю checkout, что редиректить нас не нужно. Также для примера я добавил вызов кастомной функции которая рендерит блок Mage_Checkout_Block_Cart_Sidebar в html, а потом возвращаем этот html как json нашей javascript функции.
Что бы немного разобраться, как это работает, посмотрим на событие, которое мы прослушиваем «checkout_cart_add_product_complete».
Кода продукт добавляется в карточку,- вызывается public function addAction() из 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. Иногда оно просто отсутствует нужной части логики и тогда уже точно придется использовать переопределение блока или модели.
Пример довольно простой и примитивен — но зная, как работают события, можно использовать их во благо себе и другим разработчикам которые придут на ваше место.

