PHP / [Из песочницы] Кастомизация Magento с использованием Event/Observer

в 22:12, , рубрики: cms, Events, Magento, Observer, php, метки: , , , ,

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


Для кастомизации 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> 

Рассмотрим эту часть подробнее.

<events>

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

<type>

— устанавливаем, как будет вызываться модель observer. Можно также указать model и object

<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. Иногда оно просто отсутствует нужной части логики и тогда уже точно придется использовать переопределение блока или модели.

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

Автор: ServDev


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js