Как стать автором
Обновить

Кастомизация Magento с использованием Event/Observer

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

Пример довольно простой и примитивен — но зная, как работают события, можно использовать их во благо себе и другим разработчикам которые придут на ваше место.
Теги:
Хабы:
Всего голосов 17: ↑15 и ↓2+13
Комментарии9

Публикации

Истории

Работа

PHP программист
123 вакансии

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн