TYPO3 unterscheidet sich in einem Punkt besonders von vielen anderen Content Management Systemen auf dem Markt. Es ist fast grenzenlos erweiterbar - an jeder Stelle des Systems. Das macht es möglich, nur mit wenigen Handgriffen, sowohl das Kern-System, als auch die eingesetzten Extensions um neue Funktionalitäten zu erweitern.
Extensions fügen dem TYPO3-Kernsystem neue Funktionen hinzu, wie zum Beispiel die Fähigkeit News anzuzeigen. Allerdings stößt man dabei manchmal an die Grenzen der Extensions, da sie nicht immer genau die gewünschten Anforderungen abdecken. Daher ist es möglich eine eigene Extension zu schreiben. Die Erweiterung "kickstarter" dient dabei als Assistent und hilft auf den ersten Schritten zum fertigen Frontend-Plugin oder Backend-Modul.
Da der Weg zur ersten Extension nicht ganz einfach ist und TYPO3 viele Funktionen bereitstellt, von denen Sie dabei profitieren können, finden Sie hier eine detaillierte Anleitung zum Thema Extension-Entwicklung.
Ein Frontend-Plugin wird fast immer von der PHP-Klasse "tslib_pibase" abgeleitet. Diese Klasse enthält grundlegende Methoden um Label in verschiedenen Sprachen zu laden, Typolinks zu erstellen und vieles mehr.
Abgerundet wird die Funktionalität durch die statischen Methoden der Klasse "t3lib_div", welche Sie sich als Schweizer Taschenmesser von TYPO3 vorstellen können. Dies ist eine der ältesten Klassen von TYPO3 und enthält alle Methoden, die nicht unbedingt TYPO3-spezifisch sind.
Geladen wird ein Frontend-Plugin mit Hilfe der Klasse "t3lib_extMgm". Sie stellt die erforderlichen Methoden bereit um statische TypoScript-Dateien zu laden, Flexforms oder TCA-Felder zu definieren, oder um das Plugin zu Registrieren.
Initialisiert wird das Plugin mit folgendem Aufruf in der Datei "ext_tables.php" im Extension-Verzeichnis:
Die Klasse "t3lib_BEfunc" enthält eine Sammlung vieler wichtiger Methoden für das TYPO3-Backend. Für Datenbankoperationen steht zudem noch die Klasse "t3lib_DB" zur Verfügung.
Das fertige Modul wird anschließend mit der Klasse "t3lib_extMgm" geladen. Die Backend-Extension wird folgendermaßen initialisiert:
Beim TCA (Table Configuration Array) handelt es sich um das Herzstück von TYPO3. Er enthält den gesamten Aufbau der Datenbanktabellen, ihrer Beziehungen untereinander und Informationen über die Darstellung der Tabellenfelder in Backend-Formularen. Fast das gesamte Backend ist mit diesem Array verbunden. Selbst die Art und Weise, wie Seiten und Datensätze im Backend angezeigt werden, ist im TCA hinterlegt.
Mit Extensions kann man diesen TCA erweitern und manipulieren. Dies geschieht über die zwei Dateien "ext_tables.sql" und "ext_tables.php". Der Extension-Kickstarter erzeugt zudem die Datei "tca.php", welche die gesamte Beschreibung der einzelnen Tabellenfelder aus der "ext_tables.php" auslagert. Allerdings macht dieses Vorgehen Probleme beim Erweitern der Extension durch andere Extensions.
Benötigt eine Extension eigene Datenbank-Tabellen, muss lediglich das passende SQL-Statement in der Datei "ext_tables.sql" erstellt werden. TYPO3 parst diese Datei und erzeugt die Tabellen automatisch. Auch bestehende Tabellen können auf diese Weise erweitert werden. Mit folgendem Statement wird zum Beispiel die Tabelle "tt_news" um das Feld "new_field" erweitert:
Das neue Feld wird anschließend in der Datei "ext_tables.php" konfiguriert und dem TCA hinzugefügt:
Beim Installieren der Extension wird der Benutzer gefragt, ob die Änderungen in der Datenbank vorgenommen werden sollen. In der Datei "ext_tables_static+adt.sql" können Inhalte für die neuen Tabellen definiert werden. Auch hier gilt wieder der SQL-Syntax. Die Inhalte werden anschließend auch beim Installieren erzeugt. Ein gutes Beispiel dafür ist die Extension "static_info_tables".
Sie können die Frontend-Ausgabe von TYPO3 auf zwei verschiedene Arten mit TypoScript beeinflussen:
Jede dieser Konfigurationen kann in eine statische Datei ausgelagert und in einer Extension abgelegt werden. Diese Dateien werden anschließend in der Datei "ext_tables.php" eingebunden.
Mit folgendem Aufruf werden die Dateien für TypoScript Setup und Constants wie in der Abbildung zu sehen für ein manuelles Einbinden bereitgestellt:
Die Dateien müssen in dem angegebenen Verzeichnis liegen und wie folgt benannt werden:
Sollen die Dateien gleich beim Installieren der Extension geladen werden, müssen sie folgendermaßen benannt und einfach in das Hauptverzeichnis der Extension gelegt werden:
Die beiden Varianten unterscheiden sich lediglich dadurch, dass die Textdateien im Hauptverzeichnis automatisch für die gesamte TYPO3-Installation geladen werden, während die anderen nur dort im System geladen werden, wo sie im Backend aktiviert werden.
Mit Hilfe von PHP-Scripten ist es recht einfach möglich, die Klassen des Kern-Systems zu erweitern. So kann man neue Methoden implementieren oder bestehende überschreiben. Die Erweiterung kann auf verschiedenen Wegen geschehen. Nachfolgend werden die drei wichtigsten vorgestellt.
Eine "userFunc" ist nichts anderes als eine Klasse mit einer Methode, welche direkt im TypoScript-Setup eingebunden wird. Dieser Methode werden grundsätzlich immer zwei Parameter übergeben. Einer mit dem derzeitigen Content und eine mit der Konfiguration der userFunc.
Der Aufruf einer userFunc im TypoScript sieht zum Beispiel folgendermaßen aus:
Im Quellcode der PHP-Datei würden zum Beispiel folgende Zeilen stehen:
Hierbei zu beachten ist, welchen Rückgabewert die userFunc hat, wenn sie im TypoScript aufgerufen wurde. Oft ist es nur möglich, einen String zurück zu liefern - kein Array oder Objekt.
Viele Entwickler implementieren in ihren Extensions sogenannte Hooks. Das sind ein paar Zeilen Code, die es ermöglichen, dass man die Funktionsweise der Extension mit eigenen PHP-Dateien erweitern kann. Auch im TYPO3-Kern, welcher zum größten Teil auch aus Extensions besteht, sind solche Hooks verbaut.
Ein Hook sieht zum Beispiel so aus (Datei: class.tslib_fe.php):
Als Faustregel kann man sagen, dass Hooks überall dort Sinn machen, wo wichtige Prozesse in der Extension ausgeführt werden. Außerdem vor und nach dem Laden von Konfigurationen, Templates, usw, sowie vor der Ausgabe des erzeugten Contents.
Jede Extension sollte eine Schnittstelle zum Überschreiben von vorhanden oder hinzufügen von neuen Methoden besitzen. Am Besten jede die gleiche. Daher sind in fast jeder Extension die folgenden Zeilen in der Plugin-Datei zu finden:
Um auf die XCLASS-Methode zuzugreifen, müssen Sie folgende Zeilen in Ihre localconf.php schreiben:
Nun legen Sie eine Datei mit folgendem Inhalt in dem Verzeichnis "fileadmin/myhooks/" an und nennen sie "class.ux_tx_myext_pi1.php". Wichtig ist, dass sowohl die Datei, als auch die enthaltene Klasse den Namen der zu erweiternden Klasse mit dem Prefix "ux_" bekommen.
Bitte implementieren Sie diese Zeilen in jeder Datei Ihres Plugins oder Moduls. Nur so können andere Entwickler auch dann von Ihrer Extension profitieren, wenn diese nicht alle gewünschten Anforderungen erfüllt.
Nachdem Sie nun alle Möglichkeiten zur Erweiterung von Extensions und dem TYPO3-Frontend kennen gelernt haben, widmen wir uns doch mal dem Backend. Denn auch die Verwaltungsoberfläche eines Internetauftritts sollte aufgeräumt und intuitiv sein, damit sich zum Beispiel Redakteure gut darin zurecht finden. Für diesen Zweck gibt es mehrere Möglichkeiten, das Backend anzupassen.
Anders als bei den unter Kapitel 2.4 genannten Möglichkeiten können Sie mit TypoScript in der Page bzw. User TSConfig in das Backend-Verhalten und -Aussehen eingreifen. Dazu legen Sie einfach die folgenden zwei Dateien an:
Diese Dateien werden anschließend mit folgendem Aufruf in der "ext_localconf.php" eingebunden:
Durch diesen Aufruf werden die Dateien automatisch systemweit geladen, wenn die Extension installiert wird. Dabei ist zu beachten, dass die User TSConfig hauptsächlich nur für die Benutzer- oder Gruppen-Konfiguration genutzt wird, während die Page TSConfig für die Konfiguration der Module oder des TCA zuständig ist.
Um das Backend-Theme anzupassen reichen meist schon wenige Zeilen PHP-Code in der Datei "ext_tables.php" der eigenen Extension aus. So ist zum Beispiel mit folgendem Code möglich, das Login-Bild zu ändern. Existieren mehr als ein Bild in dem angegebenen Verzeichnis, so wird bei jedem Laden des Logins ein anderes angezeigt.
Im Backend selbst kann zum Beispiel die Breite des Menüs auf der linken Seite mit folgendem Aufruf geändert werden:
Mehr dazu finden Sie in der Core Documentation.
Natürlich können Sie auch auf die CSS-Definitionen des Backends zugreifen. Dazu legen Sie eine neue Stylesheet-Datei an, in welcher sie die definierten Anweisungen überschreiben und fügen diese mit folgendem Aufruf dem Header der Backend-Seiten hinzu: