Використання обсервера контролера для відправки події в Мадженто

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

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

Йдеться про подію 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();

 

 

Сподіваємося, що даний практичний приклад стане вам у нагоді!

 

This post was last modified on 16/04/2018 18:20

Останні пости

Генрі Форд

Людина має два мотиви поведінки — один справжній та інший, що гарно звучить Генрі Форд…

16/07/2024

Фрідріх Ніцше

Не треба додумувати надто багато. Так ви створюєте проблеми, яких не існувало Фрідріх Ніцше  

11/07/2024

Такий різний інвертор! Вибираємо між кондиціонерами Inverter, Inverter DC та Full DC

Літо в розпалі, а значить якраз час задуматися про покупку кондиціонера. Але як не загубитися…

06/07/2024

Омар Хайям

Справжній друг — це людина, яка в очі викаже тобі все, що про тебе думає,…

30/06/2024

Корисні поради щодо вибору розсувних дверей

Варто знати, що функціональність і дизайн працюють рука об руку, коли ви використовуєте розсувні двері.…

29/06/2024

Геракліт

Єдине, що постійне, — це зміни. Немає нічого постійного окрім змін. Усе плине, усе змінюється.…

23/06/2024