¿El evento sales_order_save_commit_after se activó dos veces?


8

Registré un observador para sales_order_save_commit_afterque se le notificara el evento cuando llega un nuevo pedido. Esto funciona bien, pero el evento se dispara dos veces seguidas con el mismo orden.

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

¿Cómo puedo verificar si es la primera vez o qué otro evento sería mejor?

Actualizar

También probé el sales_order_invoice_payevento (que se encuentra en SO ) pero eso no se activa para mí.

Respuestas:


9

Intente usarlo sales_order_save_after, se activa justo después de que se guarda un pedido en la base de datos y devuelve el objeto de pedido completo

Por qué este evento se desencadena dos veces, no estoy seguro. Es un evento desencadenado por el Core/Model/Abstract.phpmétodo afterCommitCallback, parece que Magento está guardando / confirmando 2 conjuntos de datos diferentes en el modelo de pedido. Tal vez una vez que el pedido en sí y una vez el historial de estado.

¿Hay alguna diferencia entre los datos que se analizan en los 2 eventos que podrían dar una pista de dónde se llama?


1
Gracias sales_order_save_afterfunciona, pero lo usaré, sales_order_place_afterya que no se activa nuevamente por los cambios de back-end.
PiTheNumber

7

Si alguien todavía tiene problemas con esto, descubrí cómo magento se ocupa de esto.

En el método llamado, puede tomar el orden y establecer una bandera en él.

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

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

función subtractQuoteInventory (Varien_Event_Observer $ observer)

es un ejemplo de cómo magento trata esto.



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

        //your code here...

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

    }
}

El código Bove está funcionando para mí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.