Nachdem hier gefragt wurde wohin die ganzen Dateien eigentlich gehören werde ich dazu eine kleine Einführung geben.
Magento arbeitet im Hintergrund mit einem MVC-System und nutzt Autoloading um benötigte Klassen automatisch zu finden und zu laden.
Das ganze führt zu einfachen Regeln wo Dateien hingehören, so dass man mit einem Klassennamen wie Mage_Core_Model_App oder einem Aufruf von Mage::getModel(‘core/app’) direkt sagen kann wo die entsprechende Datei (in diesem Falle app/code/[local|community|core]/Mage/Core/Model/App.php) liegt.
Allgemeines
Zuerst sollte man wissen das Magento, abgesehen vom ganz tiefen Framework-Kern, aus Modulen besteht.
Jedes Modul besteht aus einem Ordner im entsprechenden Paketverzeichnis, das in app/code/ in einem der drei Ordner local, community oder core liegt.
Diese drei Ordner sind gedacht um lokal Core-Dateien zu überschreiben, ohne den Core selber anzutasten.
Magento sucht nach Dateien in der Reihenfolge app/code/local, dann app/code/community und zuletzt app/code/core.
Wenn wir also ein eigenes Modul anlegen, z.B. Mymodule im Paket Mypackage, können wir das unter app/code/local/Mypackage/Mymodule machen.
Im großen und ganzen gibt es drei verschiedene Kategorien von Dateien: XML-Konfigurationsdateien, PHP-Klassendateien und Templates.
XML-Konfigurationsdateien
Diese Dateien definieren zum Beispiel welche Controller, Blocks, Helper und Models ein Modul enthält.
Das wichtigste an dieser Stelle ist die Ladereihenfolge, sofern man irgendwo in diese Dateien eingreifen will oder etwas ändern möchte.
Als erstes wird app/etc/local.xml geladen um die Datenbankkonfiguration zu bekommen. Danach werden die Modulspezifischen Konfigurationsdateien (z.B. app/code/core/Mage/Core/etc/config.xml) und am ende nochmals die local.xml. An dieser Stelle kann man Änderungen einfügen, die auf jeden Fall beachtet werden (danke hier nochmal an Vinai).
Konfigurationsdateien liegen sonst immer im Ordner etc eines Modules.
PHP-Klassendateien
Simpel gesagt: bis auf die index.php und die Templates hat man nur Klassen in Magento, keine regulären Dateien.
Es wird immer mit entsprechenden Instanzen von Controllern, Models, etc… gearbeitet.
Mithilfe des vorhin schon angesprochenen Autoloading läd Magento die Klassen, und zwar nach einem ganz einfachen Prinzip: Der Klassenname wird genommen, alle _ durch / ersetzt, alle Parts mit ucfirst bearbeitet so dass jeweils der erste Buchstabe groß geschrieben wird, ein .php angehängt und dann nacheinander versucht diese Datei erst aus app/code/local, dann app/code/community und zuletzt aus app/code/core einzubinden.
Die Klasse Mage_Core_Model_App hat also die entsprechende Datei: app/code/core/Mage/Core/Model/App.php.
Mage_Core_Model_App_Area lässt sich in app/code/core/Mage/Core/Model/App/Area.php finden.
Das Prinzip gilt für alle Klassen in Magento, wenn man also eine Klasse kennt und sich deren Implementierung anschauen will, findet man darüber sofort die Datei.
Funktionen wie Mage::getModel und Mage::helper werde ich übrigens in meinem nächsten Post ansprechen, kommt noch heute oder morgen
Bleibt noch die Frage wo wir unsere Dateien im Modul speichern:
Models im Ordner Model, Helper im Ordner Helper, Controller im Ordner (na, wer ahnt es?) controllers (ja, eine komische Ausnahme…), Konfigurationsdateien im Ordner etc, Blöcke in Block und Installationsskripte im Ordner sql.
Templates
Das einzige was nicht im Modul-Ordner landet (abgesehen von der Modul-Datei in app/etc/modules) sind die Templates.
Wie das Templating funktioniert findet man z.B. hier: http://t3n.de/magazin/einfuhrung-magentos-layout-xml-magento-layouts-griff-224023/
Wo die Dateien im Endeffekt liegen ist soweit egal, da diese keinen zwingenden Konventionen unterliegen.
Klassendateien für eingebundene Blocks wiederum sind auch ganz einfach zu finden: nehmen wir den Blocktype page/html_toplinks. Dieser resultiert in app/code/core/Mage/Page/Block/Html/Toplinks.php.
Auch hier wird wieder entsprechend umgeschrieben, wenn man das verstanden hat, ist es ganz einfach entsprechende Blockklassen zu finden.
Soweit, so gut.
Ich hoffe dieser Post hilft die Struktur hinter den Klassennamen zu verstehen. Wer Fragen hat fragt einfach ![]()
Im nächsten Post gehe ich dann genauer auf Mage::getModel(), Mage::helper(), Mage::app(), etc… ein.
thebod
Ich lese immer Magneto (von X-Men) statt Magento. Just saying…