evento sales_order_save_commit_after attivato due volte?
-
16-10-2019 - |
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.
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.