Kein Magento-Event für Statusänderung

Erstellt am 22. August 2012

Magento: Order Status Änderungen behandeln

no-magento-event-status-change

Magento bringt keinen passenden Event mit, um auf Änderungen des Bestellzustandes (Orderstatus) zu reagieren. Natürlich könnte man einfach eine Klasse überschreiben und dort einen Event auslösen (dispatch). Derartiges versucht man aber zu vermeiden, wenn es nur irgendwie geht. Es gibt in diesem Fall eine wesentlich elegantere Möglichkeit, die spätere Updates nicht gefährdet und den Magento-Core nicht verändert.


Hierzu wird der Event "sales_order_load_after" genutzt um den Status der Bestellung direkt nach dem Laden aus der Datenbank zu erfassen. Folgende Methode "fetchOrderStatus" zeigt das Vorgehen.

  1. public function fetchOrderStatus(Varien_Event_Observer $observer){
  2.     try{
  3.       if (!Mage::registry('cartware_order_status')){
  4.         Mage::register('cartware_order_status', $observer->getOrder()->getStatus());
  5.       }
  6.     }
  7.     catch (Exception $e){
  8.       Mage::logException("UNEXPECTED PROBLEM WIH REGISTER");
  9.       Mage::logException($e);
  10.     }
  11.     return;
  12.   }

Nachdem nun der Orderstatus in der Magento-Registry abgelegt ist, kann man  in einem weiteren Event "sales_order_save_after" erneut den Orderstatus holen und auf eine Änderung prüfen. Ist eine Änderung passiert (natürlich auch prüfbar auf einen bestimmten Status) kann nun die benötigte Logik ausgeführt werden.

  1. public function checkOrderStatus(Varien_Event_Observer $observer){
  2.     try{
  3.       if(!Mage::registry('cartware_order_status')){
  4.         return;
  5.       }else{
  6.         $orderStatus = Mage::registry('cartware_order_status');
  7.       }
  8.     }
  9.     catch (Exception $e){
  10.       Mage::logException("UNEXPECTED PROBLEM WIH REGISTRY");
  11.       Mage::logException($e);
  12.     }
  13.  
  14.     if ($orderStatus != $observer->getOrder()->getStatus() &&
  15.     $observer->getOrder()->getStatus() == Mage::getStoreConfig('cartware_coupongenerator/general/state_trigger')){
  16.       $this->_cartwareProcessOrder($observer->getOrder());
  17.     }
  18.   }


Kommentare

Gepostet am 16. Juli 2013 um 20:05 Uhr
Thanks. Very helpful.
Gepostet am 21. Januar 2014 um 23:38 Uhr
Great thinking!

I didn't use the registry, but I used singleton instead.
Just add <type>singleton</type> in your config file and save the orderstatus on load in a private variable.

And I think it's good to keep track of multiple orders in case of multiple orders changing in one time.
Gepostet am 23. Januar 2014 um 13:28 Uhr
Super Idee, darauf muss man kommen, es funktioniert perfekt, Vielen Dank.
Gepostet am 16. April 2015 um 11:26 Uhr
Nice, exactly what i needed!
Btw @ Mark: When you use singletons, you actually use the registry ;) just sayin

Kommentar schreiben

* - Pflichtangabe

Zertifizierungen

  • TYPO3 Certified Integrator
  • Magento Certified Developer
  • Magento Certified Frontend Developer
Kontakt

Cookies helfen uns dabei unsere Webinhalte zu verbessern und Ihnen die bestmögliche Erfahrung zu bieten. Mit der Nutzung der Webseite akzeptieren Sie die Verwendung von Cookies.