2012-11-07 47 views
8

我有一個產品註冊的擴展,它在保存註冊後調度一個事件。如果虛擬產品與註冊產品相關,則使用該事件爲虛擬產品生成優惠券。將數據返回給Magento的事件觀察員的調度員

我需要找回生成的優惠券上的數據,並通過電子郵件發送給用戶以及其產品註冊的詳細信息。

有沒有辦法將數據從觀察者返回到事件分派的地方?

回答

24

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

享受和樂趣!

+0

之前註冊一個變量非常好。謝謝。 – Ryan

+1

@Ivan:我可以使用這種方法在觀察者中修改我的收藏。因爲修改集合並試圖從我的觀察者'返回$ this',集合保持不變。我正在與產品收集工作。如果可能,你可以簡要介紹一下 – zamil

3

不,沒有什麼內置到系統中這樣做。 Magento慣例是創建一個stdClassVarien_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