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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top