Aufbau einer TYPO3 Extension: Dateien und Verzeichnisse

MVC-Konzept: Model - View - Controller

Eine TYPO3 Extension setzt das MVC-Konzept um. Dies bedeutet, dass zwischen Daten, Verarbeitung und Darstellung unterschieden wird. MVC bedeutet: 

  • Model – die Modellierung der Datenbank mit Tabellen und Abhängigkeiten sowie die objektorientierte Bereitstellung von Daten zur weiteren Verarbeitung. 
  • View – die Darstellungsschicht der Extension mit der Visualisierung der ausgelesenen und verarbeiteten Daten 
  • Controller – die Verarbeitung der Daten und eigentliche Rechenarbeit einer Extension 

Damit setzt TYPO3 mit den Sprachen Extbase und Fluid eines der Grundprinzipien der objektorientierten Programmierung um. Dies hat naturgemäß Auswirkungen auf den Aufbau einer TYPO3 Extension. Mit den letzten Versionen von TYPO3 ist es für Entwickler verpflichtend geworden, dass man sich bei der Anlage und bei der Programmierung einer Extension an eine klare Struktur von Verzeichnissen und Dateien hält. 

Die Verzeichnisstruktur einer TYPO3 Extension sieht im Allgemeinen wie im folgenden Beispiel aus – Abweichungen können sich ergeben, z. B. wenn man beim Aufbau einer Provider Extension keine Datenbank benötigt.

Struktur einer Extension

Exemplarischer Aufbau einer TYPO3 Extension:

 └── myextension
    ├── Classes
    |   ├── Controller
    |   ├── Domain
    |   |   ├── Model
    |   |   └── Repository
    |   └── ViewHelpers
    ├── Configuration
    |   ├── ExtensionBuilder
    |   ├── TCA            
    |   └── TypoScript
    ├── Documentation
    ├── Resources
    |   ├── Private
    |   |   ├── Language
    |   |   ├── Layouts
    |   |   ├── Partials
    |   |   └── Templates
    |   └── Public
    |       ├── Css
    |       ├── Js
    |       └── Icons
    └── Tests
        └── Unit
            ├── Controller
            └── Domain
                └── Model

Hier eine kurze Erklärung der Verzeichnisse aus der ersten Ebene: 

  • Classes – in diesem Verzeichnis findet die Modellierung, das Auslesen und die Verarbeitung der Daten statt 
  • Configuration – hier findet man die Konfiguration der Tabellen für die Datenbank. Zudem steht hier das TypoScript für die Extension 
  • Documentation – in diesem Verzeichnis befindet sich die gesamte Dokumentation einer Extension. Ab 2021 ist dies der einzige Speicherplatz, der in Github zentral gepflegt wird 
  • Resources – dieses Verzeichnis steht die Darstellungsschicht für eine Extension mit Fluid Templates und öffentlich zugänglichen Sourcen bereit 
  • Tests – in diesem Verzeichnis stehen Unit Tests für PHP, mit denen der korrekte Aufbau der Extension überprüft werden kann 

Dateien im Stammverzeichnis einer Extension

Im Stammverzeichnis einer Extension befinden sich mehrere Dateien, die zur korrekten Funktion einer Extension notwendig sind. Zudem gibt es hier optionale Dateien, die für die Konfiguration der Datenbank einer Extension notwendig sind.

ext_emconf.php 

Diese Datei muss im Stammverzeichnis einer Extension stehen. Die Informationen in dieser Datei dienen TYPO3 bei der Installation zur Überprüfung technischer Funktionen. So ist in dieser Datei vermerkt, mit welcher Version von TYPO3 diese Extension lauffähig ist. Auch die möglichen Versionen von PHP sind hinterlegt. Wichtige Informationen sind zudem, mit welchen Extensions es Konflikte geben kann und ggf. welche weiteren Extensions notwendig sind, um diese Extension zum Laufen zu bringen. 

Einige dieser Informationen sehen Sie im Backend Ihrer TYPO3 Installation. Der Titel und die Beschreibung einer Extension werden in der Übersicht aller Extensions im TYPO3 Backend angezeigt. Zudem erscheint dort der Stand und die Version einer Extension. 

