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

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

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

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

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

Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…

23 години ago

Як вибрати майстра для перетяжки меблів?

Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…

2 дні ago

Що краще вибрати для хостингу: сервер VPS Windows чи VPS Linux?

Вибір ідеального хостингу під свій сайт може бути досить заплутаною справою, особливо коли існує багато…

1 тиждень ago

Лоуренс Пітер

Щоб уникати помилок, потрібно набиратися досвіду; щоб набиратися досвіду, потрібно робити помилки Лоуренс Пітер  

2 тижні ago

Що таке Чорне СЕО (Black Hat SEO) — вся потрібна інформація

Коротке визначення Чорного SEO Чорне СЕО (або Чорна оптимізація) — це будь-яка практика, метою якої…

2 тижні ago

Права категорії C: кому вони потрібні та як їх отримати?

Отримання прав водія категорії C відкриває двері до професійної діяльності, пов'язаної з керуванням вантажними автомобілями.…

3 тижні ago