Использование обсервера контроллера для отправки события в Мадженто

При разработке в Мадженто вам могут понадобиться свои собственные события, и вы столкнетесь с тем, что система не имеет нужного для этого наблюдателя (обсервера). Вы начнете думать, что вам придется переписывать блок или что-то подобное. Однако существует и другое решение – вы можете использовать наблюдатель контроллера для отправки своих собственных событий.

Обычно события отправляются (происходит их диспетчеризация) в блоках и моделях – каждый из которых вызывается конкретным контроллером (в зависимости от того, где вы находитесь на сайте). Однако существует очень неясное событие, которое запускается внутри контроллера (каждый раз, когда вы переходите со страницы на страницу), и мы можем использовать обсервер для наблюдения за ним.

Речь идет о событии controller_action_predispatch, которое находится в app/code/core/Mage/Core/Controller/Varien/Action.php. Используя наблюдатель для этого события, мы можем проверить, какой controller/action (контроллер/действие) используется в данный момент на сайте. Теоретически это означает, что мы можем отправить наше собственное событие, когда используем определенное действие контроллера.

 

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

Итак, когда клиент добавляет товар в свою корзину, он будет использовать контроллер/действие checkout_cart_add, или addAction() контроллера Checkout/CartController.php. Поэтому, сначала мы создадим наблюдателя для проверки нашего предиспатча (predispatch, предварительная отправка) в файле config.xml нашего модуля:

 

<frontend>
 <events>
  <controller_action_predispatch>
   <observers>
    <add_event>
     <type>singleton</type>
     <class>module/observer</class>
     <method>addEvent</method>
    </add_event>
   </observers>
  </controller_action_predispatch>
 </events>
</frontend>

 

Итак, теперь у нас есть PHP-функция (метод), которую мы можем использовать для отправки нашего собственного события. Внутри этой функции в модели нашего модуля Model/Observer.php нам нужно следующее:

 

public function addEvent($observer)
{
  if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') {
    Mage::dispatchEvent('checkout_cart_product_add_before', $observer);
  }
  return $this;
}

 

 

Выше мы проверяем полное имя действия, которое должно быть равно действию checkout_cart_add (добавление товара в корзину). Если это так, мы можем отправить наше собственное событие, используя название dispatchEvent – в нашем случае checkout_cart_product_add_before.

Теперь мы знаем, что событие checkout_cart_product_add_before работает и мы можем добавить для него собственный наблюдатель. Добавим в файле config.xml новое событие и обсервер:

 

<frontend>
 <events>
  <controller_action_predispatch>
   <observers>
    <add_event>
     <type>singleton</type>
     <class>module/observer</class>
     <method>addEvent</method>
    </add_event>
   </observers>
  </controller_action_predispatch>
  <checkout_cart_product_add_before>
   <observers>
    <add_event>
     <type>singleton</type>
     <class>module/observer</class>
     <method>ourFunction</method>
    </add_event>
   </observers>
  </checkout_cart_product_add_before>
 </events>
</frontend>

 

 

Теперь нам нужно создать функцию для события обсервера, которая будет срабатывать каждый раз, когда покупатель будет добавлять товар в корзину. Поскольку мы используем контроллер и отправляем данные через POST, мы можем довольно легко получать данные о товарах в своей функции. Для этого можно использовать запрос:

 

$request = Mage::app()->getRequest()->getPost();
//или
$observer->getEvent()->getControllerAction()->getRequest();

 

 

Надеемся, что данный практический пример будет вам полезен!

 

Recent Posts

Возможна ли анонимность, конфиденциальность или приватность в Интернете?

Сегодняшний обзор посвящен людям, для которых важен вопрос конфиденциальности в Интернете и кто ценит свои…

3 дня ago

Как появился Pro Plan: путь от идеи до мирового успеха

Впервые о бренде Pro Plan услышали в 1986 году, когда он стал частью американской компании…

7 дней ago

Стефан Цвейг

Страх наказания хуже самого наказания (В наказании есть нечто определенное, оно все же лучше, чем…

1 неделя ago

Можно ли найти доступный хостинг в 2024 году?

Если вы планируете разместить веб-сайт в Интернете, очень важно найти для него быстрый и надежный…

2 недели ago

Зачем выбирать образование за границей: преимущества для будущего вашего ребенка

Учеба за границей уже давно ассоциируется с качественным образованием, новыми возможностями и множеством перспектив. Но…

2 недели ago

Как выбрать мастера для перетяжки мебели?

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

2 недели ago