我有一個產品註冊的擴展,它在保存註冊後調度一個事件。如果虛擬產品與註冊產品相關,則使用該事件爲虛擬產品生成優惠券。將數據返回給Magento的事件觀察員的調度員
我需要找回生成的優惠券上的數據,並通過電子郵件發送給用戶以及其產品註冊的詳細信息。
有沒有辦法將數據從觀察者返回到事件分派的地方?
我有一個產品註冊的擴展,它在保存註冊後調度一個事件。如果虛擬產品與註冊產品相關,則使用該事件爲虛擬產品生成優惠券。將數據返回給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
之前註冊一個變量非常好。謝謝。 – Ryan
@Ivan:我可以使用這種方法在觀察者中修改我的收藏。因爲修改集合並試圖從我的觀察者'返回$ this',集合保持不變。我正在與產品收集工作。如果可能,你可以簡要介紹一下 – zamil