Sales_order_save_commit_after ¿Evento activado dos veces?
-
16-10-2019 - |
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í.
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í.