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.
<Flagbit_MyModule>
1.0.0
<Flagbit_MyModule>
Flagbit_MyModule_Model
Flagbit_MyModule_Model_Product
Der PHP-Code sähe dann ungefähr so aus:
(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.
<Flagbit_MySecondModule>
1.0.0
<Flagbit_MySecondModule>
Flagbit_MySecondModule_Model
Flagbit_MySecondModule_Model_Product
2. Erstellen der Klasse als Erweiterung der vorherigen Klasse.
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.
<Flagbit_MySecondModule>
true
local
<Flagbit_MyModule />
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.
0 Kommentare