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 の規則では、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 でオブザーバーが起動する順序は、構成されたシステムごとに異なることに注意してください。

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

于 2012-11-07T20:23:31.463 に答える