Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 22.04.2024)
460260
осіб
348
літаків
325
гелікоптерів
7236
танків
13904
ББМ
11736
артилерія
768
ППО
1046
РСЗВ
15812
машин
26
кораблі і катери
Використання обсервера контролера для відправки події в Мадженто
Опубліковано

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

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

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

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

 

 

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

 

 

Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *