событие 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 ), но это не сработало для меня.

PiTheNumber
источник

Ответы:

9

Попробуйте использовать sales_order_save_afterвместо этого, он срабатывает сразу после сохранения заказа в базе данных и возвращает полный объект заказа

Почему это событие вызвано дважды, я не уверен. Это событие, вызванное Core/Model/Abstract.phpметодом afterCommitCallback, похоже, что Magento сохраняет / фиксирует 2 разных набора данных в модели Order. Возможно, один раз сам заказ и один раз статус истории.

Есть ли какая-либо разница между данными, анализируемыми по двум событиям, которые могут дать представление о том, откуда они вызываются?

Сандер Мангель
источник
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); 
}

В приложении / код / ​​ядро ​​/ маг / каталог инвентарь / модель / Observer.php

функция subtractQuoteInventory (Varien_Event_Observer $ наблюдатель)

пример того, как magento справляется с этим.

Magarusu
источник
5

Я изменил событие на sales_order_place_after. Это отлично работает.

PiTheNumber
источник
0
public function sendEmail(Varien_Event_Observer $observer) {
    if(!Mage::registry('varien_event')){

        //your code here...

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

    }
}

Код Bove работает для меня.

Анандан Дарт
источник