sales_order_save_commit_afterイベントが2回トリガーされましたか?


8

sales_order_save_commit_after新しい注文が届いたときに通知されるイベントのオブザーバーを登録しました。これは正常に機能しますが、イベントは同じ注文で2回続けてトリガーされます。

私のconfig.xml

        <sales_order_save_commit_after>
            <observers>
                <unique_sales_order_save_commit_after>
                    <type>singleton</type>
                    <class>mymodule/observer</class>
                    <method>export</method>
                </unique_sales_order_save_commit_after>
            </observers>
        </sales_order_save_commit_after>

初めてのイベントなのか、それとも他のどのイベントが良いのかを確認するにはどうすればよいですか?

更新

私もsales_order_invoice_paySOで見つかった)イベントを試しましたが、それは私にはトリガーされません。

回答:


9

sales_order_save_after代わりに使用してみてください、それは注文がデータベースに保存された直後にトリガーされ、完全な注文オブジェクトを返します

このイベントが2回トリガーされる理由はわかりません。これは、Core/Model/Abstract.phpメソッドからトリガーされるイベントafterCommitCallbackです。MagentoがOrderモデルで2つの異なるデータセットを保存/コミットしているようです。おそらく、注文自体とステータスの履歴です。

2つのイベントで解析されるデータの間に、どこから呼び出されたかの手掛かりとなるような違いはありますか?


1
sales_order_save_afterうまくいきましたがsales_order_place_after、バックエンドの変更によって再びトリガーされないので使用します。
PiTheNumber

7

まだこれで問題が発生している場合は、magentoがこれに対処する方法を見つけました。

呼び出されたメソッドでは、注文を取り、それにフラグを設定できます。

例:

public function export(Varien_Event_Observer $observer) {
    $order = $observer->getEvent()->getOrder();
    if($order->getExportProcessed()){ //check if flag is already set.
        return;
    }

    // your part of code

    //"setExportProcessed" can be called anything you want as it's getting set magically by magento on our $order object.
    $order->setExportProcessed(true); 
}

app / code / core / Mage / Cataloginventory / Model / Observer.php

関数subtractQuoteInventory(Varien_Event_Observer $ observer)

これは、magentoがこれを処理する方法の例です。


5

イベントをに変更しましたsales_order_place_after。これは正常に動作します。


0
public function sendEmail(Varien_Event_Observer $observer) {
    if(!Mage::registry('varien_event')){

        //your code here...

        Mage::register('varien_event',true);

    }
}

Boveコードは私のために働いています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.