9

我有一个产品注册扩展,它在保存注册后调度一个事件。如果虚拟产品与注册产品相关,则另一个扩展使用该事件为虚拟产品生成优惠券。

我需要取回生成的优惠券的数据,以通过电子邮件发送给用户以及他们的产品注册详细信息。

有没有办法将观察者的数据返回到事件被调度的地方?

4

2 回答 2

26

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');
}

享受并玩得开心!

于 2012-11-07T20:18:37.473 回答
4

不,系统没有内置任何东西来执行此操作。Magento 约定是创建一个stdClassVarien_Object传输对象。

看一下block事件代码

#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

于 2012-11-07T20:23:31.463 回答