sales_order_save_commit_after Ereignis zweimal ausgelöst?
-
16-10-2019 - |
Frage
Ich habe einen Beobachter für die registriert sales_order_save_commit_after
Ereignis zu benachrichtigen, wenn eine neue Bestellung eingeht. Dies funktioniert einwandfrei, aber das Ereignis wird zweimal in Folge mit derselben Bestellung ausgelöst.
Meine 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>
Wie kann ich überprüfen, ob es das erste Mal ist oder welches andere Ereignis besser wäre?
Aktualisieren
Ich habe auch das ausprobiert sales_order_invoice_pay
Ereignis (gefunden auf ALSO) Aber das wird für mich nicht ausgelöst.
Lösung
Versuchen Sie es zu verwenden sales_order_save_after
Stattdessen wird es gleich nach dem Speichern einer Bestellung in der Datenbank ausgelöst und gibt das vollständige Auftragsobjekt zurück
Warum dieses Ereignis zweimal ausgelöst wird, bin ich mir nicht sicher. Es ist ein Ereignis, das ausgelöst wird Core/Model/Abstract.php
Methode afterCommitCallback
, scheint, dass Magento 2 verschiedene Datensätze auf dem Auftragsmodell speichert / besitzt. Vielleicht einmal die Bestellung selbst und einmal die Statusgeschichte.
Gibt es einen Unterschied zwischen den Daten, die an den beiden Ereignissen analysiert werden, die einen Hinweis darauf geben könnten, woher sie gerufen werden?
Andere Tipps
Wenn jemand immer noch ein Problem damit hat, habe ich herausgefunden, wie Magento damit umgeht.
In der angerufenen Methode können Sie die Bestellung aufnehmen und ein Flag darauf einstellen.
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);
}
In App/Code/Core/Mage/Cataloginventory/Modell/Observer.php
Funktion subtractracteInventory (VIVIEN_EVENT_OBSERVER $ Observer)
ist ein Beispiel dafür, wie Magento damit umgeht.
Ich habe das Ereignis geändert auf sales_order_place_after
. Das funktioniert gut.
public function sendEmail(Varien_Event_Observer $observer) {
if(!Mage::registry('varien_event')){
//your code here...
Mage::register('varien_event',true);
}
}
Der Bove -Code funktioniert für mich.