Magento: Order Status Änderungen behandeln
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.
- public function fetchOrderStatus(Varien_Event_Observer $observer){
- try{
- if (!Mage::registry('cartware_order_status')){
- Mage::register('cartware_order_status', $observer->getOrder()->getStatus());
- }
- }
- catch (Exception $e){
- Mage::logException("UNEXPECTED PROBLEM WIH REGISTER");
- Mage::logException($e);
- }
- return;
- }
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.
- public function checkOrderStatus(Varien_Event_Observer $observer){
- try{
- if(!Mage::registry('cartware_order_status')){
- return;
- }else{
- $orderStatus = Mage::registry('cartware_order_status');
- }
- }
- catch (Exception $e){
- Mage::logException("UNEXPECTED PROBLEM WIH REGISTRY");
- Mage::logException($e);
- }
- if ($orderStatus != $observer->getOrder()->getStatus() &&
- $observer->getOrder()->getStatus() == Mage::getStoreConfig('cartware_coupongenerator/general/state_trigger')){
- $this->_cartwareProcessOrder($observer->getOrder());
- }
- }