L'evento sales_order_save_commit_after è stato attivato due volte?


8

Ho registrato un osservatore per la sales_order_save_commit_afternotifica dell'evento quando arriva un nuovo ordine. Funziona bene ma l'evento viene attivato due volte di seguito con lo stesso ordine.

Il mio 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>

Come posso verificare se è la prima volta o quale altro evento sarebbe meglio?

Aggiornare

Ho anche provato l' sales_order_invoice_payevento (presente su SO ) ma non è stato attivato per me.

Risposte:


9

Prova sales_order_save_afterinvece a utilizzarlo , viene attivato subito dopo che un ordine è stato salvato nel database e restituisce l'oggetto dell'ordine completo

Perché questo evento viene attivato due volte, non sono sicuro. È un evento attivato dal Core/Model/Abstract.phpmetodo afterCommitCallback, sembra che Magento stia salvando / eseguendo il commit di 2 diversi set di dati nel modello Ordine. Forse una volta l'ordine stesso e una volta la cronologia dello stato.

C'è qualche differenza tra i dati analizzati sui 2 eventi che potrebbero dare un'idea di da dove vengono chiamati?


1
Grazie sales_order_save_afterfunziona, ma lo userò sales_order_place_afterperché non è più attivato da modifiche del back-end.
PiTheNumber

7

Se qualcuno ha ancora problemi con questo, ho scoperto come il magento gestisce questo.

Nel metodo chiamato è possibile prendere l'ordine e impostare un flag su di esso.

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

In app / code / core / Mage / Cataloginventory / Model / Observer.php

funzione subtractQuoteInventory (Varien_Event_Observer $ observer)

è un esempio di come il magento gestisce questo.


5

Ho cambiato l'evento in sales_order_place_after. Funziona benissimo.


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

        //your code here...

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

    }
}

Il codice Bove funziona per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.