Вопрос

Я зарегистрировал наблюдателя за 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); 
}

В приложении/code/core/mage/cataloginentory/model/xemver.php

Функция suptractquoteinentory (varien_event_observer $ stemver)

является примером того, как 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 с атрибуция
Не связан с magento.stackexchange
scroll top