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

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

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

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

Як зробити так, щоб ваш сайт показувався у блоці відповідей Google

Основний трафік на сайт з пошукових систем йде саме з органічної видачі. І тут дуже…

21 годину ago

Як програмісту самовдосконалитись та змінити себе на краще

Зміни — це щось таке, що завжди лякає і рідко буває простим та легким. Тим…

6 днів ago

Як додати свій текстовий блок перед формою коментарів у WordPress

Блок коментування у сайтах на системі CMS WordPress можна віднести до одних із найважливіших частин…

1 тиждень ago

Я знайшов ідеальний подарунок для сестри на 8 березня: історія мого пошуку

Привіт, мене звати Олег, і я хочу поділитися з вами своєю історією про те, як…

1 тиждень ago

Стильні квадратні годинники для чоловіків на кожен день

Корпус у вигляді квадрата – це не лише данина класиці, а й сучасний акцент у…

1 тиждень ago

Білл Гейтс

Люди завжди переоцінюють зміни за тиждень, і недооцінюють можливі досягнення за рік Білл Гейтс  

2 тижні ago