2012-11-07 1 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:このアプローチを使用して、オブザーバーでコレクションを変更できますか?コレクションを変更してオブザーバーから 'return $ this'をしようとすると、コレクションは同じままです。私は製品のコレクションを使って作業しています。可能であれば、簡単に説明できます – zamil

3

いいえ、これを行うためのシステムには何も組み込まれていません。 Magentoのコンベンションでは、stdClassまたはVarien_Objectトランスポートオブジェクトを作成します。

self::$_transportObjectのでブロックイベントコード

#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(); 
... 

を見てはオブジェクトであり、PHPオブジェクトが方法のような基準に振る舞う、観察者に移送オブジェクトに加えられた変更が維持されます。したがって、上記の例では、場合オブザーバ開発者は、新しいHTMLが含まれますバックアップし、システムのブロックコードself::$_transportObject

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

を言いました。 複数ののオブザーバーがこの値を変更する可能性があり、Magentoで注文したオブザーバーは、設定されたシステムごとに異なることに注意してください。

2つ目の方法は、Magentoのレジストリパターンを使用することです。変数を登録する前にdispatchEvent

関連する問題