Wenn eine Extension nicht zur Ihrer Version des TYPO3 Core passen sollte, geht dies auf die Angaben in dieser Datei zurück. 

Beispiel für den Aufbau einer Datei: 

 $EM_CONF[$_EXTKEY] = [
    'title' => 'IBK Provider Extension Webseite',
    'description' => 'Provider Extension für eine Webseite',
    'category' => 'plugin',
    'author' => 'Thomas Berscheid',
    'author_email' => 'thom@thomweb.de',
    'state' => 'stable',
    'uploadfolder' => '0',
    'createDirs' => '',
    'clearCacheOnLoad' => 0,
    'version' => '9.5.20',
    'constraints' => [
        'depends' => [
            'typo3' => '8.7.0-10.4.99',
        ],
        'conflicts' => [],
        'suggests' => [],
    ],
];

 

ext_localconf.php 

Über diese Datei steuert man die Plugins und weitere Konfigurationen, die in eine TYPO3 Extension eingebunden sind. Hier legt man fest, welche Plugins man im TYPO3 Backend zur Verfügung stellt. Ein Plugin regelt die Funktion einer Extension, z. B. die Anzeige eines Blogs innerhalb einer Seite. Den einzelnen Plugins kann man eine oder mehrere Actions zuweisen. Durch diese Konfiguration steuert man den Controller an und damit auch die entsprechenden Views. 

ext_tables.sql 

Diese Datei ist optional. Sie wird für das Funktionieren der Datenbank einer Extension benötigt. 
In dieser Datei speichert eine Extension den Aufbau der Tabellen, die sie für die Ablage ihrer Daten braucht. Auch die Verknüpfungen zwischen einzelnen Tabellen werden hier als SQL-Code gespeichert. 

Wenn Sie eine TYPO3 Extension installieren oder wenn Sie über das Admin Tool Ihre Datenbank überprüfen, wird diese Datei in jeder Extension aufgerufen und daraufhin überprüft, ob die Struktur der Datenbank mit dem hier gelisteten Code übereinstimmt. 

Beispiel für den Aufbau einer Datei: 

 #
# Table structure for table 'tx_ibkblog_domain_model_blog'
#
CREATE TABLE tx_ibkblog_domain_model_blog (
    name varchar(255) DEFAULT '' NOT NULL,
    email varchar(255) DEFAULT '' NOT NULL,
    titel varchar(255) DEFAULT '' NOT NULL,
    kurzfassung text,
    inhalt text,
    datum datetime DEFAULT NULL,
    link varchar(255) DEFAULT '' NOT NULL,
    kategorie int(11) unsigned DEFAULT '0',
    tags int(11) unsigned DEFAULT '0' NOT NULL,
);

ext_tables.php 

Diese Datei ist optional. Sie wird für das Funktionieren der Datenbank einer Extension benötigt. 

Zweck dieser Datei ist zum einen, die für die Extension benötigten Plugins zu registrieren. Zudem können über diese Datei weitere Module für das Backend eingeladen werden. Für die Konfiguration einer Extension über FlexForms gibt man hier die Einbindung der entsprechenden Datei an. Auch die Anbindung von Sprachdateien für das Backend lässt sich hier konfigurieren. 

Verzeichnisse in einer TYPO3 Extension

Classes

In diesem Verzeichnis spielt sich meist der eigentliche Kern einer Extension ab. Hier werden die Daten verarbeitet und für Darstellungen aufbereitet. Die einzelnen Verzeichnisse in der Reihenfolge ihrer Funktion: 

Domain – Repository 
Das Repository dient dazu, über die TYPO3 Extbase Schnittstelle mit der Datenbank zu kommunizieren. Über mehrere Methoden lassen sich standardisierte Abfragen aus der Datenbank ansprechen. Diese Methoden erlauben das Speichern, Verändern und Löschen von Daten. 

