TYPO3 extension programming mit extbase und fluid

TYPO3


Mit Phoenix wird sich in TYPO3, dank dem eigenst dafür entwickelten Framework FLOW3 und der bereitgestellten template engine Fluid, einiges ändern. Um auch heute schon zukunftssichere extensions programmieren zu können wurde extbase bereitgestellt - ein aufwändiger backport aus FLOW3.

Extbase lehnt gleich an mehrere moderne Architekturmuster wie MVC und DDD an und bietet somit klare Strukturierung und bessere Skalierbarkeit für extensions. Wer sich bei der Erstellung der dadurch anfallenden, komplexeren Verzeichnisstruktur etwas Arbeit ersparen möchte, kann alternativ zur manuellen Methode auf den Extension Builder zurückgreifen.

Nach erfolgreicher Grundkonfiguration gehen wir also von folgender Verzeichnisstruktur innerhalb des “typo3conf/ext/myExt/” directory aus:
Classes
    Controller
    Domain
    ViewHelpers
Configuration
    FlexForms
    TCA
    TypoScript
Resources
    Private
        Templates
    Public


ext_emconf.php

Um TYPO3 mit unserer extension bekannt zu machen erstellen wir zunächst die “ext_emconf.php” beispielhaft wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$EM_CONF[$_EXTKEY] = array(
    'title' => 'casestudies',
    'description' => 'Referenzen',
    'category' => 'plugin',
    'author' => 'Christopher Orth',
    'author_email' => 'christopher.orth@dotfly.de',
    'author_company' => 'dotfly',
    'dependencies' => 'extbase,fluid',
    'clearCacheOnLoad' => 1,
	'state' => 'alpha',
    'version' => '0.0.0',
);


ext_localconf.php

Viel interessanter ist nun, was mit extbase in der “ext_localconf.php” passiert. Normalerweise musste das Plugin über die Methode “addPItoST43()” der Klasse “t3lib_extMgm” registriert werden. addPItoST43 ist auch eine der vielen Methoden, bei der man lange rätseln kann um deren kryptische Namensgebung zu entschlüsseln. Hier hilft ein Blick in die source code documentation, wobei die 43 für die uid des static templates “content.default” steht. Schauen wir uns nun an, wie wir unser Plugin in extbase registrieren:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
if (!defined ('TYPO3_MODE')) die ('Access denied.');
 
Tx_Extbase_Utility_Extension::configurePlugin(
    $_EXTKEY,
    'Pi1',
    array(
        'Overview' => 'index',
    )
);

Der erste Parameter der “configurePlugin()” Methode erwartet den extension key, der zweite den eindeutigen Namen unseres Plugins in UpperCamelCase. Als dritter Parameter wird ein Array mit den controller-action-combinations übergeben. Dieses Array definiert in welcher Reihenfolge Controller und deren Actions aufgerufen werden sollen. Wir würden mit dieser Angabe also aus dem “Overview” Controller die Action “index” aufrufen.


OverviewController.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
class Tx_Casestudies_Controller_OverviewController extends Tx_Extbase_MVC_Controller_ActionController
{
 
    public function indexAction()
    {
        $this->view->assign('aCaseStudies', $this->_getCaseStudies());
    }
 
    protected function _getCaseStudies()
    {
        ...
    }
 
}


View

Im Verzeichnis “Resources/Private/Templates/Overview/” wird nun das entsprechende View der aufgerufenen “index” Action erwartet. Das Template muss analog zur Action benannt werden, heißt in diesem Fall also “index.html”. Im View selber stehen bereits einige Helper zur Verfügung, die die Verarbeitung von komplexen Arrays und Objekten vereinfachen.

1
2
3
<f:for each="aTest" as="foo">
    foo
</f:for>



Jedem, der sich intensiv mit der Entwicklung von Extensions unter extbase und Fluid beschäftigen möchte, kann ich die O’Reilly Ausgabe “Zukunftssichere TYPO3-Extensions mit Extbase und Fluid” von Jochen Rau und Sebastian Kurfürst empfehlen.