rewrites

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.




    
        <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.

Michael Türk
Seit 2007 entwickelt und betreut Michael Türk Web-Applikationen und vorrangig Online-Shops für Flagbit. Er ist in diversen Magento Hackathons engagiert und Gründungsmitglied des Firegento-Vereins. Außerdem veranstaltet er als Zeremonienmeister das regelmäßig stattfindende E-Commerce Forum in Karlsruhe.

Hinterlasse einen Kommentar

2 Kommentare auf "Doppelte Rewrites für Models, Blocks und Helper"

Benachrichtige mich zu:
avatar

Sortiert nach:   neuste | älteste | beste Bewertung
Christian Münch
Gast
3 Jahre 5 Monate her

Hallo Michael,

danke für den Artikel. Ich denke vielen ist das gar nicht so bewusst was bei Rewrites alles passieren kann 🙂
Vielleicht ist mein alter Blog-Artikel über die Erkennung von Artikeln noch eine gute Ergänzung.

http://blog.muench-worms.de/n98-magerun-magento-rewrite-konflikte-mit-jenkins-testen/

Gruß

Christian

wpDiscuz
Weitere Beiträge zum Thema
Gutscheine in Magento Enterprise
Mehrere Datensätze gleichzeitig bearbeiten – mit der Zwischenablage
Fabian Lang zu Gast beim nächsten Magento Stammtisch
Flagbit auf der MagentoLive Germany in München