Dateistruktur und Namenskonventionen
From Joomla! Documentation
Dieses Dokument informiert über die neuen Konventionen speziell für Joomla 4. Joomla 4 unterstützt aus Gründen der Abwärtskompatibilität auch die alten Namenskonventionen für Joomla 3. Wenn Joomla 3 und Joomla 4 gleichzeitig unterstützen werden soll, können weiterhin die Konventionen für Joomla 3 verwendet werden, die unter Dateistruktur und Namenskonventionen für Joomla 3 beschrieben sind.
Komponenten des Joomla-Kerns (und in der Tat im Allgemeinen im Joomla-Universum) folgen dem Model-View-Controller (MVC)-Designmuster. Dieses Muster trennt die Aktivitäten Datenerfassung (Model), Präsentation (View) und Benutzerinteraktion (Controller) einer Komponente. Eine solche Trennung ermöglicht es, Eigenschaften und Methoden eines Abschnitts zu erweitern oder zu überarbeiten, ohne dass zusätzliche Änderungen an den anderen Abschnitten erforderlich sind. Weitere Informationen dazu sind in den MVC-Tutorials zu finden, die für mehrere Joomla-Versionen verfügbar sind.
Das Dateiladesystem von Joomla ermöglicht es Entwicklern, mit separaten Dateien für Controller, Views und Models zu arbeiten, ohne sich um den Import der richtigen Datei an der richtigen Stelle kümmern zu müssen. Damit dies jedoch funktioniert, müssen bestimmte Namenskonventionen eingehalten werden.
Die Joomla-Plattform ist äußerst flexibel, und es ist möglich, in vielerlei Hinsicht von diesen Konventionen abzuweichen. Es wird dennoch empfohlen, wo immer möglich, Standardnamen zu verwenden, um die Lesbarkeit und Wartbarkeit zu erhöhen. Darüber hinaus wird die Plattform die vielen mühsamen Aufgaben zur Verwaltung von Klassen übernehmen, wenn die Dateien und Klassen einer Komponente korrekt benannt sind.
Reservierte Begriffe
Es gibt reservierte Wörter, die nicht in Namen von Klassen und Komponenten verwendet werden können.
Ein Beispiel ist das Wort "model" (in jedem Fall) für Modellklassen (außer "model", das der zweite Teil des Klassennamens sein muss)[1]. Da der erste Teil des Namens von Modellklassen derselbe ist wie der Controller-Klassenname, können Controller-Klassennamen auch nicht das Wort "Model" enthalten. Und aufgrund der Konventionen (auch wenn die Verletzung dieser Konventionen keinen Fehler erzeugt) müssen Controller-Klassennamen den Komponentennamen enthalten, so dass Komponentennamen auch nicht das Wort "Model" enthalten dürfen. Komponenten können also nicht "com_modelling" genannt werden. Falls doch, verletzen sie die Namenskonventionen und müssen einen anderen Basis-Controller-Klassennamen (oder andere Hacks) haben.
Installationspaket und tatsächlicher Ort von Dateien
Alle Joomla-Erweiterungen müssen als .zip-Installationsdatei gepackt werden. Nach der gebräuchlichsten Dateianordnung sollte das Paket in seiner Grundstruktur mindestens den admin-Ordner enthalten. Es kann zusätzlich (unter anderem) enthalten:
site
admin
Wenn die XML-Manifestdatei gemäß der Standardpraxis einrichtet ist, wird der Inhalt von site
in /components/com_{komponentenname}
installiert, während der Inhalt von admin
in /administrator/components/com_{komponentenname}
installiert wird (Hinweis: In diesen Pfaden ist der Komponentenname kleingeschrieben).
Der Ordner /site
In diesem Ordner befinden sich die Dateien für den Frontend-Teil der Komponente.
/site/forms
- Dieser Ordner enthält die XML-Formulare, die von
\Joomla\CMS\Form\Form
verwendet werden.
/site/tpl
- Dieser Ordner enthält die Ansichten, die im Template erscheinen sollen.
/site/tpl/{viewname}
- Dieser Ordner enthält die Dateien für die Ansicht {ViewName}. Hinweis: Der Pfad verwendet hier den Ansichtsnamen in Kleinbuchstaben.
/site/src/tpl/{viewname}/default.php
- Dies ist das Standard-Template für die Ansicht {ViewName}. In dieser PHP-Datei bezieht sich das Schlüsselwort
$this
auf die View-Klasse, zu der die Vorlage gehört.
/site/src
- Dieser Ordner enthält den auf Namensräume bezogenen PHP-Code für das Frontend der Komponente. Die Konventionen bezüglich der Namensräume werden unter Namensraum-Konventionen in Joomla 4 beschrieben.
/site/src/View
- Dieser Ordner enthält die verschiedenen Ansichten (Views) für die Komponente.
/site/src/View/{ViewName}/HtmlView.php
- Diese Datei ist der Einstiegspunkt für die Ansicht {ViewName}. Diese Klasse muss das Interface
\Joomla\CMS\MVC\View\ViewInterface
implementieren und erweitert die formatspezifische Klasse (wenn der Kern sie bereitstellt - wie z. B.\Joomla\CMS\MVC\View\HtmlView
) oder\Joomla\CMS\MVC\View\AbstractView
. Der Dateiname bezieht sich auf das Format, in dem die Ansicht geladen wird. Wenn zum Beispiel der URL-Parameterformat
aufformat=feed
gesetzt ist, wird die DateiFeedView
geladen.
/site/src/Model
- Dieser Ordner enthält zusätzliche Modelle, falls diese von der Anwendung benötigt werden.
/site/Model/{ModelName}.php
- Diese Datei enthält die Modellklasse
{ModelName}
. Diese Klasse muss die Basisklasse\Joomla\CMS\MVC\Model\BaseDatabaseModel
erweitern. Es ist zu beachten, dass die Ansicht mit dem Namen {ViewName} standardmäßig ein Modell mit dem Namen {ViewName} lädt, falls es existiert. Die meisten Modelle sind nach der Ansicht benannt, mit der sie verwendet werden sollen, aber dies ist keine Voraussetzung. Weitere Informationen sind unter Verwendung mehrerer Modelle in einer MVC-Komponente zu finden.
/site/src/Controller
- Dieser Ordner enthält zusätzliche Controller, falls von der Anwendung benötigt.
/site/src/Controller/{ControllerName}.php
- Diese Datei enthält die Controller-Klasse
{ControllerName}
. Diese Klasse muss die Basisklasse erweitern:\Joomla\CMS\MVC\Controller\BaseController
.
/site/src/Dispatcher
- Dieser Ordner enthält den Site-Dispatcher.
/site/src/Dispatcher/Dispatcher.php
- Diese Datei enthält den Site-Dispatcher. Er lädt die Sprachdateien, führt eine Komponentenzugriffsprüfung durch und ruft anschließend den Controller ab und führt ihn aus. Dabei führt er in Komponenten mit HTML-Ausgabe bei Bedarf auch Umleitungen aus.
Der Ordner /admin
Die Dateistruktur ist fast genau die gleiche wie im Ordner /site. Es sollte beachtet werden, dass die Ansicht, Modelle, Controller usw. des Site- und Admin-Teils standardmäßig vollständig voneinander getrennt sind und nichts miteinander zu tun haben - der Site-Teil und der Admin-Teil können als zwei verschiedene Komponenten betrachtet werden! Eine Ansicht im Ordner /admin kann ein gleichnamiges Gegenstück im Ordner /site haben, aber die beiden Ansichten haben nichts gemeinsam, außer ihren Klassennamen (obwohl sie unterschiedliche Namensräume haben werden, um sie zu trennen).
Es gibt zwei zusätzliche Ordner im Administrator-Verzeichnis:
/admin/services
- Dieser Ordner enthält nur eine Datei.
/admin/services/provider.php
- Diese Datei enthält eine anonyme Klasse, die
\Joomla\DI\ServiceProviderInterface
implementiert. Ihre Aufgabe ist es, den Dependency-Injection-Container zurückzugeben, der mit allen Factories versehen ist, die für den Betrieb Ihrer Komponente benötigt werden (in allen 3 Webanwendungen, in denen sie laufen dürfen).
/admin/src/Extension
- Dieser Ordner enthält nur eine Datei.
/admin/src/Extension/{ComponentName}Component.php
- Diese Datei ist die öffentliche Seite der Erweiterung. Sie ruft Daten aus dem Container ab, der in der oben genannten Provider-Datei erzeugt wurde, und stellt die entsprechenden Dienste zur Verfügung (zugänglich über
\Joomla\CMS\Application\CMSApplication::bootComponent()
). Diese Klasse wird von Modulen verwendet, um Zugriff auf die Komponentenmodelle zu erhalten oder um eine Komponente über Joomla laufen zu lassen, wenn eine Seite geladen wird (indem der Dispatcher abgerufen wird).
In einigen Fällen kann es sinnvoll sein, Klassen zwischen dem Website- und dem Admin-Teil der Komponente gemeinsam zu nutzen. Insbesondere Modelle können gemeinsam genutzt werden, um die Duplizierung von Modellcode zu vermeiden. Die Joomla-Plattform unterstützt diese Strategie. Beim Teilen von Code zwischen Site- und Admin-Anwendungen sollten die Klassen mit großer Sorgfalt entworfen werden, um die Möglichkeit auszuschließen, dass ein Site-Benutzer Admin-Aktionen ausführt.
- ↑ der Grund ist in der Funktion getName in der Datei libraries/src/MVC/Model/BaseDatabaseModel.php zu finden:
if (!preg_match('/Model(.*)/i', get_class($this), $r))