sales_order_save_commit_after事件触发两次?


8

我注册了sales_order_save_commit_after事件观察者,以在收到新订单时得到通知。此方法正常运行,但该事件以相同的顺序连续两次触发。

我的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_pay事件(在SO上找到),但这不是对我触发的。

Answers:


9

尝试使用sales_order_save_after代替,它会在订单保存在数据库中并返回完整的订单对象后立即触发

我不确定为什么会触发两次此事件。这是一个由Core/Model/Abstract.phpmethod 触发的事件afterCommitCallback,似乎Magento在Order模型上保存/提交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中

函数减去QuoteInventory(Varien_Event_Observer $观察者)

是magento如何处理这个问题的一个例子。



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

        //your code here...

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

    }
}

Bove代码对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.