Dieser Artikel ist für Einsteiger der TYPO3-Extension Programmierung geeignet, die “noch” unter TYPO3 4.2.X arbeiten und damit auf die Plugin-Basisklasse “tslib_pibase” angewiesen sind. In der kommenden TYPO3 4.3.0 Final wird man immernoch unter dieser Basisklasse entwickeln können, jedoch wird sie in Zukunft durch die fortschrittlichere Basisextension “extbase”, über die Ich in einem späteren Artikel berichten werde, vollständig abgelöst werden.
TYPO3 ist bekannterweise in PHP geschrieben und modular aufgebaut. Grundlegende Core-Funktionen werden in Klassen der Ordner t3lib und typo3 definiert. Der TYPO3-Core basiert dabei selbst auf zahlreichen systemeigenen Extensions, die sich im Ordner typo3/sysext befinden. Die wichtigen Funktionen zum TypoScript-Rendering (bzw. Frontend-Rendering) befinden sich z.B. in der systemeigenen Extension cms im Ordner tslib.
Der Extension-Manager ist als Backend-Modul aufrufbar und dient der Verwaltung lokaler Erweiterungen. Mit ihm können Erweiterungen aus dem Extension-Repository (TER) heruntergeladen, installiert und geladen werden. Für eine reibungslose Extensionentwicklung ist die Erweiterung „Extension Repository Kickstarter“ hilfreich. Im Kickstarter Wizard lassen sich schnell und einfach erste Voreinstellungen über die eigene Extension zusammenklicken. Dazu gehören z.B. ein eindeutiger Extension-Key und Grundeinstellungen wie Name, Extension-Kategorie (Frontend oder Backend) oder Beschreibung. Entwickelt man ein Frontend-Plugin, kann dieses über den Plugin-Name später vom Redakteur unter Content-Elements -> Plugins ausgewählt und in die Seite integriert werden. Zusätzlich können Datenbank-Tabellen für die Extension angelegt und konfiguriert werden. TYPO3 fügt diese Datenbank-Konfigurationen bei Fertigstellung der globalen Core-Variable (TCA – Table Configuration Array) hinzu. Dadurch können die erstellten Datenbankfelder nachträglich im Backend unter dem Modul List ausgewählt und editiert werden. Alle für die Extension notwendigen Daten, finden sich bei Abschluss in Dateien wie z.B. ext_localconf.php oder ext_tables.php wieder, welche im Verzeichnis typo3conf\ext in den entsprechenden Extension-Ordner, der den Namen des Extension-Key trägt, geschrieben werden. Um das Plugin dem statischen Template hinzuzufügen, welches letztendlich das Rendering initiiert, befindet sich in der ext_localconf nicht mehr als der folgende Methodenaufruf:
t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_extensionKey_pi1.php', '_pi1', 'list_type', 0); // add plugin to static template (uid 43) // localization of the t3lib_extMgm class file: t3lib/class.t3lib_extmgm.php
Das Grundskelett der Extension ist gelegt und bei Ausgabe im Frontend, erscheint eine vom Wizard festgelegte Standardausgabe des Plugins. Das Kern-Programm der Extension befindet sich in der Hauptklasse tx_extensionKey_pi1 in der Datei class.tx_extensionKey_pi1.php und muss natürlich für einen sinnvollen Zweck umprogrammiert werden:
require_once(PATH_tslib.'class.tslib_pibase.php'); class tx_extensionKey_pi1 extends tslib_pibase { var $prefixId = 'tx_extensionKey_pi1'; // Same as class name var $scriptRelPath = 'pi1/class.tx_extensionKey_pi1.php'; // Path to this script relative to the extension dir. var $extKey = 'extensionKey'; function main($content, $conf) { $this->conf = $conf; $this->pi_setPiVarDefaults(); $this->pi_loadLL(); $this->pi_USER_INT_obj = 1; $content = 'hello typo3 frontend'; return $this->pi_wrapInBaseClass($content); } /* your methods... */ }
Jede auf diese Art und Weise erstellte Extension-Klasse erweitert sich automatisch um die Klasse tslib_pibase, die als eine Art Basisklasse für Frontend-Plugins zur Verfügung steht. Ein kleines Beispiel dazu wäre die Frontend-Ausgabe der im Plugin erzeugten Ausgabe-strings. Die Main-Methode der Plugin-Klasse erhält den string, übergibt an die tslib_pibase Methode pi_wrapInBaseClass und gibt das Ergebnis davon schließlich zurück. Das Ergebnis ist ein string, der mit einem Div-Tag umgeben ist, der das Class-Attribut des Klassennamens (var $prefixId) trägt. Der Content wird also vorher in einer Variablen gesammelt und aus der Main-Funktion zurückgegeben anstatt einfach über echo/print.
Aus Sicherheitsgründen ist auch der Umgang mit gewöhnlichen PHP GET/POST-Variablen in der Frontend-Plugin-Entwicklung unerwünscht. Also bekommt jede Plugin-Klasse ein eigenes Array dafür zugeteilt, das in der Main-Methode mit möglichen Werten geladen wird ‘$this->pi_setPiVarDefaults()’. Das setzen von Werten erfolgt über den Befehl $this->prefixId['…'] = Wert. In der Klassen-Var ‘$prefixId’ steht der Klassen-Name und in den Klammern steht ein beliebiger Array-Key. Der Abruf erfolgt über $this->piVars['…']. Über $this->pi_loadLL() wird in der Main-Methode die Sprachdatei der Extension geladen. Der Aufruf der Labels im XML-Array erfolgt mit $this->pi_loadLL(‘label’). Um die Extension auch extern konfigurieren zu können, kann man eine setup.txt anlegen. Die Konfigurationen lassen sich in der setup.txt in der Sprache TypoScript vornehmen (plugin.tx_extensionKey_pi1{…}) und in der Klasse mit $this->conf auslesen.
TYPO3 Project-Coding-Guidlines
Beim entwickeln eigener Extensions, stößt man nach kurzer Zeit auf die Project-Coding-Guidelines von TYPO3. Am Beispiel einer einfachen SQL-Anfrage, kommt die DBAL-API (database abstraction layer – application programming interface) des TYPO3-Cores zum Einsatz. Dahinter verbirgt sich eine DBAL-Extension, die die Core-Klasse t3lib_db derart erweitert, dass TYPO3 auch mit anderen Datenbank-Systemen als MySQL kompatibel ist. Folgende Abbildung zeigt einen Vergleich zwischen einem konventionellen und einem DBAL-konformen Datenbankzugriff für TYPO3:
// ordinary database access with mySQL sheme: $query = 'SELECT * FROM tx_table WHERE pid=1 ORDER BY sorting'; $res = mysql_query($query, $handle); // TYPO3-database access with dbal-api: $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_table', 'pid=1', '', 'sorting');
Natürlich müssen auch andere MySQL-Funktionen wie INSERT oder UPDATE an die DBAL-API angepasst werden. Die dafür notwendigen Richtlinien, sind online in der Core Documentation nachzulesen: Project-Coding-Guidelines
Jim
