Pregunta

Registré un observador para el sales_order_save_commit_after El evento se notificará cuando entra un nuevo pedido. Esto funciona bien, pero el evento se activa dos veces seguidos con el mismo pedido.

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_pay evento (encontrado en ASI QUE) Pero eso no se desencadena para mí.

¿Fue útil?

Solución

Intenta usar sales_order_save_after En cambio, se activa justo después de guardar un pedido en la base de datos y devuelve el objeto de pedido completo

Por qué este evento se activa dos veces, no estoy seguro. Es un evento desencadenado de Core/Model/Abstract.php método afterCommitCallback, parece que Magento está guardando / cometiendo 2 conjuntos de datos diferentes en el modelo de pedido. Quizás una vez el orden 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 donde se llama?

Otros consejos

Si alguien todavía está teniendo problemas con esto, descubrí cómo Magento trata con esto.

En el método llamado puede tomar el pedido y establecer un indicador 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 SINTRACTQUOTEINVERORY (VARIEN_EVENT_OBSERVER $ Observer)

es un ejemplo de cómo Magento trata con esto.

Cambié el evento a sales_order_place_after. Esto funciona bien.

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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top