За 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
-
Причины Сделать Редизайн Сайта
19 Oct, 24 -
Авогадро Закон
19 Oct, 24 -
Лексема
19 Oct, 24 -
Преимущества Регистрации На Youtube
19 Oct, 24 -
Радио Со Станциями, Записанными На Яве
19 Oct, 24 -
Враги Свободы
19 Oct, 24 -
Опыт Поиска Работы На Бирже Elance
19 Oct, 24