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

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

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

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

 

 

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

 

Share

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

Антуан де Сент-Екзюпері

Ніколи не втрачай терпіння — це останній ключ, що відкриває двері Антуан де Сент-Екзюпері   Читати далі

28/03/2024

Сомерсет Моем

Подорослішавши, ви збагнете, що світ стає стерпним за однієї умови: коли розумієш, що людський егоїзм… Читати далі

27/03/2024

Михайло Грушевський

Всі вчаться своєї рідної мови, а наша біда така, що треба вчитися її більше, ніж… Читати далі

26/03/2024

ТОП-5 покерних обмінників

Професійний покер – це численні турніри та великі гроші, що потребує правильного налаштування фінансових інструментів.… Читати далі

25/03/2024

Гай Юлій Цезар

Всі довкола прагнуть винищити ворогів, а не об'єднатися з друзями Гай Юлій Цезар   Читати далі

24/03/2024

Як вибрати оптимальний смартфон для дитини?

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

22/03/2024