我有一个用于产品注册的扩展,它在保存注册后调度一个事件。另一个扩展使用该事件为与注册产品相关的虚拟产品生成优惠券。我需要取回生成的优惠券上的数据,并通过电子邮件将其与产品注册的详细信息沿着发送给用户。是否有方法将数据从观察器返回到事件被调度的位置?
az31mfrm1#
Magento中有一个技巧可以满足您的需求。由于您可以将事件数据传递给观察者,如产品或类别模型,因此也可以创建一个容器,从中获取这些数据。例如,这样的动作可以在分派器中执行:
$couponContainer = new Varien_Object();Mage::dispatchEvent('event_name', array('coupon_container' => $couponContainer));if ($couponContainer->getCode()) { // If some data was set by observer...}
$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');}
public function observerName(Varien_Event_Observer $observer)
{
$couponContainer = $observer->getEvent()->getCouponContainer();
$couponContainer->setCode('some_coupon_code');
好好享受,玩得开心!
fdbelqdn2#
不,系统中没有内置任何东西来做这件事。Magento约定是创建一个stdClass或Varien_Object传输对象。查看块事件代码
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();...
# 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对象的行为类似于引用,因此在观察器中对传输对象所做的任何更改都将被保留。
self::$_transportObject
$html = $observer->getTransport()-setHtml('<p>New Block HTML');
系统块代码self::$_transportObject中的备份将包含新的HTML。请记住,多个观察器将有机会更改此值,并且Magento中的观察器触发顺序将因每个配置的系统而异。第二种方法是使用Magento的注册表模式。
2条答案
按热度按时间az31mfrm1#
Magento中有一个技巧可以满足您的需求。由于您可以将事件数据传递给观察者,如产品或类别模型,因此也可以创建一个容器,从中获取这些数据。
例如,这样的动作可以在分派器中执行:
观察者方法可以如下所示:
好好享受,玩得开心!
fdbelqdn2#
不,系统中没有内置任何东西来做这件事。Magento约定是创建一个
stdClass
或Varien_Object
传输对象。查看块事件代码
由于
self::$_transportObject
是一个对象,而PHP对象的行为类似于引用,因此在观察器中对传输对象所做的任何更改都将被保留。系统块代码
self::$_transportObject
中的备份将包含新的HTML。请记住,多个观察器将有机会更改此值,并且Magento中的观察器触发顺序将因每个配置的系统而异。第二种方法是使用Magento的注册表模式。