Magento XML-Konfiguration per Observer

Kürzlich, bei dem Versuch in einem eigenen Modul einen 3rd-Party-Observer zu überschreiben, wollte dieses Vorhaben partout nicht klappen. Der Grund war, dass ein klassischer Magento-Rewrite nur bei Klassen klappt, die im Magento Namespace Format angegeben sind. In unserem Fall wurde der zu überschreibende Observer aber im PHP Standard Namespace angegeben.
(Ecos_Api_Model_Order_Observer)
- <sales_order_save_after>
- <observers>
- <Ecos_api_model_order_observer>
- <type>singleton</type>
- <class>Ecos_Api_Model_Order_Observer</class>
- <method>salesOrderSaveAfter</method>
- </Ecos_api_model_order_observer>
- </observers>
- </sales_order_save_after>
Ein Rewrite auf gewohnte Weise (siehe folgendes Codebeispiel) schlug fehl.
- <ecos_api>
- <rewrite>
- <order_observer>Cartware_Promo_Model_Order_Observer</order_observer>
- </rewrite>
- </ecos_api>
Zeit also eine geeignete Methodik zu verwenden, der XML-Konfiguration eine andere Klasse unterzuscheiben. Hierzu ist ein eigener Observer zu verwenden der beim Event “controller_front_init_before” dispatched, d.h. angestoßen wird.
- <controller_front_init_before>
- <observers>
- <cartware_change_the_node>
- <class>cartware_promo/xml_observer</class>
- <method>changeConfigNode</method>
- </cartware_change_the_node>
- </observers>
- </controller_front_init_before>
In der Methode “changeConfigNode” ermitteln wir den XML-Node und schieben eine andere Klasse unter. Da nur eine einzige Methode der zu überschreibenden Observer Klasse geändert werden soll, erweitert die untergeschobene Klasse den 3rd-Party-Observer und überlagert lediglich die zu ändernde Methode.
- const XML_PATH_SALES_ORDER_SAVE_AFTER = 'global/events/sales_order_save_after/observers/Ecos_api_model_order_observer/class';
- public function changeConfigNode(){
- /** left for testing
- Mage::log(
- Mage::app()->getConfig()
- ->getNode(self::XML_PATH_SALES_ORDER_SAVE_AFTER)
- ->asXML()
- );
- **/
- /** actual node change **/
- Mage::app()->getConfig()->setNode(self::XML_PATH_SALES_ORDER_SAVE_AFTER, 'Cartware_Promo_Model_Order_Observer');
- }
Ab jetzt wird also die Methode der eigenen Klasse aufgerufen. Natürlich ist diese Methodik auch beim Überschreiben von Blöcken, Controllern, beliebigen Models und config.xml Werten im allgemeinen verwendbar. Viel Erfolg!