2011-10-28 10 views
3

問題を解決しようとしていますが、何の成功もありません。私は、Magento API注文情報リクエストでいくつかの追加情報を送付する必要があります。残念ながら、Magentoにはこれに関連するイベントはないようですので、そのクラスを上書きしてイベントを送信します。それは、私が$resultの配列を新しい情報で変更するときに、うまくいっています。しかし、うまくない部分は、変更された配列が元のディスパッチコードに戻って表示されることはありません。ここでMagentoイベントディスパッチング/ディスパッチ対象の観察/変更

は発送です:ここでは

class Company_Module_Model_Order_Api extends Mage_Sales_Model_Order_Api { 

    public function info($orderIncrementId) { 
     $result = parent::info($orderIncrementId); 
     $order = $this->_initOrder($orderIncrementId); 

     Mage::dispatchEvent("company_api_order_info_add", 
        array('result' => &$result, 'order' => &$order)); 
    // - I've tried with and without the ampersand 

     Mage::log($result['affiliate_text']); // Debugging 

     return $result; 
    } 
} 

はウォッチャーコードは次のとおりです。

class Company_Other_Model_Api 
{ 
    public function hookToSetAffiliate ($observer) { 
     $result = $observer->getResult(); 
     $order = $observer->getOrder(); 

     if ($order->getAffiliateCode()) { 
      $affiliate = Mage::getModel('affiliates/info') 
        ->load($order->getAffiliateCode()); 
      if (is_object($affiliate)) 
       $result['affiliate_text'] = $affiliate->getCode(); 
      } 

      Mage::log($result['affiliate_text']); // Shows up here 

      return $observer; 
     } 
    } 
} 

あなたは$resultが適切で来ていない理由を任意のアイデアを持っていますか?フックでは、正しく表示されますが、ディスパッチメソッドの次の行が表示されたときには'affiliate_text'は表示されません。ちょうどあなたの参照のための

おかげで、

JMAX

+0

ところで、 "is_object($ affiliate))"の呼び出しは必要ありません。あなたの設定が壊れていない限り、Mage :: getModelはあなたのモデルのインスタンスを常に返すべきです。それが有効なレコードであることを確認したい場合は、おそらく "if($ affiliate-> getId())"が必要なものです。 –

答えて

4

Magentoと同じルートをとることをお勧めします。

// Wrap array in an object 
$result = new Varien_Object($result); 

// Dispatch - No need for & as $result and $order are both objects and passed by ref 
Mage::dispatchEvent("company_api_order_info_add", array('result'=>$result, 'order'=>$order)); 

// Unwrap array from object 
$result = $result->getData(); 

Varien_Objectは配列アクセスを許可しますので、リスナーコードを変更する必要はありません。

0

は、私はそれを考え出しました。ここでは何が起こったのですか:配列参照はhookToSetAffiliateの変数に割り当てられたときに壊れました。そこで、配列を直接参照するようにコードを変更しました(アクセスを容易にするために変数を使用しないで)、それを修正しました。

JMax

関連する問題