sales_order_save_commit_after Ereignis zweimal ausgelöst?

8

Ich habe einen Beobachter für das sales_order_save_commit_afterEreignis registriert , der benachrichtigt werden soll, wenn eine neue Bestellung eingeht. Dies funktioniert einwandfrei, aber das Ereignis wird zweimal hintereinander mit derselben Reihenfolge 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 sales_order_invoice_payEreignis ausprobiert (auf SO gefunden ), aber das wird für mich nicht ausgelöst.

PiTheNumber
quelle

Antworten:

9

Versuchen Sie es sales_order_save_afterstattdessen. Es wird direkt ausgelöst, nachdem eine Bestellung in der Datenbank gespeichert wurde und das vollständige Bestellobjekt zurückgegeben wird

Warum dieses Ereignis zweimal ausgelöst wird, weiß ich nicht genau. Es ist ein Ereignis, das von einer Core/Model/Abstract.phpMethode ausgelöst wird afterCommitCallback. Es scheint, dass Magento 2 verschiedene Datensätze im Order-Modell speichert / festschreibt. Vielleicht einmal die Bestellung selbst und einmal die Statushistorie.

Gibt es einen Unterschied zwischen den Daten, die für die beiden Ereignisse analysiert werden, die möglicherweise einen Hinweis darauf geben, woher sie aufgerufen werden?

Sander Mangel
quelle
1
Vielen Dank sales_order_save_afterfunktioniert, aber ich werde verwenden, sales_order_place_afterda es nicht wieder durch Back-End-Änderungen ausgelöst wird.
PiTheNumber
7

Wenn jemand immer noch Probleme damit hat, habe ich herausgefunden, wie Magento damit umgeht.

In der aufgerufenen Methode können Sie die Bestellung annehmen und ein Flag darauf setzen.

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 / Katalogverzeichnis / Model / Observer.php

Funktion subtractQuoteInventory (Varien_Event_Observer $ Observer)

ist ein Beispiel dafür, wie Magento damit umgeht.

Magarusu
quelle
5

Ich habe die Veranstaltung in geändert sales_order_place_after. Das funktioniert gut.

PiTheNumber
quelle
0
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.

Anandan Dart
quelle