У меня есть расширение для регистрации продукта, которое отправляет событие после регистрации. Другое расширение использует это событие для создания купона для виртуального продукта, если оно связано с зарегистрированным продуктом.
Мне нужно получить данные о сгенерированном купоне для отправки пользователю по электронной почте вместе с подробной информацией о регистрации продукта.
Есть ли способ вернуть данные от наблюдателя обратно туда, куда отправлено событие?
В 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