Magento XML-Konfiguration per Observer modifizieren

Erstellt am 16. Juli 2012

Magento XML-Konfiguration per Observer

Magento-XML-Configuration-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)

  1. <sales_order_save_after>
  2.        <observers>
  3.                <Ecos_api_model_order_observer>
  4.                       <type>singleton</type>
  5.                       <class>Ecos_Api_Model_Order_Observer</class>
  6.                       <method>salesOrderSaveAfter</method>
  7.                </Ecos_api_model_order_observer>
  8.         </observers>
  9. </sales_order_save_after>

Ein Rewrite auf gewohnte Weise (siehe folgendes Codebeispiel) schlug fehl.

  1. <ecos_api>
  2.     <rewrite>       
  3.         <order_observer>Cartware_Promo_Model_Order_Observer</order_observer>
  4.     </rewrite>
  5. </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.

  1. <controller_front_init_before>
  2.     <observers>
  3.         <cartware_change_the_node>
  4.              <class>cartware_promo/xml_observer</class>
  5.              <method>changeConfigNode</method>
  6.         </cartware_change_the_node>
  7.     </observers>
  8. </controller_front_init_before>
  9.  

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.

  1. const XML_PATH_SALES_ORDER_SAVE_AFTER = 'global/events/sales_order_save_after/observers/Ecos_api_model_order_observer/class';
  2.  
  3. public function changeConfigNode(){
  4.  
  5. /** left for testing
  6. Mage::log(
  7. Mage::app()->getConfig()
  8.                   ->getNode(self::XML_PATH_SALES_ORDER_SAVE_AFTER)
  9.                   ->asXML()
  10. );
  11. **/
  12.  
  13. /** actual node change **/
  14. Mage::app()->getConfig()->setNode(self::XML_PATH_SALES_ORDER_SAVE_AFTER, 'Cartware_Promo_Model_Order_Observer');
  15. }

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!



Kommentare

Keine Kommentare

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.