Domain – Model 
In den Dateien dieses Verzeichnisses werden die Daten aus den einzelnen Feldern einer Datenbank zur weiteren Verarbeitung zugänglich gemacht. Dazu werden die für die Extension definierten Objekte aufgebaut. Über einen Getter und Setter wird für jedes Feld eine Möglichkeit zum Auslesen und Schreiben bereitgestellt. Felder aus anderen Objekten bindet man hier über Verknüpfungen an. Zudem stellt man in diesen Dateien Methoden zum Speichern, Updaten und Löschen von Objekten bereit. 

Controller 
Hier erfolgt die eigentliche Verarbeitung der Daten. Was von Repository und Model bereitgestellt wurde, kann nun beliebig verarbeitet werden. Je nach Aufgabe der Extension erfolgt hier der Löwenanteil der Arbeit, die von der Extension bewältigt werden soll. Die verarbeiteten Daten werden hier an die Darstellungsschicht weitergeleitet. Einer Action ist dabei stets eine durch den Namen definierten Datei zugewiesen. Dabei handelt es sich m ein Fluid Template, das sich im Ordner Resources / Partials befinden muss. 
 

Configuration

In diesem Kapitel setzt sich zum einen die Modellierung der Daten fort. Zum anderen findet man hier das TypoScript für eine Extension. 

TCA 
Das Table Control Array legt fest, was mit den einzelnen Feldern der Tabelle einer Datenbank im Backend von TYPO3 geschehen soll. Hier legt man die Verknüpfung mit anderen Tabellen und Optionen der Darstellung fest. Optionen sind hier z. B. die Art des Editors, die Darstellung von Eingabefeldern im Backend und die Auswahl des HTML-Elements für ein Formular. 

TypoScript 
Dieses Verzeichnis beinhaltet den TypoScript Code, der für eine TYPO3 Extension benötigt wird. Im Falle einer Provider Extension steht hier also das gesamte TypoScript zur Konfiguration einer Webseite. Hier ist auch der Ort, in dem man Libraries einbinden kann.

Resources

In diesem Verzeichnis finden wir die Darstellungsschicht einer Extension. Dieses Verzeichnis gliedert sich in zwei Unterverzeichnisse: 

  • Private enthält alle Fluid Templates sowie Sprachdateien, die eine Extension für den Aufbau ihres HTML-Codes benötigt. 
  • Public enthält alle Elemente, die eine Extension zur Darstellung von Inhalten im Frontend benötigt. 

Der Unterschied zwischen beiden Verzeichnissen ist: Das Private Verzeichnis ist für Zugriffe von außen gesperrt und kann nur von der Extension selber ausgelesen werden. Das Public Verzeichnis hingegen ist von außen zugänglich.

Private

Hier finden Sie die Unterverzeichnisse des Private Verzeichnisses in der Reihenfolge ihrer Bedeutung: 

Templates 
Der Speicherort für die Fluid Templates einer Extension. Hier liegen alle Templates einer Extension, die von einer Action aus dem Controller heraus angesprochen werden. Beim Aufbau einer Provider Extension liegen hier alle Fluid Templates, die vom Setup und den Backend Layouts einer Webseite genutzt werden sollen. 

Layouts 
Das Verzeichnis für die Layout Dateien einer Extension. Diese Dateien bilden zum einen den Rahmen der HTML-Struktur einer Extension bzw. einer Webseite. Zum anderen legen die Layout Dateien fest, an welcher Stelle welches Fluid Element (Partial oder Section) eingebaut wird. 

Partials 
Teilbereiche von Vorlagen, mit denen die Daten einer Extension visualisiert werden sollen. Diese Fluid Elemente können wiederverwendet und in beliebig vielen Templates eingebaut werden. 

Language 
In diesem Ordner werden die Sprachdateien einer Extension abgelegt. Damit können Sie die Inhalte sowohl im Backend wie im Frontend steuern.

Public 

Hier finden Sie die Unterverzeichnisse des Public Verzeichnisses. Diese Verzeichnisse sind optional und dienen der Darstellung von Inhalten auf der Webseite 

CSS 
Alle Style Sheets für das Frontend der Webseite. 

JS 
Alle JavaScript Dateien für das Frontend der Webseite und die Funktionen der Extension. 

Thomas Berscheid ⧉ 24.05.2020
^