Domanda

Mi sono registrato un osservatore per l'evento sales_order_save_commit_after per essere avvisati quando un nuovo ordine arriva. Questo funziona bene, ma l'evento viene attivato due volte di fila 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 che altro evento sarebbe meglio?

Aggiorna

Ho provato anche l'evento sales_order_invoice_pay (trovato su SO ) ma che non viene attivato per me.

È stato utile?

Soluzione

Provare a utilizzare sales_order_save_after invece, è innescato subito dopo l'ordine viene salvato nel database e restituisce l'oggetto ordine completo

Perché questo evento viene attivato due volte, non sono sicuro. Si tratta di un un evento innescato dal metodo Core/Model/Abstract.php afterCommitCallback, sembra che Magento è il risparmio / commettendo 2 diversi set di dati sul modello dell'Ordine. Forse una volta che l'ordine stesso e una volta che la storia dello stato.

C'è qualche differenza tra i dati che vengono analizzati sui 2 eventi che potrebbero dare un indizio su dove si chiama da?

Altri suggerimenti

Se qualcuno continua ad avere problemi con questo, ho scoperto come offerte Magento con questo.

Nel metodo chiamato si può prendere l'ordine e impostare un flag su di esso.

Esempio:

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 / Modello / Observer.php

funzione subtractQuoteInventory (Varien_Event_Observer $ osservatore)

è un esempio di come offerte Magento con questo.

ho cambiato l'evento per sales_order_place_after. Questo funziona bene.

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

        //your code here...

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

    }
}

Il codice Bove sta lavorando per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top