Auf dieser Seite dokumentiere ich die Entwicklung meiner ersten "großen" Extension für TYPO3: sm_employeelist.
Meine Vorgehensweise lässt sich wie folgt gliedern:
Die Extension soll grob zusammengefasst die folgenden Funktionen bereitstellen.
Die Extension sm_employeelist bildet die Grundlage für einige weitere Extensions, die ich noch entwickeln werde. Diese sind im folgenden ERM bereits enthalten. Für die eigentliche Extension ist jedoch nur der rot kenntlich gemachte Bereich interessant.
Die Extension wird zunächst grundlegend im Extension Kickstarter erstellt. Eine Anleitung hierfür gibt es bereits (in Form von Videos), sodass ich nur die wichtigsten Punkte aufführen werde.
Nachdem ich das alles gemacht hatte, sah meine Extension im Kickstarter erst einmal so aus:
Nun nur noch auf "View result" klicken und schon kommt eine Fehlermeldung falls man Umlaute oder Sonderzeichen verwendet hat ;) Sollte dies der Fall sein, einfach Patch 2943 einspielen und nochmal versuchen. Dann noch schnell den Speicherort (global oder lokal) auswählen, und fertig ist die Extension (zumindest das Grundgerüst).
Nachdem die Extension nun also im Kickstarter grundlegend modelliert wurde, habe ich für jedes Plugin eine Seite im Seitenbaum erstellt und über den Seiteninhaltstyp Plugin einfügen jeweils eines meiner 4 Plugins eingefügt. Danach erscheint auf jeder der Seiten erst einmal der Standardinhalt eines neuen Plugins (ein wenig Text, ein Formular und ein Link). Dadurch kann man schon einmal sicher sein, dass das Plugin zumindest korrekt aufgerufen wird und auch tatsächlich Inhalt ausgibt.
Bevor ich nun mit der eigentlichen Programmierung begonnen habe, habe ich die Extension erstmal meinem SVN-Repository hinzugefügt, aber das ist jedem selbst überlassen. Als IDE habe ich easyEclipse für PHP bzw. einfach den PSPad-Editor verwendet.
Vor Beginn des Programmierung sollte man sich mit den TYPO3 Coding Guidelines vertraut machen.
Als ersten Schritt habe ich die Datei ext_emconf.php ein wenig angepasst, aber nichts weltbewegendes verändert. Einfach mal die Parameter durchschauen und wenn gewünscht was eintragen: die sind selbsterklärend.
In der Datei ext_localconf.php habe ich zunächst das Caching für die Zeit der Entwicklung abgeschaltet. Dies geschieht durch folgende Codezeile:
$TYPO3_CONF_VARS['EXT']['extCache'] = 0;
Als nächstes habe ich versucht meine selbst definierten Klassen zu inkludieren, die ich im Ordner classes auf Ebene der Plugin-Ordner (pi1 etc.) angelegt habe:
require_once(t3lib_extMgm::extPath('sm_employeelist') . 'classes/class.Employee.php');
Leider gibt es auf diese Art Probleme, da die Klasse Employee abgeleitet ist:
class Employee extends tslib_feUserAuth {}
Die Basisklasse ist bei dieser Art des Aufrufs über ext_localconf.php (warum auch immer) noch nicht bekannt. Daher habe ich die benötigten Klassen direkt in der Datei des Plugins (class.tx_smemployeelist_pi1.php) inkludiert.
Zum Testen habe ich mir erst einmal die recht einfache Klasse Employee angelegt:
class Employee extends tslib_feUserAuth { var $firstname; var $lastname; function __construct() { $this->firstname = "Stefan"; $this->lastname = "Macke"; } function getName() { return $this->firstname . " " . $this->lastname; } }
Der Aufruf in der Datei class.tx_smemployeelist_pi1.php funktioniert nun recht einfach (nachdem die Klasse Employee wie gesagt in dieser inkludiert wurde). Die folgende Methode gibt nun meinen Namen aus:
function main($content, $conf) { $this->conf = $conf; $this->pi_setPiVarDefaults(); $this->pi_loadLL(); $e = new Employee(); $content = $e->getName(); return $this->pi_wrapInBaseClass($content); }
Nachdem die erste Funktion getestet ist, kann die eigentliche Programmierung beginnen. Die interessantesten Funktionen und Zugriffe liste ich nachfolgend auf.
// Template einbinden $this->conf['templateFileSingleView'] = $this->conf['templateFileSingleView'] ? $this->conf['templateFileSingleView'] : t3lib_extMgm::siteRelPath($this->extKey) . 'tpl/employeeSingleView.html'; $template = $this->cObj->fileResource($this->conf['templateFileSingleView']); // Marker definieren $markers = array(); $markers['###IMAGE###'] = 'Hier steht später das Bild'; // Subpart TEMPLATE extrahieren $subpart = $this->cObj->getSubpart($template, '###TEMPLATE###'); // Marker mit Werten ersetzen $out = $this->cObj->substituteMarkerArray($subpart, $markers);