将数据从Magento中的事件观察器返回给调度程序

6bc51xsx  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一个用于产品注册的扩展,它在保存注册后调度一个事件。另一个扩展使用该事件为与注册产品相关的虚拟产品生成优惠券。
我需要取回生成的优惠券上的数据,并通过电子邮件将其与产品注册的详细信息沿着发送给用户。
是否有方法将数据从观察器返回到事件被调度的位置?

az31mfrm

az31mfrm1#

Magento中有一个技巧可以满足您的需求。由于您可以将事件数据传递给观察者,如产品或类别模型,因此也可以创建一个容器,从中获取这些数据。
例如,这样的动作可以在分派器中执行:

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

观察者方法可以如下所示:

  1. public function observerName(Varien_Event_Observer $observer)
  2. {
  3. $couponContainer = $observer->getEvent()->getCouponContainer();
  4. $couponContainer->setCode('some_coupon_code');
  5. }

好好享受,玩得开心!

展开查看全部
fdbelqdn

fdbelqdn2#

不,系统中没有内置任何东西来做这件事。Magento约定是创建一个stdClassVarien_Object传输对象。
查看块事件代码

  1. # File: app/code/core/Mage/Core/Block/Abstract.php
  2. ...
  3. if (self::$_transportObject === null)
  4. {
  5. self::$_transportObject = new Varien_Object;
  6. }
  7. self::$_transportObject->setHtml($html);
  8. Mage::dispatchEvent('core_block_abstract_to_html_after',
  9. array('block' => $this, 'transport' => self::$_transportObject));
  10. $html = self::$_transportObject->getHtml();
  11. ...

由于self::$_transportObject是一个对象,而PHP对象的行为类似于引用,因此在观察器中对传输对象所做的任何更改都将被保留。

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

系统块代码self::$_transportObject中的备份将包含新的HTML。请记住,多个观察器将有机会更改此值,并且Magento中的观察器触发顺序将因每个配置的系统而异。
第二种方法是使用Magento的注册表模式。

展开查看全部

相关问题