Änderung des Auftragsstatus beobachten


8

Es scheint, dass standardmäßig kein Auftragsstatusereignis vorhanden ist. Wie gehen Sie normalerweise vor, um die Änderung des Auftragsstatus zu beobachten? Ich sehe zwei Möglichkeiten: a) Überschreiben Sie das Verkaufs- / Auftragsmodell, um Ihr benutzerdefiniertes Ereignis für eine Statusänderung zu erstellen. B) Beobachten Sie das Auftragsspeicherereignis und sehen Sie sich den Status dort an

Ist einer davon der richtige Weg oder gibt es eine bessere Option?

Edit: Danke für deine bisherigen Antworten. Die Situation ist etwas komplizierter. Ich möchte der Bestellung abhängig vom aktuellen Status Informationen hinzufügen. Hier ist das Problem: Im Ereignis save_before habe ich immer noch den alten Status und nicht jetzt den neuen Status, da im Verkaufs- / Auftragsmodell die Methode _beforeSave () wie folgt lautet:

parent::_beforeSave();
$this->_checkState();
//...

Das Ereignis wird also in verarbeitet, parent::_beforeSave();ABER der Bestellstatus wird anschließend tatsächlich in geändert $this->_checkState();(dies ist die automatische Änderung, z. B. wenn Sie eine Rechnung erstellen, wird der Status in die Verarbeitung verschoben, wenn noch keine Sendung vorhanden ist).

Ich kann das save_after-Ereignis auch nicht verwenden, da ich etw speichern möchte. bei der Bestellung und es würde wahrscheinlich alles kaputt machen, um einen Save im save_after-Ereignis aufzurufen.

Irgendwelche Ideen? Meine einzige Idee ist jetzt, das $this->_checkState();Verhalten in meinem save_before-Beobachter zu replizieren , um herauszufinden, wie der Zustand schließlich sein wird ...

Antworten:


11

Ich würde aus zwei Gründen dringend davon abraten, das Verkaufs- / Auftragsmodell zu überschreiben:

  1. Es ist immer besser, Ereignisse zu verwenden, anstatt sie neu zu schreiben.
  2. Neben den allgemeinen Ratschlägen, Ereignisse anstelle von Umschreibungen zu verwenden, ist es insbesondere keine gute Idee, eine so zentrale und wichtige Magento-Klasse zu überschreiben. Die Möglichkeit eines Konflikts mit einer anderen Erweiterung ist zu hoch.

Ich habe keine Idee für eine bessere Lösung - ich denke, es wäre absolut in Ordnung, das sales_order_save_afterEreignis zu beobachten und zu überprüfen, ob der Status geändert wurde.


Ich habe meine Frage aktualisiert - eine Idee dafür? Vielen Dank!
Mpaepper

4

Ich würde es vorziehen, den alten Zustand aus den Originaldaten des sales_order_save_beforeEreignisses zu speichern und dies im sales_order_save_afteroder zu überprüfen before, je nachdem, was Sie tun möchten.


2
Ich denke, Sie müssen sich nicht in das Ereignis _before einbinden, um den alten Status zu speichern. Sie können getOrigData()stattdessen verwenden: stackoverflow.com/a/8184430/719023
Simon

1
Ich bin sicher, dass sie nach dem Speichern neu eingestellt werden, denn wenn nicht, können Sie nicht sicher sein, ob sich am nächsten etwas geändert hat save(), aber ich finde keinen Ort, an dem dies geschieht
Fabian Blechschmidt

Ich habe meine Frage aktualisiert - eine Idee dafür? Vielen Dank!
Mpaepper

0

Ich finde es einfacher und besser, die setStateMethode zu überschreiben Mage_Sales_Model_Order:

protected function _setState($state, $status = false, $comment = '',
            $isCustomerNotified = null, $shouldProtectState = false)
    {
        // dispatch an event before we attempt to do anything
        Mage::dispatchEvent('sales_order_status_before', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));

        parent::_setState($state,$status,$comment,$isCustomerNotified,$shouldProtectState);

        Mage::dispatchEvent('sales_order_status_after', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));

        return $this;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.