Возврат данных обратно диспетчеру из наблюдателя событий в Magento

У меня есть расширение для регистрации продукта, которое отправляет событие после регистрации. Другое расширение использует это событие для создания купона для виртуального продукта, если оно связано с зарегистрированным продуктом.

Мне нужно получить данные о сгенерированном купоне для отправки пользователю по электронной почте вместе с подробной информацией о регистрации продукта.

Есть ли способ вернуть данные от наблюдателя обратно туда, куда отправлено событие?

В Magento есть трюк для вашей цели. Поскольку вы можете передавать данные о событиях наблюдателям, например, модели продукта или категории, также можно создать контейнер, из которого вы можете получить эти данные.

Например, такие действия могут выполняться в диспетчере:

$couponContainer = new Varien_Object(); Mage::dispatchEvent('event_name', array('coupon_container' => $couponContainer)); if ($couponContainer->getCode()) { // If some data was set by observer... } 

Метод наблюдателя может выглядеть следующим образом:

 public function observerName(Varien_Event_Observer $observer) { $couponContainer = $observer->getEvent()->getCouponContainer(); $couponContainer->setCode('some_coupon_code'); } 

Наслаждайтесь и получайте удовольствие!

Нет, для этой системы ничего не создано. Соглашение Magento заключается в создании транспортного объекта stdClass или Varien_Object .

Взгляните на код блока событий

 #File: app/code/core/Mage/Core/Block/Abstract.php ... if (self::$_transportObject === null) { self::$_transportObject = new Varien_Object; } self::$_transportObject->setHtml($html); Mage::dispatchEvent('core_block_abstract_to_html_after', array('block' => $this, 'transport' => self::$_transportObject)); $html = self::$_transportObject->getHtml(); ... 

Поскольку self::$_transportObject – это объект, а объекты PHP ведут себя как ссылка, любые изменения, сделанные для объекта транспорта в наблюдателе, будут поддерживаться. Итак, в приведенном выше примере, если разработчик-наблюдатель сказал

 $html = $observer->getTransport()-setHtml('<p>New Block HTML'); 

Резервное копирование в системном блоке self::$_transportObject будет содержать новый HTML. Имейте в виду, что у нескольких наблюдателей будет возможность изменить это значение, а огонь наблюдателей порядка в Magento будет отличаться для каждой настроенной системы.

Второй подход, который вы можете предпринять, – использовать шаблон реестра Magento. Зарегистрируйте переменную перед dispatchEvent