Doppelte Rewrites für Models, Blocks und Helper

Magento bietet einen standardisierten Mechanismus an, um Core-Funktionalitäten innerhalb von Kunden-Modulen zu überschreiben, sogenannte Rewrites. Die Definition dessen passiert innerhalb der config.xml innerhalb eines Moduls. Wir haben das hier beispielhaft am Produkt-Modul von Magento durchgeführt. <?xml version="1.0"?> <!– Pfad ~ app/code/local/Flagbit/MyModule/etc/config.xml –> <config> <modules> <Flagbit_MyModule> <version>1.0.0</version> </Flagbit_MyModule > </modules> <global> <models> <Flagbit_MyModule> <class>Flagbit_MyModule_Model</class> </Flagbit_MyModule> <catalog> […]

Zu den Kommentaren springen

Magento bietet einen standardisierten Mechanismus an, um Core-Funktionalitäten innerhalb von Kunden-Modulen zu überschreiben, sogenannte Rewrites. Die Definition dessen passiert innerhalb der config.xml innerhalb eines Moduls. Wir haben das hier beispielhaft am Produkt-Modul von Magento durchgeführt.

<?xmlversion="1.0"?><!-- Pfad ~ app/code/local/Flagbit/MyModule/etc/config.xml --><config><modules><Flagbit_MyModule><version>1.0.0</version></Flagbit_MyModule></modules><global><models><Flagbit_MyModule><class>Flagbit_MyModule_Model</class></Flagbit_MyModule><catalog><rewrite><product>Flagbit_MyModule_Model_Product</product></rewrite></catalog></models></global></config>

Der PHP-Code sähe dann ungefähr so aus:

<?php// Pfad ~ app/code/local/Flagbit/MyModule/Model/Product.php class Flagbit_MyModule_Model_Product extends Mage_Catalog_Model_Product
{// do something in here.}

(Nur der Vollständigkeit halber der Hinweis: Das Produkt-Modul per se zu überschreiben ist in aller Regel keine gute Idee.)

Doch was passiert, wenn man ein und dasselbe Model zwei Mal anpassen muss, beispielsweise innerhalb einer Community-Extension und einem kundenspezifischen Modul? Keine Option ist, den Code selbst zu verändern, weil dann Änderungen beim nächsten Modul-Update futsch sind. Also muss man Magento irgendwie beibringen, ein Model doppelt zu überschreiben. Aber wie?

Die Lösung ist relativ einfach: In unserem zweiten Modul setzen wir den Rewrite auf das gleiche Ausgangsmodel (das Core-Model für Produkte), erben von unserer ersten Klasse und sorgen dafür, dass unser zweites Modul nach dem ersten geladen wird.

1. Überschreiben der Klasse. Das sieht exakt aus wie oben im ersten Beispiel. Tut ja auch das gleiche.

<?xmlversion="1.0"?><!-- Pfad ~ app/code/local/Flagbit/MySecondModule/etc/config.xml --><config><modules><Flagbit_MySecondModule><version>1.0.0</version></Flagbit_MySecondModule></modules><global><models><Flagbit_MySecondModule><class>Flagbit_MySecondModule_Model</class></Flagbit_MySecondModule><catalog><rewrite><product>Flagbit_MySecondModule_Model_Product</product></rewrite></catalog></models></global></config>

2. Erstellen der Klasse als Erweiterung der vorherigen Klasse.

<?php// Pfad ~ app/code/local/Flagbit/MySecondModule/Model/Product.php class Flagbit_MySecondModule_Model_Product extends Flagbit_MyModule_Model_Product
{// do something different in here.}

3. Dafür sorgen, dass unser zweites Modul nach dem ersten geladen wird. Auf die Lade-Reihenfolge hat man in der Regel nur wenig Einfluss. Das einzige, was wir hier ausnutzen können, ist die Definition von Abhängigkeiten von Modulen. Sinnvollerweise lädt Magento das Modul zuerst, von welchem das neue Modul abhängt. Abhängigkeiten werden in der Aktivierungsdatei (bspw. Flagbit_MySecondModule.xml) im Ordner app/etc/modules definiert.

<?xmlversion="1.0"?><!-- Pfad ~ app/etc/modules/Flagbit_MySecondModule.xml --><config><modules><Flagbit_MySecondModule><active>true</active><codePool>local</codePool><depends><Flagbit_MyModule/></depends></Flagbit_MySecondModule></modules></config>

Fertig. Nun sollten wir dafür sorgen, dass statt des Original-Produkt-Models unser angepasstes Model aus unserem zweiten neuen Modul geladen wird, welches außerdem die Funktionalität unseres ersten Moduls beinhaltet.

PS: Tricky wird das ganze, wenn mehr als zwei Module daran beteiligt sind. Dann müsste man im zweiten Modul das erste per depends referenzieren und im dritten sowohl das erste als auch das zweite usw.. Das kann schon mal in Stress ausarten, daher hoffen wir einfach mal, dass das bei Euch nicht passiert.

Original gefunden auf http://www.mageblog.de: Doppelte Rewrites für Models, Blocks und Helper

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s