evento sales_order_save_commit_after disparado duas vezes?


8

Registrei um observador para que o sales_order_save_commit_afterevento seja notificado quando um novo pedido chegar. Isso funciona bem, mas o evento é disparado duas vezes seguidas com o mesmo pedido.

Meu 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>

Como posso verificar se é a primeira vez ou qual outro evento seria melhor?

Atualizar

Eu também tentei o sales_order_invoice_payevento (encontrado no SO ), mas isso não é acionado para mim.

Respostas:


9

Tente usar sales_order_save_after, em vez disso, ele é acionado logo após um pedido ser salvo no banco de dados e retornar o objeto de pedido completo

Por que esse evento é disparado duas vezes, não tenho certeza. É um evento desencadeado pelo Core/Model/Abstract.phpmétodo afterCommitCallback, parece que o Magento está salvando / comprometendo 2 conjuntos de dados diferentes no modelo Order. Talvez uma vez que a ordem em si e uma vez o histórico de status.

Existe alguma diferença entre os dados analisados ​​nos 2 eventos que podem dar uma pista de onde eles são chamados?


11
Obrigado sales_order_save_afterobras, mas vou usar sales_order_place_aftercomo ele não é acionado novamente por alterações de back-end.
PiTheNumber

7

Se alguém ainda está tendo problemas com isso, descobri como o magento lida com isso.

No método chamado, você pode pegar o pedido e definir um sinalizador nele.

Ex:

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); 
}

No aplicativo / code / core / Mage / Cataloginventory / Model / Observer.php

função subtractQuoteInventory (Varien_Event_Observer $ observer)

é um exemplo de como o magento lida com isso.


5

Eu mudei o evento para sales_order_place_after. Isso funciona bem.


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

        //your code here...

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

    }
}

O código Bove está funcionando para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.