我注册了一个观察者 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 事件(发现 所以)但这并不是我触发的。

有帮助吗?

解决方案

尝试使用 sales_order_save_after 相反,它在将订单保存在数据库中并返回完整订单对象后立即触发。

我不确定为什么要触发这一事件两次。这是从 Core/Model/Abstract.php 方法 afterCommitCallback, ,似乎Magento在订单模型上保存 /投入2个不同的数据集。也许曾经是订单本身,并且曾经是状态历史记录。

在两个事件上解析的数据之间是否有任何区别,这可能给出了何处的线索?

其他提示

如果有人仍然对此有问题,我发现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中

函数suptractQuoteInventory(varien_event_observer $ observer)

是Magento如何处理此事的一个例子。

我将活动更改为 sales_order_place_after. 。这很好。

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

        //your code here...

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

    }
}

BOVE代码对我有用。

许可以下: CC-BY-SA归因
scroll top