Official TYPO3 Extbase and Fluid Guide
-
Upload
arturboychuk -
Category
Documents
-
view
83 -
download
1
description
Transcript of Official TYPO3 Extbase and Fluid Guide
Extbase and Fluid Guide
Table of Contents
Extbase Guide
o Erstellen einer Extbase Extension
o Erweitern der Extbase Extension
o Step 1 - Einführung
o Schritt 2 - Systemcheck
o Schritt 3 - Dokumentation
Fluid Guide
o ViewHelper
o Things to know
o Bewährte Vorgehensweisen
Index: Labels for Crossreferencing
What is Extbase?
Extbase is a framework for TYPO3 extension development. It was introduced with TYPO 4.3 in 2009
and is bound to entirely replace the classic way of writing TYPO3 extension (pibase). Most important
it is a gateway for TYPO3 4.x/6.x to version Phoenix as it is a backport of FLOW3 technology.
Should I use Extbase?
If you develop an extension for TYPO3 you should most definitely use Extbase. The days of piBased
extensions are numbered. Extbase gives you the benefit of a modern, clear and highly structured
way of PHP development with a hidden bonus: If you know Extbase, getting into FLOW3 will be
much, much easier for you. Another bonus: Porting Extbase extensions to Phoenix will be a walk in
the park, whereas porting a piBased extension to Phoenix will be incredibly laborious if possible at
all, and pobably a very bad experience for everyone involved.
How do I get started with Extbase?
You should definitively check out the Extbase documentation section.
The TYPO3 extension repository (TER) already holds lots of extensions based on Extbase, inspect
the code.
Also check out how to get Extbase support.
Want to contribute?
Do you want to take part in making Extbase, TYPO3, and the world an even better place/project?
We would love to welcome you to the team if you want to contribute in a substantial way. Click here
for more info.
Erstellen einer Extbase Extension
Die erste Extension - Schritt fuer Schritt
Ihr müsst Euch zu aller erst von dem Gedanken der alten piBase-Programmierung lösen und
begreifen, dass die Programmierung auf Extbase nicht direkt mit Quellcode beginnt, sondern schon
während dem Gespräch mit dem Kunden. Als Programmierer muss klar sein, was der Kunde will. Je
besser Ihr ihn versteht, desto besser könnt Ihr planen und Planung ist für Extbaseprogrammierung
das A und O.
Im folgenden Verlauf werdet Ihr eine Produktübersicht erstellen, bei der auf der ersten Seite die
Produkte als Liste dargestellt werden und nach einem Klick auf den Produkttitel in die Detailansicht
gewechselt wird. Da die Anzahl der Produkte stark variieren kann, wird es eine Seitennavigation
geben, mit der der Webseitenbesucher durch die Produkte navigieren kann.
Tip
Auf Grund von Mehrsprachigkeit solltet Ihr alle Datenbankspalten in englischer Sprache anlegen.
Spalten wie ist_gefraessig sind einfach sehr schlecht zu lesen.
Den Extension Builder installieren
Um eine Extension auf Basis von Extbase zu erstellen, müsst Ihr den Extension Builder
(extension_builder) über den Extension Manager installieren. Ihr erhaltet nach der Aktivierung dieser
Extension einen neuen Eintrag Extension Builder in der linken Menüleiste des TYPO3-Backends.
Nach einem Klick auf diesen neuen Eintrag landet Ihr auf der Einstiegsseite des Extension Builders,
die Euch erst mal ein paar grundsätzliche Dinge erklärt. Über die Selectbox oben könnt Ihr zwischen
der Einstiegsseite und dem Domain Modelling wechseln.
Informationen zur Extension eingeben
Nach der Auswahl von Domain Modelling aus der Selectbox, erscheint nun ein Formular in dem Ihr
weitere Informationen zu der Extension angeben könnt und eine weiße karierte Fläche.
Tragt nun folgende Daten in das Formular ein:
Name: Product Overview
Key: productoverview
description: This extension shows a paginated product overview including a simple single view
persons: Tragt hier Eure Daten ein.
Frontend Plugin:
o Name: Products
o Key: products
Den Pluginnamem findet Ihr später in der Selectbox für die Plugins innerhalb der Seiteninhalte
wieder. Der Pluginkey wird von Extbase mit dem Extensionkey zusammengesetzt und bildet so
einen TYPO3 weiten eindeutigen Bezeichner: productoverview_products
Domain Modelle anlegen
Das Formular für die Extensionkonfiguration könnt Ihr mit dem kleinen Pfeil oben rechts im Formular
schließen. Nun steht Euch die komplette karierte Fläche zur weiteren Bearbeitung zur Verfügung.
Per Drag and Drop könnt Ihr nun aus dem Kasten "New Model Object" ein eigenes Domainmodel
herausziehen und auf der weißen Fläche platzieren. Dieses Model nennt Ihr "Product". Nach dem
Aufklappen der Domain Object Settings aktiviert Ihr die Checkbox Is Aggregate Root und setzt die
Beschreibung auf "Product".
Aktiviert bei den Default Actions" die beiden Checkboxen: *list und show
Legt 2 Eigenschaften vom Typ String an: title und price
Für die Verknüpfung zu den Kategorien müsst Ihr noch eine Relation anlegen. Klickt auf Add und
tragt als name "categories" ein. Da mehrere Kategorien möglich sein sollen wählt Ihr auf der
Selectbox "1:N" aus.
Legt nun ein weiteres Domainmodel an und benennt es "Category". Im Bereich der "Domain Object
Settings" vergebt Ihr diesmal nur eine description aber lasst die Checkbox "Aggregate Root"
unmarkiert. Auch Actions werden für dieses Domainmodel nicht benötigt.
Legt 1 Eigenschaft vom Typ String an: category
Im Domainmodel Product könnt Ihr nun von der Relation category eine Linie zu dem
Model Category ziehen.
Extension aktivieren
Geht nun in den Extension Manager und aktiviert die Extension productoverview. Bei diesem
Vorgang werden auch die fehlenden Datenbanktabellen erstellt.
Plugin einbinden
Legt eine neue Seite an und bindet das neu erstellte Plugin mit dem Namen "Product" auf Eurer
Seite ein. Wenn alles geklappt hat, dann erscheint im Frontend eine leere Tabelle mit den beiden
Tabellen-Überschriften title und price.
Datensätze anlegen
Legt im TYPO3-Seitenbaum eine neue Seite vom Typ Ordner an. Auf dieser Seite könnt Ihr nun
neue Datensätze vom Typ Product erstellen. Damit diese Daten in Eurem Plugin angezeigt werden,
müsst Ihr diesem mitteilen, wo sich die Daten befinden. Geht dazu in Euer Plugin auf den
Tab Verhalten. Tragt im Bereich Datensatzsammlungdie uid der Seite mit den Product-Datensätze
ein. Nun erscheinen die Datensätze auch im Frontend
Designanpassungen
Jede Extension, die über den Extension Builder erstellt wurde bringt ein kleines CSS mit. Derzeit
sind die Tabellenspalten extremst eng beieinander. Erstellt nun ein +extTemplate für Eure Seite und
bindet das Extension Template von Eurer Extension ein. Danach erscheint Eure Tabelle ein wenig
aufgeräumter.
Viel Spaß mit Eurer ersten Extbase Extension
Erweitern der Extbase Extension
Dieses Tutorial baut auf das Tutorial zum Erstellen der ersten Extbase Extension auf.
Anzeigen der Kategorien in der Detailansicht
Das Template für die Detailansicht findet Ihr hier:
typo3conf/ext/productoverview/Resources/Private/Partials/Product/
Properties.html
Ihr seht, dass nur title und price ausgegeben werden. Die Verknüpfungen von Domainmodellen kann
der Extension Builder derzeit nicht darstellen, deshalb müsst Ihr das selber nach holen. Fügt nun die
Zeile für die category ein. Das Template sollte nun so aussehen:
<table class="tx-productoverview" >
<tr>
<td>
<f:translate key="tx_productoverview_domain_model_product.title" />
</td>
<td>
{product.title}
</td>
</tr>
<tr>
<td>
<f:translate key="tx_productoverview_domain_model_product.price" />
</td>
<td>
{product.price}
</td>
</tr>
<tr>
<td>
<f:translate
key="tx_productoverview_domain_model_product.categories" />
</td>
<td>
<ul>
<f:for each="{product.categories}" as="category">
<li>{category.category}</li>
</f:for>
</ul>
</td>
</tr>
</table>
Ihr seht, dass vom Product per Punktnotation auf das verknüpfte Domainmodel Category zugegriffen
werden kann. Das ist das Prinzip eines Aggregate Root. Da Ihr pro Produkt mehrere Kategorien
anlegen könnt, müssen diese Kategorien mit Hilfe einer Schleife durch laufen werden. Pro Durchlauf
wird dann die Eigenschaft category in einer Liste ausgegeben.
Speichert dieses Template ab, leert den Cache und ladet Euer Plugin nochmal neu. Die Kategorien
zu den Produkten werden nun in einer Liste aufgeführt.
Mehrfachverwendung von Kategorien
Derzeit könnt Ihr zwar pro Produkt ein oder mehrere Kategorien zuordnen, aber es ist nicht möglich
eine bereits vorhandene Kategorie einem Produkt zuzuordnen. Um dieses Verhalten zu ändern geht
Ihr in diese Datei:
typo3conf/ext/productoverview/Configuration/Tca/Product.php
ersetzt diesen Eintrag hier:
'categories' => array(
'exclude' => 0,
'label' =>
'LLL:EXT:productoverview/Resources/Private/Language/locallang_db
.xml:tx_productoverview_domain_model_product.categories',
'config' => array(
'type' => 'inline',
'foreign_table' => 'tx_productoverview_domain_model_category',
'foreign_field' => 'product',
'maxitems' => 9999,
'appearance' => array(
'collapseAll' => 0,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
),
),
),
mit diesem:
'categories' => array(
'exclude' => 0,
'label' =>
'LLL:EXT:productoverview/Resources/Private/Language/locallang_db.xml:tx_pr
oductoverview_domain_model_product.categories',
'config' => array(
'type' => 'select',
'foreign_table' => 'tx_productoverview_domain_model_category',
'foreign_field' => 'product',
'maxitems' => 9999,
),
),
Step 1 - Einführung
Table of Contents
Einführung
Domain Driven Design
Dependency Injection
Einführung
Da die TYPO3-Programmierung auf Basis der piBase immer undurchsichtiger wird und keine klare
Struktur bei der Programmierung zu erkennen ist, haben sich die TYPO3-Entwickler auf die Suche
gemacht und überlegt welches System sie in Zukunft für TYPO3 einsetzen können. Die Entwickler
haben sich viele Frameworks angeschaut, aber überall Defizite gefunden und entschieden ein
eigenes Framework aufzubauen und so ist FLOW3 entstanden.
Dieses FLOW3 wird bzw. ist schon die Basis des neuen TYPO3 5, welches derzeit unter dem
Namen Phoenix durch die TYPO3-Gemeinde wandert. Da FLOW3 eine völlig neue Basis und auch
völlig anders aufgebaut ist, kann FLOW3 nicht von jetzt auf gleich den derzeitigen TYPO3 4.3 Core
ersetzten. Damit aber schon heute Extensions auf Basis des neuen Systems programmiert werden
können, hat man Teile des FLOW3-Systems als Sysextension. So entstanden die Extensions
extbase und fluid. Auf extbase basierende Extensions laufen auf TYPO3-Versionen ab 4.3 und
können später mit nur wenig Änderungen auf das TYPO3 5 System portiert werden.
Domain Driven Design
Ohne Struktur kann der Quellcode einer Software echt wüst aussehen. Wir haben Extensions
gesehen die insgesamt 3 PDF-Generatoren beinhaltet haben. Wusste der Programmierer nicht
mehr, dass er einen PDF-Generator implementiert hatte? Oder musste der PDF-Generator in einem
Teilbereich etwas anderes arbeiten/interagieren? Wir wissen es nicht. Aber wenn dieser
Programmierer irgendwann einmal wieder an seinem PDF-Generator arbeitet und einen Fehler
behebt, wird er diesen dann auch für die beiden anderen PDF-Generatoren entfernen?
Viele Programmierer haben schon sehr früh erkannt, dass es zwingend nötig ist Quellcode zu
strukturieren bzw. die Teilbereiche einer Software wie z.B. die PDF-Generierung, die Anbindung an
eine Datenbanktabelle, das Schreiben von Logdateien oder dem Versand einer E-Mail in eigene
Objekt den sogenannten Domainmodellen zu kapseln.
Dieses Prinzip der Planung und Programmierung nennt man Domain Driven Design. Dies hat den
Vorteil, dass sich der Programmierer immer auf ein spezielles Problem konzentrieren kann.
Programmiert er gerade an dem PDF-Generator, dann werden ihm keine Teilbereiche aus der
Logging-Domain oder aus der Datenbankanbindung in die Quere kommen. Auch Extbase selbst
arbeitet nach diesem Prinzip. So brauchen Sie sich als Programmierer keine Gedanken darüber zu
machen, wie Sie an die benötigten Daten für eine Ausgabe kommen. Mit Hilfe von Validatoren
innerhalb des Domainmodels können Sie das Model anweisen sich selbst zu überprüfen. Wird das
Model wo auch immer im Quellcode z.B. ungültig wird es nicht weiter verarbeitet bzw. wird nicht in
der Datenbank abgespeichert.
Domain Driven Design sollte schon während dem Gespräch mit dem Kunden angewendet werden.
Erst dadurch können die jeweiligen Problemfälle, die der Kunde durch Ihr Programm gelöst haben
will, visuell dargestellt werden. Alle Eigenschaften und Methoden werden mit dem Kunden
besprochen und es wird eine einheitliche Sprache zwischen Ihnen und dem Kunden erstellt
(Ubiquitous Language). Entscheiden Sie sich also bei der Debitorennummer für das Kürzel dNr,
dann ist das IMMER die Debitorennummer und wenn der Kunde auf einmal mit debNr oder
dNummer ankommt, dann ist dies für das aktuelle Projekt eine völlig neue Eigenschaft. Beim Bilden
dieser gemeinsamen Sprache sollten Sie sich auf die englische Sprache einigen, da viele
Fremdsprachen mit ihren Umlauten häufig zu Problemen führen.
Dependency Injection
Sehr häufig kommt es vor, dass Objekte von anderen Objekten abhängig sind. So sind z.B. Objekte,
die für Inhaltselemente zuständig sind abhängig von Seitenobjekten. Also immer wenn wir ein
Inhaltsobjekt instanziieren, muss auch das abhängige Seitenobjekt instanziiert werden. Innerhalb
des abhängigen Objektes, in unserem Fall das Seitenobjekt, sieht man immer wieder einen
Konstruktor, der das Objekt initialisiert. Nicht selten wurden in solchen Konstruktoren weitere
abhängige Objekte eingebunden. Solch ein Objekt könnte zum Beispiel ein Seitenbaumobjekte oder
eine Art Rootlineobjekt sein.
Egal wie Ihr diese abhängigen Objekte nun einbindet, sei es mit new oder t3lib_div::makeInstance(),
spätestens beim Testen Eurer Software werdet Ihr auf Probleme stoßen. Wollt Ihr innerhalb des
Seitenobjektes eine Methode testen, dann seit Ihr schon bei der Instanziierung diesen Objektes
dazu gezwungen auch ein Seitenbaumobjekt und ein Rootlineobjekt einzubinden, weil diese fest im
Konstruktor verankert sind.
Dieses Problem lässt sich mit Hilfe von Dependency Injections lösen. Innerhalb von Extbase wurden
sämtliche Konstruktore entfernt bzw. überarbeitet und die Einbindung von abhängigen Klassen
wurde in eigene kleine Methoden ausgelagert. Ab jetzt konnte man das aktuelle Objekt instanziieren
OHNE eine Abhängigkeit zu anderen Objekten herstellen zu müssen.
In Bezug auf phpUnit gibt es sogar noch einen weiteren Vorteil: Ihr könnt nun ein völlig fremdes
Objekt als abhängiges Objekt für Euer Seitenbaumobjekt einbinden. Hier noch ein besseres
Beispiel: Falls Euer abhängiges Objekt ein Datenbankobjekt ist, könntet Ihr nun phpUnit anweisen
z.B. ein Datenbankobjekt einzubinden, dass sich die Daten aus einer RAM-Tabelle zieht und auch
dort wieder zurückschreiben kann. Auf diese Weise würdet Ihr nicht in die Versuchung kommen
beim Testen Eures Programmes mit den Echtdaten in Kontakt zu kommen.
Domain Driven Design
Ohne Struktur kann der Quellcode einer Software echt wüst aussehen. Wir haben Extensions
gesehen die insgesamt 3 PDF-Generatoren beinhaltet haben. Wusste der Programmierer nicht
mehr, dass er einen PDF-Generator implementiert hatte? Oder musste der PDF-Generator in einem
Teilbereich etwas anderes arbeiten/interagieren? Wir wissen es nicht. Aber wenn dieser
Programmierer irgendwann einmal wieder an seinem PDF-Generator arbeitet und einen Fehler
behebt, wird er diesen dann auch für die beiden anderen PDF-Generatoren entfernen?
Viele Programmierer haben schon sehr früh erkannt, dass es zwingend nötig ist Quellcode zu
strukturieren bzw. die Teilbereiche einer Software wie z.B. die PDF-Generierung, die Anbindung an
eine Datenbanktabelle, das Schreiben von Logdateien oder dem Versand einer E-Mail in eigene
Objekt den sogenannten Domainmodellen zu kapseln.
Dieses Prinzip der Planung und Programmierung nennt man Domain Driven Design. Dies hat den
Vorteil, dass sich der Programmierer immer auf ein spezielles Problem konzentrieren kann.
Programmiert er gerade an dem PDF-Generator, dann werden ihm keine Teilbereiche aus der
Logging-Domain oder aus der Datenbankanbindung in die Quere kommen. Auch Extbase selbst
arbeitet nach diesem Prinzip. So brauchen Sie sich als Programmierer keine Gedanken darüber zu
machen, wie Sie an die benötigten Daten für eine Ausgabe kommen. Mit Hilfe von Validatoren
innerhalb des Domainmodels können Sie das Model anweisen sich selbst zu überprüfen. Wird das
Model wo auch immer im Quellcode z.B. ungültig wird es nicht weiter verarbeitet bzw. wird nicht in
der Datenbank abgespeichert.
Domain Driven Design sollte schon während dem Gespräch mit dem Kunden angewendet werden.
Erst dadurch können die jeweiligen Problemfälle, die der Kunde durch Ihr Programm gelöst haben
will, visuell dargestellt werden. Alle Eigenschaften und Methoden werden mit dem Kunden
besprochen und es wird eine einheitliche Sprache zwischen Ihnen und dem Kunden erstellt
(Ubiquitous Language). Entscheiden Sie sich also bei der Debitorennummer für das Kürzel dNr,
dann ist das IMMER die Debitorennummer und wenn der Kunde auf einmal mit debNr oder
dNummer ankommt, dann ist dies für das aktuelle Projekt eine völlig neue Eigenschaft. Beim Bilden
dieser gemeinsamen Sprache sollten Sie sich auf die englische Sprache einigen, da viele
Fremdsprachen mit ihren Umlauten häufig zu Problemen führen.
Dependency Injection
Sehr häufig kommt es vor, dass Objekte von anderen Objekten abhängig sind. So sind z.B. Objekte,
die für Inhaltselemente zuständig sind abhängig von Seitenobjekten. Also immer wenn wir ein
Inhaltsobjekt instanziieren, muss auch das abhängige Seitenobjekt instanziiert werden. Innerhalb
des abhängigen Objektes, in unserem Fall das Seitenobjekt, sieht man immer wieder einen
Konstruktor, der das Objekt initialisiert. Nicht selten wurden in solchen Konstruktoren weitere
abhängige Objekte eingebunden. Solch ein Objekt könnte zum Beispiel ein Seitenbaumobjekte oder
eine Art Rootlineobjekt sein.
Egal wie Ihr diese abhängigen Objekte nun einbindet, sei es mit new oder t3lib_div::makeInstance(),
spätestens beim Testen Eurer Software werdet Ihr auf Probleme stoßen. Wollt Ihr innerhalb des
Seitenobjektes eine Methode testen, dann seit Ihr schon bei der Instanziierung diesen Objektes
dazu gezwungen auch ein Seitenbaumobjekt und ein Rootlineobjekt einzubinden, weil diese fest im
Konstruktor verankert sind.
Dieses Problem lässt sich mit Hilfe von Dependency Injections lösen. Innerhalb von Extbase wurden
sämtliche Konstruktore entfernt bzw. überarbeitet und die Einbindung von abhängigen Klassen
wurde in eigene kleine Methoden ausgelagert. Ab jetzt konnte man das aktuelle Objekt instanziieren
OHNE eine Abhängigkeit zu anderen Objekten herstellen zu müssen.
In Bezug auf phpUnit gibt es sogar noch einen weiteren Vorteil: Ihr könnt nun ein völlig fremdes
Objekt als abhängiges Objekt für Euer Seitenbaumobjekt einbinden. Hier noch ein besseres
Beispiel: Falls Euer abhängiges Objekt ein Datenbankobjekt ist, könntet Ihr nun phpUnit anweisen
z.B. ein Datenbankobjekt einzubinden, dass sich die Daten aus einer RAM-Tabelle zieht und auch
dort wieder zurückschreiben kann. Auf diese Weise würdet Ihr nicht in die Versuchung kommen
beim Testen Eures Programmes mit den Echtdaten in Kontakt zu kommen.
Schritt 2 - Systemcheck
Inhaltsverzeichnis
TYPO3
Extbase wird seit TYPO3 4.3.0 als Systemextension mitgeliefert und wird parallel zur Entwicklung
von FLOW3 weiterentwickelt. Seit TYPO3 4.6.0 wurden die Versionsnummern von Extbase und
Fluid an die Versionsnummer von TYPO3 angepasst.
Auch wenn Extbase seit 4.3.0 on board ist, so empfehlen wir für den professionellen Einsatz
mindestens TYPO3 4.5. Sollte für Sie Geschwindigkeit sehr wichtig sein, dann verwenden Sie bitte
mindestens TYPO3 4.6. Seit dieser Version werden die Fluidtemplates in PHP-Dateien kompiliert
und können dadurch einen Geschwindigkeitsvorteil von 2 - 5x erziehlen.
PHP
Auch wenn TYPO3 4.5 noch mit PHP 5.2.* klar kommt, so sollten Sie bei der Entwicklung von
Extbase-Extensions mindestens eine PHP-Version größer 5.3.2 einsetzen.
Seit TYPO3 6.0 gibt es den Support von Namespacing. Da es mit früheren PHP-Versionen zu
Problemen beim Namespacing kommen kann empfehlen wir Ihnen eine PHP-Version größer 5.3.8
zu installieren.
Während TYPO3 4.5 sich noch mit einem memory_limit von 64MB begnügt, sollten es bei neueren
TYPO3-Versionen schon besser 128MB sein.
Falls Sie mit Hilfe von xdebug unterwegs sind, dann kann es Ihnen passieren, dass Sie ab einer
bestimmten Anzahl von verschachtelten Partials folgender Fehler auftaucht:
Maximum function nesting level of '100' reached, aborting!
Editieren Sie in diesem Fall Ihre php.ini und erhöhen Sie den Wert für die Verschachtelungen. Die
500 ist ein Vorschlag. Falls es nicht ausreicht, dann setzen Sie den Wert noch höher (1000):
xdebug.max_nesting_level = 500
Schritt 3 - Dokumentation
Inhaltsverzeichnis
Architektur
Diese Referenz beschreibt all Features die Extbase von Haus aus mitbringt.
Systemteile
Das Extbase Framework besteht aus den folgenden Unterm:
Der TYPO3 Extbase Bootstrap kümmert sich um die Konfiguration und dem Einrichten des
kompletten Extbase Frmaworks. Der Objektmanager erstellt, cached und verbindet Objekte. Das
Konfigurationsframework liest und verschachtelt die unterschiedlichen Konfigurationen.
The Resource module contains functions for publishing, caching, securing and retrieving resources.
The HTTP component is a standards-compliant implementation of a number of RFCs around HTTP,
Cookies, content negotiation and more. The MVC framework takes care of requests and responses
and provides you with a powerful, easy-to use Model-View-Controller implementation. The Cache
framework provides different kinds of caches with can be combined with a selection of cache
backends. The Error module handles errors and exceptions and provides utility classes for this
purpose. The Log module provides simple but powerful means to log any kind of event or signal into
different types of backends. The Signal Slot module implements the event-driven concept of signals
and slots through AOP aspects. The Validation module provides a validation and filtering framework
with built-in rules as well as support for custom validation of any object. The Property module
implements the concept of property editors and is used for setting and retrieving object properties.
The Reflection API complements PHP's built-in reflection support by advanced annotation handling
and a cached reflection service. The Persistence module allows you to transparently persist your
objects following principles of Domain Driven Design. The Security framework enforces security
policies and provides an API for managing those. The Session framework takes care of session
handling and storing session information in different backends The I18n service manages languages
and other regional settings and makes them accessible to other packages and TYPO3 Flow sub
packages. The Utility module is a library of useful general-purpose functions for file handling,
algorithms, environment abstraction and more. If you are overwhelmed by the amount of information
in this reference, just keep in mind that you don't need to know all of it to write your own TYPO3
Flow packages. You can always come back and look up a specific topic once you need to know
about it - that's what references are for.
But even if you don't need to know everything, we recommend that you get familiar with the
concepts of each module and read the whole manual. This way you make sure that you don't miss
any of the great features TYPO3 Flow provides and hopefully feel inspired to produce clean and
easy-maintainable code.
Arguments
Bootstrap
Der Bootstrap Mechanismus kümmert sich darum, die Konfiguration auszulesen, die
Reflectionklassen zu laden, die Caches aufzuwärmen und die Persistenzschicht zu aktivieren.
Dieser Initiierungsprozess wird über die ext_localconf.php vorbereitet:
Tx_Extbase_Utility_Extension::configurePlugin(
$_EXTKEY,
'Products',
array(
'Product' => 'list, show',
),
// non-cacheable actions
array(
'Product' => '',
)
);
Die Methode configurePlugin fügt dann mit Hilfe von t3lib_extMgm::addTypoScript dieses TypoScript
in das globale TS-Template ein:
# Setting Productoverview plugin TypoScript
tt_content.list.20.productoverview_products = USER
tt_content.list.20.productoverview_products {
userFunc = tx_extbase_core_bootstrap->run
extensionName = Productoverview
pluginName = Products
}
Sobald Ihr nun dieses Extbaseplugin auf einer Seite einbindet, wird die Methode run aus der
Klasse tx_extbase_core_bootstrap aufgerufen. Damit die weiß, um welche Extension und Plugin es
sich handelt, werden diese Informationen mit extensionName und pluginName an die run-Methode
übergeben. Hier findet der eigentliche Bootstrap statt:
$this->initializeObjectManager();
$this->initializeConfiguration($configuration);
$this->configureObjectManager();
$this->initializeCache();
$this->initializeReflection();
$this->initializePersistence();
$this->initializeBackwardsCompatibility();
Die letzte Aufgabe des Bootsraps ist die Übergabe der gesammelten Daten an den Dispatcher
Dispatcher
Der Dispatcher kümmert sich darum für die aktuelle Anfrage an eine Webseite eine Klasse zu
finden, die diesen Webseitenaufruf verarbeiten kann. Hat er eine Klasse gefunden, ruft der
Dispatcher die Methode handleRequest der gefundenen Klasse auf und erhält den Inhalt als
Ergebnis wieder zurück. Dieses Ergebnis wird dann als Webseiteninhalt ausgegeben.
Hier nun der Weg bis zum Dispatcher Schritt für Schritt:
RequestHandler
Extbase bringt von Haus aus ein paar Klassen für die unterschiedlichen Webseitenaufrufe mit und
stellt diese über die ext_typoscript_setup.txt zur Verfügung:
config.tx_extbase {
mvc {
requestHandlers {
Tx_Extbase_MVC_Web_FrontendRequestHandler =
Tx_Extbase_MVC_Web_FrontendRequestHandler
Tx_Extbase_MVC_Web_BackendRequestHandler =
Tx_Extbase_MVC_Web_BackendRequestHandler
Tx_Extbase_MVC_CLI_RequestHandler =
Tx_Extbase_MVC_CLI_RequestHandler
}
}
}
Somit stellt Extbase sogenannte RequestHandler für Anfragen aus dem Frontend, dem Backend
und Anfragen, die über die Shell/CLI kommen bereit.
Dank dieser TypoScript Konfiguration habt Ihr die Möglichkeit auch eigene RequestHandler zu
registrieren. So könnt Ihr zum Beispiel einen RequestHandler für AJAX-Anfragen erstellen und hier
bekannt machen.
Welcher RequestHandler nun den aktuellen Webseitenaufruf verarbeiten kann entscheidet sich über
die Methode canHandleRequest innerhalb eines jedenRequestHandlers. Dieser schaut beim
BackendRequestHandler so aus:
canHandleRequest*() {
return TYPO3_MODE === 'BE';
}
Bei der Angabe eigener RequestHandler kann es aber durchaus vorkommen, dass sowohl
Euer RequestHandler als auch der RequestHandler von Extbase für das Frontend zuständig sind.
Also 2 RequestHandler kommen für den aktuellen Webseitenaufruf in Frage. Da aber nur
EIN RequestHandler erlaubt ist, gibt es für dieses Dilemma die Möglichkeit
jedem RequestHandler eine Priorität zuzuordnen. Für den Front- und Backend-
RequestHandler setzt Extbase diese Priorität auf 100. 90 ist die Priorität für CLI-Anfragen. Setzt also
eine höhere Priorität, wenn Euer eigener RequestHandler Vorrang erhalten soll.
RequestBuilder
Jetzt nachdem nur noch ein RequestHandler übrig geblieben ist, wird die enthaltene
Methode handleRequest ausgeführt. Diese Methode erstellt mit Hilfe desRequestBuilders ein
Objekt, das alle benötigten Daten für den Webseitenaufruf zusammen stellt. Er durchsucht die
Pluginkonfiguration in der ext_localconf.php, um heraus zu finden welcher Controller und welche
Action als Standard verwendet werden sollen (Methode: loadDefaultValues). Ebenso liest
der RequestBuilder die Webseiten-Uri aus, um zu prüfen, ob evtl. ein anderer Controller/eine andere
Action statt den Angaben aus der ext_localconf.php geladen werden sollen.
Sämtliche Daten des Webseitenaufrufes werden nun zusammen gestellt und stehen anschließend in
dem Objekt $request zur späteren Verfügung:
$request = $this->objectManager->create('Tx_Extbase_MVC_Web_Request');
$request->setPluginName($this->pluginName);
$request->setControllerExtensionName($this->extensionName);
$request->setControllerName($controllerName);
$request->setControllerActionName($actionName);
$request->setRequestUri(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'));
$request->setBaseUri(t3lib_div::getIndpEnv('TYPO3_SITE_URL'));
$request->setMethod((isset($_SERVER['REQUEST_METHOD'])) ?
$_SERVER['REQUEST_METHOD'] : NULL);
Abschließend werden die Parameter, die nur für dieses eine Plugin gültig sind, dem $request-Objekt
als Argumente hinzugefügt:
foreach ($parameters as $argumentName => $argumentValue) {
$request->setArgument($argumentName, $argumentValue);
}
RequestHashService
Alle Daten für den aktuellen Webseitenaufruf wurden im Request-Objekt hinterlegt. Zeit zu
überprüfen, ob die Daten sauber sind. Der RequestHashService prüft, ob sich imRequest-Object ein
__hmac-Argument befindet. Das ist immer dann der Fall, wenn Formulardaten übertragen wurden.
Extbase weiß, welche Formulardaten auf der Webseite angezeigt werden. Hat sich die Anzahl der
Felder beim Übertragen der Daten verändert, dann wurde möglicherweise das Formular
kompromitiert und das Verarbeiten der Daten wird gestoppt. Ist das hmac-Argument nicht enthalten
handelt es sich um ganz normale Webseitenaufrufe und die Inhaltsgenerierung kann gestartet
werden
Response
Es wird nun ein Antwort-Objekt erstellt, das die Headerdaten beinhaltet. Das sind zum einen die
Statuscodes wie Fehler 404 und für die Inhaltsausgabe benötigte JavaScript und CSS-Dateien.
Dieses Objekt ist derzeit noch leer, wird aber im nächsten Schritt, dem
sogenannten Dispatching befüllt.
Der Dispatcher
Der Dispatcher holt sich aus dem Request-Objekt den Controllernamen und erstellt über die
Methode resolveController das zum Controller gehörende Objekt. In der
Beispielextension productoverview ist das die
Klasse Tx_Productoverview_Controller_ProductController.
Das Objekt $request und das noch leere Objekt $response wird nun an die
Methode processRequest des Controllers übergeben. Ab hier endet die Aufgabe des Dispatchers.
Er wartet nur noch darauf aus dem Controllerobjekt die Daten zurück zu bekommen, setzt dann die
HTTP-Header, die während des Prozesses im $response-Objekt gesetzt wurden und liefert den
generierten Inhalt zurück an das Inhaltsobjekt USER vom TypoScript, welches den Inhalt
schlussendlich ausgibt.
Der Controller
Der Controller steht zwischen den Modellen und dem View (MVC-Prinzip). Über die Informationen
darüber, wie die Modelle mit ein ander verschachtelt sind, kann eine Datenbankabfrage generiert
werden, die die benötigten Daten an den Controller ausliefern kann. Der Controller schiebt diese
Daten dann 1zu1 oder in leicht veränderter Form an den View (Fluid) weiter, der sich dann um die
eigentliche Ausgabe kümmert. Seine Hauptaufgabe besteht also nur darin, den Datenfluss
zwischen Modellen undView zu koordinieren.
Der ActionController
In dem ActionController befinden sich eine oder mehrere Methoden die mit "action" beginnen. Je
nach Konfiguration in der ext_localconf.php oder auch Uri-Parameter wird eine
andere Action ausgeführt, die die Inhaltsausgabe verändert. So kann es z.B. eine Action geben, die
für eine Listenansicht während eine andere Action für die Detailansicht zuständig ist. Es gibt aber
auch Actions, die nur für das Erstellen oder auch Bearbeiten und Löschen von Datensätzen
zuständig sind.
Der Weg bis zum Aufruf einer Action
Welche Action aufgerufen wird, entscheiden die Informationen im $request-Objekt, das über den
Dispatcher an den ActionController übergeben wurde:
$controller->processRequest($request, $response);
Jeder Request will verarbeitet werden. Denn nur wenn ein Request verarbeitet wurde, geht es im
Dispatcher weiter. Der folgende Codeschnipsel zeigt eine Endlosschleife, die solange wiederholt
wird, bis das $request-Objekt als "verarbeitet" markiert wurde. Im Normalfall reicht ein Durchlauf und
das $request-Objekt wird innerhalb derprocessRequest Methode als "verarbeitet" markiert. Aber es
gibt bestimmte Situationen, die diese Information wieder auf "unverarbeitet" setzen. Sowas passiert
z.B. wenn Ihr von einer Action zu einer anderen Action weiterleitet. Einige Actions erwarten ganz
bestimmte Parameter, die zwingend gesetzt sein oder einem ganz bestimmten Datentyp
entsprechen müssen. Ist dies nicht der Fall, spring Extbase wieder zurück zur vorherigen Action und
führt sie erneut aus. Sollte eine Weiterleitung bestehen, wird die fehlerhafte Action von gerade
erneut aufgerufen. Es ist eine Endlosschleife entstanden. Um solche Fälle zu verhindern dürfen pro
Webseitenaufruf und Extension nur 99 Weiterleitungen durchgeführt werden. Ist dieser Wert
erreicht, wird die weitere Ausführung des Scriptes verhindert und eine Fehlermeldung präsentiert:
while (!$request->isDispatched()) {
if ($dispatchLoopCount++ > 99) throw new
Tx_Extbase_MVC_Exception_InfiniteLoop('Could not ultimately dispatch the
request after ' . $dispatchLoopCount . ' iterations. Most probably, a
@dontvalidate annotation is missing on re-displaying a form with
validation errors.', 1217839467);
$controller = $this->resolveController($request);
try {
$controller->processRequest($request, $response);
} catch (Tx_Extbase_MVC_Exception_StopAction $ignoredException) {
}
}
UriBuilder
Der UriBuilder bietet Euch die Möglichkeit an Links zu erzeugen. Sämtliche Einstellungen, die Ihr in
TypoScript hinterlegt habt, werden beim Erstellen von Links berücksichtig. So auch die Konfiguration
der Extension RealUrl, falls installiert.
Der ActionController benötigt den UriBuilder zum Verlinken auf eine andere Action, die über eine
veränderte Uri geladen werden soll: $this->redirect();
Die Action
In der ext_localconf.php werden alle erlaubten Actions registriert und nur mit ihrem Namen
angesprochen. Zum Beispiel: list, detail, update, edit, delete. Auch in der Uri werden die Actions mit
diesem Namen versehen. Innerhalb des ActionControllers werden jedoch Methodennamen in
lowerCamelCase-Schreibweise erwartet, denen ein "Action" angehangen wurde:
Die Action "list" muss demnach in den Methodennamen: "listAction" umgewandelt werden:
$actionMethodName = $this->request->getControllerActionName() . 'Action';
initializeActionMethodArguments
Diese Methode liest die Parameter der aufzurufenden Action Methode aus und stellt diese als
Argumente für die Action zur Verfügung. Hier ein Beispiel anhand der showAction:
/**
* action show
*
* @param Tx_Productoverview_Domain_Model_Product $product
* @return void
*/
public function showAction(Tx_Productoverview_Domain_Model_Product
$product) {
$this->view->assign('product', $product);
}
Noch bevor diese Methode aufgerufen wird liest initializeActionMethodArguments mit Hilfe
der ReflectionServices alle Methodenparameter aus. In diesem Fall $product. Dieser Parameter wird
analysiert und unter anderem wird heraus gefunden, um was für einen Datentyp es sich bei diesem
Parameter handelt. Zum Beispiel: String, Integer, Array aber auf Objekttypen wie "DateTime"
werden in diesem Prozess erkannt.
Dieser Parameter wird mit seinen Datentypinformationen in einem
Sammelobjekt Tx_Extbase_MVC_Controller_Arguments abgespeichert und steht innerhalb des
Controllers als $this->arguments zur Verfügung.
Note
Die enthaltenen Arguments beinhalten bis hierhin noch keine Werte! Es sind nur Parametername
und Datentyp gespeichert.
initializeActionMethodValidators
Für jeden Parameter innerhalb einer Action Methode habt Ihr die Möglichkeit
sogenannte Validators zu aktivieren. Auf diese Weise könnt Ihr Extbase anweisen, den Parameter x
dahingehend zu testen, ob es sich um einen Parameter vom Datentyp y handelt. Ist das nicht der
Fall wird die Action nicht ausgeführt. Im Folgenden eine Beispiel Action mit einem
gesetzten Validator:
/**
* action show
*
* @param Tx_Productoverview_Domain_Model_Product $product
* @param String $autoMarke
* @validate $autoMarke String, StringLength(minimum=3,maximum=20)
* @return void
*/
public function showAction(Tx_Productoverview_Domain_Model_Product
$product, $autoMarke) {
$this->view->assign('product', $product);
}
Mit Hilfe der PHPDoc-Annotation "@validate" wurde Extbase nun mitgeteilt, dass der Parameter
$autoMarke geprüft werden soll, ob es sich dabei um einen String handelt und dieser String
zwischen 3 und 20 Zeichen lang ist.
Alle definierten Validatoren werden hier an dieser Stelle noch nicht ausgeführt, sondern nur die
Information, dass dieser Parameter gegen diesen Validator geprüft werden soll, den gefundenen
Argumenten in $this->arguments hinzugefügt.
initializeAction
Diese Action gehört Euch. Alles was Ihr hier rein schreibt, wird VOR dem Aufrufen
irgendeiner Action ausgeführt.
initializeXXXAction
Auch diese Action gehört Euch. Als Platzhalter für XXX könnt Ihr eine Action angeben. Eine Beispiel
Methode könnte so aussehen: initializeDetailAction.
Der Inhalt diese Methode wird nur dann ausgeführt, wenn die angegebene Action geladen werden
soll.
mapRequestArgumentsToControllerArguments
Egal ob alter oder neuer PropertyMapper. Hier in dieser Methode erhalten die ausgelesenen Action
Methodenparameter die Werte aus dem $request-Objekt:
foreach ($this->arguments as $argument) {
$argumentName = $argument->getName();
if ($this->request->hasArgument($argumentName)) {
$argument->setValue($this->request->getArgument($argumentName));
} elseif ($argument->isRequired()) {
throw new
Tx_Extbase_MVC_Controller_Exception_RequiredArgumentMissingExceptio
n('Required argument "' . $argumentName . '" is not set.', 1298012500);
}
}
Innerhalb von setValue geschieht eine ganze Menge Magic. Schaut Euch nochmal diese Action hier
an:
/**
* action show
*
* @param Tx_Productoverview_Domain_Model_Product $product
* @return void
*/
public function showAction(Tx_Productoverview_Domain_Model_Product
$product) {
$this->view->assign('product', $product);
}
Egal was Ihr per Formular oder per Uri übergebt: Ihr könnt keine Objekte übertragen! Um trotzdem
eine Möglichkeit zu schaffen, werden entweder die Eigenschaften des Objektes als Array oder, falls
das Objekt schon existiert und eine eindeutige UID aufweisen kann, die UID als Integerwert
übertragen. Die Methode setValue geht nun her und prüft, welcher Datentyp vom Formular oder Uri
ankommt und in welchen Datentyp der Wert konvertiert werden muss.
Datentyp: Integer
Wenn eine Zahl für den Parameter $product übergeben wird, wird in der Datenbank nach einem
Eintrag mit dieser UID gesucht und die Spalten mit Hilfe des DataMappersauf die Eigenschaften des
angegebenen Datentyps (Tx_Productoverview_Domain_Model_Product) übertragen.
Datentyp: Array
Beim Anlegen eines neuen Produktes gibt es noch keine UID. Es kommen also alle Eigenschaften
als Array an. Auch hier wird wieder der DataMapper aktiv und portiert alle Arrayeinträge auf die
Eigenschaften des benötigten Objektes.
Egal, was für ein Datentyp übergeben wurde, der PropertyMapper wird versuchen diese Datentypen
in den vorgegebenen Datentyp zu konvertieren. Das hat den Vorteil, dass Ihr als Programmierer ein
fertig eingerichtetes Objekt innerhalb Eurer Action zur Verfügung stehen habt.
resolveView
Für jede Action kann ein eigener View definiert werden. Dazu müsst Ihr einen View mit einem
Klassennamen im folgenden Format erstellen:
Tx_@extension_View_@controller_@action@format
Ein Klassenname könnte zum Beispiel so aussehen: Tx_Productoverview_View_Product_ShowHtml
Wenn eine solche Klasse jedoch nicht angelegt wurde, dann wird der
Standard View: Tx_Fluid_View_TemplateView geladen. Kurz: Keine Klasse anzugeben ist das
Standardverhalten und läd somit völlig automatisch Fluidtemplates als Templateengine.
callActionMethod
In dieser letzten Methode wird überprüft, ob die Validatoren (siehe weiter oben) Fehler verursacht
haben. Wenn ja, dann wird ein ErrorHandling ausgeführt, dass die verursachten Fehler auf der
Webseite darstellen. Wurden keine Fehler gefunden wird die Action Methode aufgerufen. Wenn die
Methode einen Wert zurück gibt, wird dieser Wert 1zu1 auf der Webseite ausgegeben. Wird kein
Wert mit return zurückgeliefert, dann wird völlig automatisch $this->view->render aufgerufen also
die Fluid Templates gestartet und geparst. Es wird dann das Ergebnis aus den Templates an den
Dispatcher zurück gegeben.
Fluid Guide
This Guide demonstrates the usage of Fluid to render output. Fluid is a template engine that is
designed to be flexible and extendable, but easy to use. It is part of TYPO3 Flow and TYPO3 CMS.
ViewHelper
The power of Fluid is the usage of ViewHelpers. There are many of them, for all kind of tasks. What
is available and how to use it can be found on the following pages.
ViewHelper: Buttons
f:be.buttons.csh
This ViewHelper is rarely used, but very helpful nonetheless. It enables to include hints into Backend
forms. TYPO3 uses this functionality all over the backend, and it is noticeable by the small question
mark images. When hovered it reveals the helptext in a little tooltip. It can be activated by mouse
click and then display the help text in a popup window. There is a setting in the user configuration
whether to show the popup or not.
Features
Property Datatype Description
table String table name
field String the key from locallang file to use
iconOnly Boolean display the icon, but not the text
styleAttributes String additional style attribute, added to the containing table
Hinweis zu einem Sonderfall bei der Eigenschaft "table"
Es gibt einen Sonderfall bei dem die Eigenschaft "table" überhaupt nicht angegeben werden muss.
Dieser tritt dann ein, wenn es in dem Modul zwar Formularfelder gibt, die aber keine 1zu1-Spalte in
der Datenbank besitzen. So werden beim scheduler z.B. alle Formularfelder serialisiert in einem DB-
Feld abgespeichert (kein 1zu1-Abbild der Felder) oder z.B. Textfelder, die für Suchanfragen benötigt
werden (keine DB-Speicherung). Diesen besonderen Felder kann mit Hilfe eines Eintrages in der
ext_tables.php ein csh-Icon zugewiesen werden:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr(
'_MOD_VollständigerModulname',
'PfadZuEinerSprachdatei'
);
Beachtet bitte, dass es sich bei dem Modulnamen um den vollständig ausgeschriebenen
Modulnamen handelt. Dieser besteht aus Kategorie (z.B. web), Extensionname (upper camel case)
und Modulname (upper camel case). In meiner Beispielextension "sfextbase" mit dem Modulnamen
"extbase" würde der vollständige Name so lauten:
web_SfextbaseExtbase
Hier eine Möglichkeit, wie es bei Euch aussehen könnte:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr(
'_MOD_web_SfextbaseExtbase',
'EXT:' . $_EXTKEY . '/Resources/Private/Language/locallang_extbase.xlf'
);
Der Eintrag für die E-Mail-Adresse sieht in meiner xlf-Datei so aus:
<trans-unit id="email.alttitle" xml:space="preserve">
<source>E-Mail</source>
</trans-unit>
<trans-unit id="email.description" xml:space="preserve">
<source>Tragen Sie hier Ihre E-Mail-Adresse ein</source>
</trans-unit>
<trans-unit id="email.details" xml:space="preserve">
<source>Ich bin eine ewig lange Beschreibung, die Ihnen on Detail
erklärt, wobei es sich um eine
E-Mail-Adress handelt, wo Sie eine her bekommen und was zu beachten ist,
um eine valide Adresse in dieses Feld einzutragen</source>
</trans-unit>
Beispiele
Caution
Im Quellcode der csh-API befindet sich eine Abfrage auf die BE-User-Option: edit_showFieldHelp.
Diese ist per Default nicht gesetzt und verhindert somit grundsätzlich die Ausgabe dieser csh-
Hilfetexte. Um diesen ViewHelper in Aktion sehen zu können, müsst Ihr entweder in den Benutzer-
oder Gruppenoptionen folgende Einstellung in die UserTSconfig setzen:
setup.override.edit_showFieldHelp = text
Beispiel: Datenbankfelder
Usually in the most TYPO3 tables the language file key is the same as the column name:
<f:be.buttons.csh table="tt_content" field="header" />
Beispiel mit Stil
<f:be.buttons.csh table="tt_content" field="header"
styleAttributes="background-color: red;" />
Beispiel: Icons für Formularfelder ohne 1zu1-Abbild in der Datenbank
Hier ein Beispiel für den oben beschriebenen Soderfall, bei dem der Tabellenname nicht angegeben
werden darf:
<f:be.buttons.csh field="email" />
f:be.buttons.icon
With this ViewHelper you can generate these little linked icons like f.e. edit, delete, new and many
other more.
Features
Property Dataype Description Standard
uri String target url. Can be created by a f:uri.*-ViewHelper
NULL
icon String the name to use actions-document-close
title String title attribute for the link empty string
There is a predefined set of possible values for the icon parameter. In case of not knowing what they
are, insert something definitely wrong. The answer contains all valid parameter values:
"foo" is no valid icon. Allowed are: "add", "add_workspace", "button_down", "button_hide",
"button_left", "button_unhide", "button_right", "button_up", "clear_cache", "clip_copy", "clip_cut",
"clip_pasteafter", "closedok", "datepicker", "deletedok", "edit2", "helpbubble", "icon_fatalerror",
"icon_note", "icon_ok", "icon_warning", "new_el", "options", "perm", "refresh_n", "saveandclosedok",
"savedok", "savedoknew", "savedokshow", "viewdok", "zoom".
Example
in combination with an f:uri.action viewhelper providing the target url
<f:be.buttons.icon uri="{f:uri.action(action:'new')}" icon="button_unhide"
/>
f:be.buttons.shortcut
This ViewHelper provides the bookmark function used in backend.
Features
Property Datatype Description
getVars Array if empty, page-UID, module and module arguments to save with the bookmark
setVars Array see template::makeShortcutIcon(), usually not used for extbase extensions
Example
<f:be.buttons.shortcut />
ViewHelper: Menus
f:be.menus.actionMenuItem
Mit diesem ViewHelper könnt Ihr einen Menüeintrag für Euer BE-Modul erstellen. Damit das
funktioniert müssen sich diese ViewHelper innerhalb des f:be.menus.actionMenu-ViewHelper
befinden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
label String Der anzuzeigende Name des Menüeintrages
controller String In welchem Controller liegt die aufzurufende Action
action String Welche Action soll nach Auswahl aufgerufen werden
arguments Array Welche Parameter sollen an die aufzurufende Action übergeben werden
Beispiel
Dieses Menü beinhaltet eine Selectbox mit 2 Menüeinträgen, die nach Auswahl die hinterlegte
Action des hinterlegten Controllers direkt aufrufen. Wie Ihr seht, könnt Ihr die Labels entweder direkt
oder noch besser als Sprach-ViewHelper realisieren.
<f:be.menus.actionMenu>
<f:be.menus.actionMenuItem label="Neu" controller="Fluid" action="new"
/>
<f:be.menus.actionMenuItem label="{f:translate(key='list')}"
controller="Fluid" action="list" />
</f:be.menus.actionMenu>
f:be.menus.actionMenuView
Dieser ViewHelper erstellt eine Selectbox. Mit Hilfe der actionMenuItem-ViewHelper könnt Ihr diese
Selectbox mit Optionen auffüllen, die dann nach Auswahl auf die gewünschte Action zugreifen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
defaultController String Gebt hier den Controllernamen ein auf den zurückgegriffen werden soll, falls im ActionMenuItem-ViewHelper kein Controller angegeben worden ist. Wenn ich mir den ViewHelper im Quellcode anschaue, würde ich diesen Parameter besser nicht verwenden. Erstens: Weil er im Quelltext überhaupt nicht weiter verwendet wird und Zweitens: Weil der Controller in den ActionMenuItems eh eine Pflichtangabe ist.
Beispiele findet Ihr bei den ActionMenuItem-ViewHelpern
ViewHelper: Security
f:be.security.ifAuthenticated
Dieser ViewHelper prüft, ob ein Backenduser sich authentifiziert hat oder nicht. Je nach dem wird
der Inhalt aus dem f:then oder f:else-ViewHelper geladen.
Dieser ViewHelper wird überwiegend aus dem Frontend heraus benötigt. So könnt Ihr bestimmen,
welche Inhalte nur angezeigt werden, wenn ein User im BE angemeldet ist.Ich denke Frontend-
Bearbeitung wäre eine gute Anlaufstelle für diesen ViewHelper.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
Beispiel WENN->DANN->SONST
<f:be.security.ifAuthenticated>
<f:then>
Sie haben das Recht diesen Inhalt zu bearbeiten
</f:then>
<f:else>
Sie muessen sich zuvor anmelden
</f:else>
</f:be.security.ifAuthenticated>
Beispiel, wenn angemeldet
<f:be.security.ifAuthenticated>
Hier kommt der Inhalt hin, den nur angemeldete Backend-Benutzer sehen.
</f:be.security.ifAuthenticated>
f:be.security.ifHasRole
Dieser ViewHelper prüft, ob ein im Backend angemeldeter User der im Parameter role angegebenen
Benutzergruppe angehört. Wie schon bei dem f:if-ViewHelper wird bei Gültigkeit der Inhalt zwischen
den Tags oder, wenn vorhanden, der Inhalt aus dem f:then-ViewHelper angezeigt. Falls gewünscht,
kann auch der f:else-ViewHelper angegeben werden, der immer dann angezeigt werden soll, falls
der User nicht der angegebenen Benutzergruppe angehört.
Eigenschaften
Eigenschaft Datentyp Beschreibung
role String Entweder der Gruppenname (Groß- und Kleinschreibung beachten) oder die Gruppen-UID
Beispiel WENN->DANN->SONST
<f:be.security.ifHasRole role="Administrator">
<f:then>
Sie dürfen diese Daten ändern
</f:then>
<f:else>
Du nix Admin
</f:else>
</f:be.security.ifHasRole>
Beispiel, wenn angemeldet
<f:be.security.ifHasRole role="2">
Willkommen in der Gruppe der BE-Administratoren
</f:be.security.ifHasRole>
ViewHelper: Widget
f:be.widget.paginate
Dieser ViewHelper hilft Euch dabei eine große Anzahl an Daten auf mehrere Seiten mit
Seitennavigation zu erstellen, dabei könnt Ihr selbst fest legen wo sich die Navigation befinden soll
und auch wie viele Datensätze pro Seite angezeigt werden sollen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
objects QueryResultInterface Hierbei handelt es sich nicht um die Ergebnisobjekte an sich, sondern um das Objekt aus dem Repository, dass Daten enthält, die für das Zusammenstellen des SQL-Befehls benötigt werden. Das SQL-Statementobjekt und SQL-Behle sind hier nicht erlaubt, da Extbase hier nicht weiß wie und wo es den LIMIT-Befehl einbauen soll.
as String Wie soll die Variable heißen, in der die reduzierten Objekte zur Verfügung gestellt werden sollen?
Eigenschaft Datentyp Beschreibung
configuration Array Konfiguration der Seitennavigation
Konfiguration der Seitennavigation
Eigenschaft Datentyp Beschreibung
itemsPerPage QueryResultInterface Wie viele Objekte sollen pro Seite angezeigt werden?
insertAbove Boolean Seitennavigator oberhalb anzeigen?
insertBelow Boolean Seitennavigator unterhalb anzeigen?
recordsLabel String Hier könnt Ihr einen eigenen Text einbinden, der den Schriftzug "Datensätze 1 - xy" überschreibt.
f:be.container
Zu allererst solltet Ihr Euch eine grundsätzliche Frage stellen: Willst Du etwas entwickeln ganz im
Stile von TYPO3 oder willst Du etwas völlig Eigenes bauen. Wenn Ihr Euch für etwas völlig Eigenes
entscheidet, dann braucht Ihr diesen ViewHelper überhaupt nicht. Bindet in diesem Falle Eure
benötigten StyleSheets und JavaScripte selbst ein.
Wenn Ihr allerdings etwas bauen wollt, dass sich an das TYPO3-Design anlehnt und möglichst
kompatibel sein soll, dann solltet Ihr diesen ViewHelper auf jeden Fall verwendet. Das was damals
zu Zeiten von MediumDoc und Co. eingebunden wurde, benötigt heute nur noch diesen Zweizeiler
mit knapp 10 Parametern.
Eigenschaften
Eigenschaft Datentyp Beschreibung
pageTitle String BE-Module werden in einem Frame dargestellt, von daher macht ein Seitentitel wenig sind. Einfach leer lassen
enableJumpToUrl Boolean Lasst diesen Parameter eingeschaltet, wenn Ihr den ActionMenu-ViewHelper verwenden wollt, da dieser die entsprechenden JavaScripte dazu liefert.
enableClickMenu Boolean Wenn aktiviert, wird das JavaScript für die Contextmenüs eingebunden
loadPrototype Boolean Wenn aktiviert, wird das Prototype-JS-Framework eingebunden
loadScriptaculous Boolean Wenn aktiviert, wird das Zusatzpaket für Prototype eingebunden
scriptaculousModule String Ihr könnt hier noch weitere Module für das Scriptaculouspaket aktivieren
Eigenschaft Datentyp Beschreibung
loadExtJs Boolean Wenn aktiviert, wird das ExtJS-Framework eingebunden
loadExtJsTheme Boolean Wenn aktiviert, werden Vorgaben für die Grafischen Elemente eingebunden.
extJsAdapter String Statt dem Standard ext-base kann hier ein anderer Adapter angegeben werden.
enableExtJsDebug Boolean Sollte nur aktiviert werden, wenn man auf Basis von ExtJS entwickelt.
addCssFile String Eine CSS-Datei einbinden
addJsFile String Eine JavaScript-Datei einbinden
loadJQuery Boolean Soll jQuery als JavaScript Framework eingebunden werden?
includeCssFiles Array Während addCssFile nur eine CSS-Datei einbinden kann, können mit dieser Eigenschaft mehrere CSS-Dateien eingebunden werden.
includeJsFiles Array Während addJsFile nur eine JS-Datei einbinden kann, können mit dieser Eigenschaft mehrere JS-Dateien eingebunden werden.
addJsInlineLabels Array Jeder Wert in diesem Array muss einem Key aus der locallang.xml/xlf entsprechen. Diese Übersetzung wird dann im Backend zur Verfügung gestellt.
f:be.pageInfo
Dieser ViewHelper zeigt das Icon der aktuellen Seite an mit der Information, um welche pid es sich
dabei handelt.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
f:be.pagePath
Dieser ViewHelper zeigt den Pfad zur aktuell gewählten Seite an. Diese Information ist vor allem bei
sehr großen Webseiten nützlich, wenn Seiten eher über eine Suche gefunden werden. Dann ist es
schon mal schwierig herauszufinden, wo sich diese Seite im Wust der ganzen Navigationen und
Unterseiten im Seitenbaum überhaupt befindet.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
f:be.tableList
Sehr geiles Teil. Was wir aus dem Modul Web->Liste kennen können wir nun selbst verwenden und
super einfach konfigurieren, wie die folgenden Beispiele zeigen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
tableName String Der Name der Tabelle
storagePid Integer Die Daten welcher Seite sollen angezeigt werden? Wenn nichts anderen angegeben wurde, werden die Datensätze der Seite angezeigt, die über persistence.storagePid angegeben wurde.
levels Integer Falls die Seite aus storagePid noch Unterordner enthält, könnt Ihr hier angeben wie viele Ebenen tiefer nach weiteren Datensätzen gesucht werden soll.
filter String Gebt hier ein Suchwort ein, nach dem Eure Datensätze gefiltert werden sollen.
recordsPerPage Integer Wie viele Datensätze dürfen maximal auf einer Seite angezeigt werden.
sortField String Nach welchem Feld sollen die gefundenen Datensätze sortiert werden
sortDescending Boolean Wenn aktiviert, dann werden die Datensätze rückwärts sortiert.
readOnly Boolean Wenn aktiviert, dann werden die Bearbeitungssymbole nicht mehr angezeigt.
enableClickMenu Boolean Wenn aktiviert, dann kann das Contextmenü verwendet werden
clickTitleMode String Auswahl von "edit", "info" und "show". Falls Ihr show auswählt, dann klappt das nur bei der Tabelle pages und tt_content. Normalerweise müsst Ihr immer erst über das Kontextmenü oder über ein anderes Modul in diese Bereich klicken. Nun reicht ein Klick auf den Titel des Datensatzes.
alternateBackgroundColors Boolean Wenn aktiviert, wechseln sich die Hintergrundfarben je Datenzeile ab.
Minimalistisches Beispiel
Dieses Beispiel zeigt die Tabelle tt_content mit den beiden Feldern header und bodytext. Die
Tabelle wird nur dann angezeigt wenn sich auf der Seite, die durch storagePid angegeben wurde
auch tatsächlich Datensätze dieser Tabelle befinden. Alle Backendmodule, die zumindest über den
extension_builder erzeugt wurden bringen ein Extensiontemplete mit, das auf der Rootseite
eingebunden werden sollte. Über den Konstanteneditor kann nun eine Seiten-UID eingetragen
werden, die als Fallback dienst, falls wie hier in unserem Beispiel keine storagePid angegeben
worden ist.
<f:be.tableList tableName="tt_content" fieldList="{0: 'header', 1:
'bodytext'}" />
Beispiel: Maximale Datensatzanzahl
Obwohl wir hier den Parameter recordsPerPage nicht angegeben haben, werden uns innerhalb des
Introductionpackage nur 100 Datensätz auf der ersten Seite angezeigt von etwas über 150. Denn
wenn dieser Parameter nicht angegeben wird, gilt erstens der Wert aus dem TCA
($TCA[TabellenName]['interface']['maxSingleDBListItems']) und wenn dieser nicht angegeben ist
100. Mit Hilfe von recordsPerPage ist es auch möglich mehr als 100 Datensätze anzeigen zu lassen.
<f:be.tableList tableName="tt_content" fieldList="{0: 'header', 1:
'bodytext'}" storagePid="1" levels="5" />
Beispiel: Datensatz direkt anzeigen
Normalerweise muss man immer über das Modul Web->Anzeigen oder über das Kontextmenü
navigieren, um eine erste Preview seines gewählten Datensatzes zu erhalten. Viel einfacher geht
es, wenn man den Titel eines Datensatzes (Der Wert aus der ersten Spalte) mit dieser Möglichkeit
verlinkt. Hierfür gibt es den Parameter clickTitleMode, den Ihr auf "show" setzen müsst. Zusätzlich
habe ich in dieses Beispiel nach einen Wechselnden Hintergrund je Datenzeile implementiert.
<f:be.tableList tableName="tt_content" fieldList="{0: 'header', 1:
'bodytext'}" storagePid="1" levels="5" alternateBackgroundColors="TRUE"
clickTitleMode="show" />
ViewHelper: Form
Link for german translation
http://docs.typo3.org/typo3cms/drafts/github/froemken/ExtbaseGuideDE/Fluid/ViewHelper/Form/
Button.html
f:form.button
Dieser ViewHelper erzeugt einen Button zum Absenden des Formulars.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
Eigenschaft Datentyp Beschreibung
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
type String Gibt den Typ des Buttons an. Mögliche Werte sind: "button", "reset" oder "submit"
f:form.checkbox
Dieser ViewHelper erzeugt eine Checkbox.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip
Eigenschaft Datentyp Beschreibung
erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung Standard
disabled String Die Checkbox wird deaktiviert angezeigt.
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung Standard
checked Boolean Wenn aktiviert, dann gilt diese NULL
Eigenschaft Datentyp Beschreibung Standard
Checkbox als markiert.
Derzeit sind Checkboxen innerhalb von Fluid/Extbase noch eine echte Katastrophe. Es hat mich viel
Zeit gekostet eine Checkbox überhaupt ans Laufen zu bekommen, da sie ein leeres aber
vorhandenes Model erfordern, wenn sie mit Hilfe der Property-Eigenschaft an ein Objekt gebunden
werden:
No value found for key "Tx_Fluid_ViewHelpers_FormViewHelper->formObject"
Um diesen Fehler weg zu bekommen, darf das Objekt nicht NULL sein. In der entsprechenden
Action muss ein leeres Objekt erstellt werden. Könnte dann z.B. so aussehen (Auszug aus dem
extension_builder):
/**
* action new
*
* @param $newAuto
* @dontvalidate $newAuto
* @return void
*/
public function newAction(Tx_Sffluid_Domain_Model_Auto $newAuto = NULL) {
if ($newAuto == NULL) { // workaround for fluid bug ##5636
$newAuto = t3lib_div::makeInstance('Tx_Sffluid_Domain_Model_Auto');
}
$this->view->assign('newAuto', $newAuto);
}
Erst nach dieser Änderung erscheint überhaupt mal eine Checkbox.
Beispiel ohne property
Das Problem bei dieser Variante: Ihr müsst Euch selbst darum kümmern zu prüfen, ob die Checkbox
markiert ist oder nicht. Ihr müsst die Werte schon innerhalb Eures Controllers gesetzt haben und mit
Hilfe des Checked-Attributes zuweisen. Erlaubt ist nur TRUE oder FALSE bzw. 1 oder 0. Ihr müsst
hier auch die leeren eckigen Klammern setzen, damit die markierten Werte später als Array
(Mehrfachauswahl) übergeben werden können.
<f:form.checkbox name="myExtName[pizza][]" checked="{data.salami}"
value="Salami" />
<f:form.checkbox name="myExtName[pizza][]" checked="{data.hawaii}"
value="Hawaii" />
<f:form.checkbox name="myExtName[pizza][]" checked="{data.tonno}"
value="Tonno" />
Beispiel mit property
Damit Ihr dem Problem von oben entgehen könnt, bindet die Checkboxen an eine
Objekteigenschaft, die Ihr im f:form-ViewHelper hinterlegt habt:
<f:form.checkbox property="pizza" value="Salami" />
<f:form.checkbox property="pizza" value="Hawaii" />
<f:form.checkbox property="pizza" value="Tonno" />
Schaut schon eine ganze Ecke kürzer aus.
Beispiel Multiselect
Der extension_builder kann bis lang nur EINE Checkbox erstellen. Nämlich dann, wenn der Typ
"Boolean" gewählt wurde. Wollt Ihr aber wie in den oberen Beispielen mehrere Checkboxen
gleichzeitig setzen, dann müsst Ihr Euch vom Typ "Boolean" verabschieden. Mit dem alten
kickstarter von TYPO3 können bis zu 10 gruppierte Checkboxen erstellt werden in dem die
Checkboxen binär in der Datenbank abgespeichert wurden. Jede Stelle dieser "Zahl" spiegelte eine
Checkbox wieder. 0 für deaktiviert. 1 für aktiviert. Ich will Euch heute eine Möglichkeit zeigen, wie Ihr
über 10 Checkboxen abspeichern könnt.
Innerhalb des extension_builder wählt Ihr nun den Typ "Text" aus. Damit wird in der Datenbank eine
Spalte erstellt, die etwas über 65.000 Zeichen abspeichern kann. Vergesst nicht über Database
Analyser den neuen Typ in die Datenbank zu schreiben.
Das Formular bleibt ähnlich den oberen Beispielen:
<f:form.checkbox property="farbe" value="gelb" /> :gelb<br />
<f:form.checkbox property="farbe" value="braun" /> :braun<br />
<f:form.checkbox property="farbe" value="blau" /> :blau<br />
Da Ihr ein Array nicht in der Datenbank abspeichern könnt, müsst Ihr das Array, das von den
Checkboxen kommt in einen String konvertieren. Das könnt Ihr zum Beispiel mit serialize() und
unserialize() realisieren. Bearbeitet dazu in Eurem Model den getter und setter für die Checkboxen:
/**
* @var string
*/
protected $farbe;
/**
* @return array $farbe
*/
public function getFarbe() {
return unserialize($this->farbe);
}
/**
* @param array $farbe
* @return void
*/
public function setFarbe(array $farbe) {
$this->farbe = serialize($farbe);
}
und fügt einen Konstruktor im Model hinzu:
/**
* initializes this object
*
* @param string $marke
* @param string $beschreibung
* @param boolean $unfall
* @param array $farbe
*/
public function __construct($marke = '', $beschreibung = '', $unfall =
false, array $farbe = array()) {
$this->setMarke($marke);
$this->setBeschreibung($beschreibung);
$this->setUnfall($unfall);
$this->setFarbe($farbe);
}
Nur mit diesem Konstruktor wird Eure Gruppe von Checkboxen überhaupt zur Mehrfachauswahl.
Schaut Euch auch den Quellcode an:
<input type="checkbox" name="tx_sffluid_sffluid[newAuto][farbe][]"
value="gelb" /><br /> <input type="checkbox"
name="tx_sffluid_sffluid[newAuto][farbe][]" value="braun" /><br /> <input
type="checkbox" name="tx_sffluid_sffluid[newAuto][farbe][]" value="blau"
/><br />
An Hand der leeren eckigen Klammern kann man schön erkennen, dass nun die Mehrfachauswahl
möglich ist. Auch das Bearbeiten vorhandener Datensätze klappt mit dieser Methode problemlos.
Einziger Nachteil: Im Backend lassen sich die Checkboxen nicht mehr setzen.
f:form.errors
Deprecated. Please use ValidationResults-ViewHelper instead.
f:form.hidden
Mit diesem ViewHelper erstellst Du ein verstecktes Feld. Das ist schonmal nützlich, um Datensatz-
UIDs abzulegen, die der Webseitenbesucher nicht zu sehen braucht, aber für Dich wichtig sind,
wenn es darum geht, die eingegebenen Daten einem Datensatz zuzuordnen, um ihn z.B. zu
speichern.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden.
Eigenschaft Datentyp Beschreibung
Attribute name und value werden dann automatisch generiert.
Beispiel
<f:form.hidden name="myExtName[ttAddressUid]" value="15" />
oder
.<f:form.hidden property="ttAddressUid" value="15" />
f:form.password
Mit diesem ViewHelper erstellst Du ein Textfeld dessen Inhalt nicht lesbar ist. Alle Zeichen werden
sofort in Sternchen umgewandelt.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element
Eigenschaft Datentyp Beschreibung
gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Beispiel
<f:form.password name="myExtName[password]" />
oder
<f:form.password property="password" />
f:form.radio
Mit diesem ViewHelper erstellst Du einen Radiobutton. Normalerweise tauchen diese immer in
Gruppen auf und bieten dem Besucher an sich für EINE Möglichkeit zu entscheiden. Eine
Mehrfachauswahl wie bei den Checkboxen ist hier nicht möglich.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung Standard
checked Boolean Wenn aktiviert, dann gilt diese Checkbox als markiert.
NULL
Beispiel
<f:form.radio name="myExtName[age]" value="1-10" />
<f:form.radio name="myExtName[age]" value="11-40" />
<f:form.radio name="myExtName[age]" value="41-99" />
oder
<f:form.radio property="age" value="1-10" />
<f:form.radio property="age" value="11-40" />
<f:form.radio property="age" value="41-99" />
f:form.select
Mit diesem ViewHelper erstellt Ihr eine Selectbox.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
Eigenschaft Datentyp Beschreibung
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
multiple String Wenn aktiviert, dann können mehrere Optionen gleichzeitig gewählt werden. In diesem Falle macht es Sinn den Wert size auf >=3 zu setzen.
size String Die Größe der Selectbox. Wie viele Optionen sollen gleichzeit angezeigt werden?
disabled String Wenn aktiviert, dann ist die Selectbox beim Laen des Formulars deaktiviert.
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
options Array Welche Optionen sollen in der Auswahlliste erscheinen.
optionValueField String Wenn options Objekte enthält, dann könnt Ihr hier angeben welche Eigenschaft als zu übergebenden Wert verwendet werden soll
optionLabelField String Wenn options Objekte enthält, dann könnt Ihr hier angeben welche Eigenschaft als anzuzeigender Titel verwendet werden soll
Eigenschaft Datentyp Beschreibung
sortByOptionLabel Boolean Soll nach dem anzuzeigenden Titel sortiert werden?
selectAllByDefault Boolean Damit alle Optionen direkt vorausgewählt sind, muss das Attribut multiple und die size größer 1 gesetzt sein.
errorClass String Eine CSS-Klasse, die gesetzt werden soll, wenn der Validator für dieses Feld einen Fehler gemeldet hat.
prependOptionLabel String Erzeugt eine weitere Option ganz am Anfang der Auflistung mit dem angegebenen Text.
prependOptionValue String Erzeugt eine weitere Option ganz am Anfang der Auflistung mit dem angegebenen Wert.
Tip
Die Eigenschaften optionValueField und optionLabelField funktionieren nur, wenn es sich bei den
Daten für eine Option, um ein Objekt handelt.
Tip
Die Eigenschaften selectAllByDefault klappt nur, wenn auch die Eigenschaft multiple gesetzt ist.
Beispiel
<f:form.select name="myExtName[country]" options="{data.countries}" />
oder
<f:form.select property="country" options="{data.countries}" />
f:form.submit
Dieser ViewHelper besitzt keine eigenen Parameter. Er bindet eine Schaltfläche ein die nach dem
Anklicken das Formular absendet und somit die eingegebenen Formulardaten an den Server
übermittelt
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden.
Eigenschaft Datentyp Beschreibung
Attribute name und value werden dann automatisch generiert.
Beispiel
<f:form.submit value="Absenden" />
f:form.textarea
Mit diesem ViewHelper erstellst Du ein Memofeld. Memofelder könnt Ihr für die Eingabe mehrzeiliger
Texte verwenden. Gut geeignet z.B. für das Nachrichtenfeld im Kontaktformular.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
Eigenschaft Datentyp Beschreibung
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden. Attribute name und value werden dann automatisch generiert.
Beispiele:
<f:form.textarea name="myExtName[nachricht]" />
oder
<f:form.textarea property="nachricht" />
f:form.textfield
Mit diesem ViewHelper erstellt Ihr ein Textfeld.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden.
Eigenschaft Datentyp Beschreibung
Attribute name und value werden dann automatisch generiert.
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
required Boolean Wenn aktiviert, dann handelt es sich um ein Pflichtfeld
type String Als Alternative gibt es noch email, url
placeholder String Ein beliebiger Text, der verschwindet, sobald in dieses Feld reingeklickt wird.
Beispiel
<f:form.textfield name="myExtName[strasse]" />
oder
<f:form.textfield property="strasse" />
f:form.uploads
Mit diesem ViewHelper erstellst Du ein Uploadfeld, um Dateien an den Server zu senden.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Globale Eigenschaften für Formularelemente
Eigenschaft Datentyp Beschreibung
name String Der Name für das Formularelement
value String Der Wert, der mit dem Abschicken des Formular übertragen werden soll
property String Anstatt mit name und value zu arbeiten, kann das Formularfeld mit einer Eigenschaft eines im f:form angegebenen Objektes verknüpft werden.
Eigenschaft Datentyp Beschreibung
Attribute name und value werden dann automatisch generiert.
Beispiel
<f:form.upload name="myExtName[image]" />
oder
<f:form.upload property="image" />
f:form.validationResults
ViewHelper: Format
f:format.bytes
Dieser ViewHelper wandelt eine Bytes-Angabe (Integer) in ein lesbares Format um.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value Integer Die Bytes als Integer, die konvertiert werden sollen
decimals Integer Die Anzahl Zahlen, die nach dem Dezimalpunkt noch angezeigt werden sollen
decimalSeparator String Das Zeichen, das als Dezimaltrenner verwendet werden soll
thousandsSeparator String Das Zeichen, das als Tausendertrenner verwendet werden soll
Beispiel mit Text:
<f:format.bytes>{fileSize}</f:format.bytes>
wird zu
123 KB
f:format.cdata
Dieser ViewHelper ummantelt einen Text oder eine Variable mit CDATA. Das wird gerade dann
interessant, wenn Ihr z.B. eine RSS-Ausgabe mit Hilfe von Extbase und Fluid programmiert. Da
solche Ausgaben auf XML basieren, ist es wichtig HTML-Tags innerhalb dieser XML-Ausgabe zu
maskieren.
Eigenschaften
Eigenschaft Datentyp Beschreibung Standard
value String Der Text, der mit CDATA ummantelt werden soll
NULL
Beispiel mit Text:
<f:format.cdata>Text, der ummantelt werden soll</f:format.cdata>
wird zu
<![CDATA[Text, der ummantelt werden soll]]>
Beispiel mit Variablen:
Als Beispiel übergeben wir etwas untypisch HTML und Text vom Controller aus:
$this->view->assign('variable', '<strong>Stefan</strong>');
Im Fluidtemplate wickeln wir die Variable in CDATA ein:
<f:format.cdata>{variable}, die ummantelt werden soll</f:format.cdata>
Als Ergebnis erhaltet ihr:
<![CDATA[<strong>Stefan</strong>, die ummantelt werden soll]]>
Important
Wie Ihr im Ergebnis sehen könnt, wird die Variable 1zu1 ausgegeben. Der Inhalt wird nicht durch
htmlspecialchars geschleust oder sonst in irgendeiner Form maskiert. Bitte beachtet diese
Vorgehensweise gerade in Hinblick auf XSS-Attacken.
f:format.crop
Schneidet Text zurecht
Eigenschaften
Eigenschaft Datentyp Beschreibung
maxCharacters Integer Anzahl Zeichen nach denen abgeschnitten werden soll.
append String Ein Text oder eine Anzahl Zeichen, die dem Text angefügt werden soll.
respectWordBoundaries Boolean Solange dieser Wert aktiviert ist und ein Schnitt innerhalb eines Wortes geschehen würde, wird dieser Schnitt VOR dem Wort ausgeführt, um das Wort nicht zu stückeln. Mit FALSE zwingt man den ViewHelper zum Trennen IM Wort.
respectHtml Boolean Bei TRUE werden HTML-Tags berücksichtigt. Bei FALSE kann es vorkommen, dass die Trennung innerhalb des HTML-Tag statt findet.
Beispiel
<f:format.crop maxCharacters="14">Diesen Text werden wir jetzt
zerschnibbeln</f:format.crop>
Normalerweise würde dieser Befehl das Wort "werden" auftrennen. Aber dadurch dass
"respectWordBoundaries" per default gesetzt ist erhalten wir diese Ausgabe:
Diesen Text...
Beispiel: Trennung im Wort
<f:format.crop maxCharacters="14" respectWordBoundaries="FALSE">Diesen
Text werden wir jetzt zerschnibbeln</f:format.crop>
ergibt
Diesen Text we...
Beispiel mit respectHtml = FALSE
<f:format.crop maxCharacters="25" respectHtml="FALSE"><p>Diesen Text
<strong>werden</strong> wir jetzt zerschnibbeln</p></f:format.crop>
ergibt
Diesen Text...
Wie oben schon erwähnt, liegt das daran, dass nun auch alle Buchstaben der HTML-Tags
mitgezählt werden.
f:format.currency
Mit diesem ViewHelper könnt Ihr Zahlen als Währung darstellen lassen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
currencySign String Das Währungskennzeichen wie $ oder €. Dieses Zeichen wird immer hinter der Währung angezeigt.
decimalSeperator String Welcher Zeichen soll für die Trennung von Euro und Cent verwendet werden. Dezimaltrenner.
thousandsSeperator String Welches Zeichen soll als Tausendertrennzeichen verwendet werden.
prependCurrency Boolean Soll das Währungssymbol VOR die Währung gesetzt werden?
separateCurrency Boolean Soll das Währungssymbol durch ein Leerzeichen von
Eigenschaft Datentyp Beschreibung
der Währung getrennt werden?
decimals Integer Wie viele Stellen nach dem Komma sollen angezeigt werden?
Zwei wichtige Informationen:
Übergebt Ihr an diesen ViewHelper einen leeren Text, dann benötigt die in diesem ViewHelper
befindliche Funktion number_format knapp 23 Millisekunden. Liefert Ihr dieser Funktion stattdessen
direkt ein 0.00 ist die Funktion in 1-2 Millisekunden durch. Wichtig wenn Ihr mit langen Listen
arbeitet.
Ihr dürft diesem ViewHelper keine Zahlen mit einem Komma als Dezimaltrenner mitgeben. Siehe
Beispiel.
Beispiel
<f:format.currency currencySign="$" decimalSeparator="."
thousandsSeparator=",">1122334455.66</f:format.currency>
ergibt: 1,122,334,455.66 $
Beispiel mit nicht float kompatiblen Zahlen
<f:format.currency currencySign="$" decimalSeparator="."
thousandsSeparator=",">1122334455,66</f:format.currency>
ergibt: 1,122,334,455.00 $
f:format.date
Konvertiert einen Timestamp in einen lesbaren Datumswert.
Eigenschaften
Eigenschaft Datentyp Beschreibung
date Mixed Entweder ein Objekt vom Typ DateTime oder eine Text/Datum, das in ein DateTime-Objekt konvertiert werden kann. Z.B.
Eigenschaft Datentyp Beschreibung
17.01.1979 geht. 17.01.79 geht nicht.
format String Wie soll das Datum ausgegeben werden?
So schön wie das mit den ganzen DateTime-Objekten ist, prüft die Wert bitte ganz genau. Besucht
Online-Timestamp-Konverter oder gleicht die Wert mit denen in Eurer Datenbank ab. So steht in der
Doku z.B. Wenn Ihr einen Timestamp in ein DateTime-Objekt konvertieren wollt, dann fügt einfach
ein @-Zeichen vorne an. Ich hoffe ich erzähl jetzt nichts Falsches, aber dieser Timestamp wird nach
dem RFC2822 konvertiert und das ist Zeitzone 0. In Deutschland würden wir dem resultierenden
DateTimewert also immer hinterherhinken. Die DateTime-Objekt sollten besser nach ISO8601
konvertiert werden. Dann klappts auch mit der richtigen Zeitzone. Ich für meinen Teil hab mir einen
eigenen ViewHelper geschrieben der sich daran hält und auch Extbase arbeitet intern mit diesem
ISO-Format. Siehe:
DataMapper->mapDateTime()
Zitat: return new DateTime(date('c', $timestamp));
Warum das in den ViewHelper noch nicht eingeflossen ist, kann ich mir nicht erklären.
Beispiel
<f:format.date date="17.01.1979" format="d/m/y" />
Beispiel Timestamp
<f:format.date format="d.m.Y">@1334439765</f:format.date>
Wie schon gesagt: Je nach Land/Kontinent bitte mit Vorsicht zu behandeln.
f:format.html
Wenn Ihr ein Modell für die Tabelle tt_content erstellt habt, dann erhaltet Ihr im Frontend die nackten
Daten, wie sie aus der Datenbank kommen. Damit die Daten wieder so aussehen, wie wenn Ihr sie
mit styles.content.get ausgebt, hilft Euch dieser ViewHelper weiter. Dieser schnappt sich das
Durcheinander und schleift es einmal komplett durch den TS-Objektpfad lib.parseFunc_RTE.
Danach sollten Eure Daten wieder wie frisch aufbereitet aussehen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
parseFuncTSPath String Formatiere einen Text anhand der TS-Konfiguration, die sich hinter dem angegebenen TS-Objektpfad befindet
Beispiel
<f:format.html>{content.bodytext}</f:format.html>
Beispiel/Trick mit abgeschalteten htmlspecialchars
<f:format.html parseFuncTSPath="lib.parseFunc">{variable}</f:format.html>
f:format.htmlentities
Mit diesem ViewHelper könnt Ihr die htmlentities Funktion von PHP auf einen Text anwenden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value String Der Text der dekodiert werden soll
keepQuotes Boolean Sollen einfache und doppelte Anführungsstriche auch dekodiert werden?
encoding String Wir sind hier im Bereich TYPO3 und da sollte der Zeichensatz auf UTF-8 und nix anderes stehen. Sollte wiedererwartend ein anderer Zeichensatz gewünscht sein, kann dieser hier angegeben werden. Siehe auch Info auf php.net.
doubleEncode Boolean Bei TRUE (Standard) wird alles kodiert. Bei FALSE, werden bereits kodierte Werte nicht erneut kodiert.
Beispiel
<f:format.htmlentities>Müller & Breuer</f:format.htmlentities>
Müller & Breuer
f:format.htmlentitiesDecode
htmlEntityDecode
Eigenschaften
Eigenschaft Datentyp Beschreibung
value String Der Text der dekodiert werden soll
keepQuotes Boolean Sollen einfache und doppelte Anführungsstriche auch dekodiert werden?
encoding String Wir sind hier im Bereich TYPO3 und da sollte der Zeichensatz auf UTF-8 und nix anderes stehen. Sollte wiedererwartend ein anderer Zeichensatz gewünscht sein, kann dieser hier angegeben werden. Siehe auch Info auf php.net.
Beispiel
<p><f:format.htmlentitiesDecode>Müller &
Breuer</f:format.htmlentitiesDecode>
Im Quelltext sieht man wieder ein richtig sauberes: "Müller & Breuer".
f:format.htmlspecialchars
Wenn Ihr mit Userdaten (Formulardaten) arbeitet, dann sollte dieser Inhalt zuallererst durch diesen
ViewHelper. Denn dieser wandelt alle spitzen Klammern von HTML-Tags in ein nicht mehr
interprtierbares Format um. Die HTML-Tags können also keinen Schaden mehr verursachen und
werden iom FE angezeigt statt verarbeitet.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value String Der Text der formatiert werden soll
Eigenschaft Datentyp Beschreibung
keepQuotes Boolean Sollen einfache und doppelte Anführungszeichen auch formatiert werden
encoding String
doubleEncode Boolean Mit jedem Aufruf diesen ViewHelpers wird ein bereits htmlspecialchared Text immer und immer wieder gehtmlspecialchared. Auf & wird dann & dann &amp;, dann &amp;amp; und so weiter. Um das zu verhindert, kann dieser Parameter auf FALSE gesetzt werden.
Beispiel
<f:format.htmlspecialchars><p><strong>fetter</strong>
Text</p></f:format.htmlspecialchars>
f:format.nl2br
Dieser ViewHelper besitzt keine Parameter. Den umzuwandelnden Inhalt bezieht er sich aus dem
Text zwischen den Tags. Sinnvoll wird dieser ViewHelper beim Anzeigen von Inhalten aus
TEXTAREA-Tags. Denn hier wurden die Zeilenumbrüche mit ENTER (CHR(10)) realisiert. HTML
sind diese Umbrüche aber völlig egal und würde den Text einfach hintereinander weg anzeigen. Um
das zu verhindern könnt Ihr diesen ViewHelper verwender. Er konvertiert alle CHR(10)-
Zeilenumbrüche in <br />-Tags und so werden Zeilenumbrüche auch im Browser wieder richtig
dargestellt.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
Beispiel
<f:format.nl2br>Text
mit
Zeilenumbrüchen</f:format.nl2br>
ergibt
Text<br />mit<br />Zeilenumbrüchen
f:format.number
Mit diesem ViewHelper könnt Ihr Zahlen formatieren. Er arbeitet ähnlich dem f:format.currency-
ViewHelper
Eigenschaften
Eigenschaft Datentyp Beschreibung
decimals Integer Wie viele Nachkommastellen dürfen angezeigt werden.
decimalSeperator String Welcher Zeichen soll für die Trennung von Euro und Cent verwendet werden. Dezimaltrenner.
thousandsSeperator String Welches Zeichen soll als Tausendertrennzeichen verwendet werden.
Beispiel
<f:format.number decimals="3" decimalSeparator="."
thousandsSeparator=",">1122334455.667788</f:format.number>
ergibt: 1,122,334,455.668. Wie Ihr seht wird sogar automatisch aufgerundet.
f:format.padding
Padding
Eigenschaften
Eigenschaft Datentyp Beschreibung
padLength Integer Wie viel Zeichen lang darf der Text inkl. der hinzugefügten Abstandszeichen maximal werden
padString String Welches Zeichen soll als Abstand dienen
Eigenschaft Datentyp Beschreibung
padType String Wo sollen die Abstandszeichen eingefügt werden. Zur Auswahl steht right, left und both
Beispiel zur Funktionsweise
<p><f:format.padding padLength="10" padString="-
=">TYPO3</f:format.padding>ist cool</p>
<p><f:format.padding padLength="10"
padString="#">Stefan</f:format.padding>ist cool</p>
<p><f:format.padding padLength="10" padString="
">Ich</f:format.padding>bin cool</p>
In diesem Beispiel wird das angegebene Zeichen oder die Zeichen solange wiederholt, bis das
Maximum an Zeichen erfüllt ist. Je nach Zeichensatz macht diese Darstellung wenig Sinn. Denn wie
Ihr seht beginnen die letzten beiden Wörter je Zeile immer an einer unterschiedlichen Stelle.
Beispiel mit sinnvoller Einrückung
<pre><f:format.padding padLength="10" padString="
">TYPO3</f:format.padding>ist cool<br />
<f:format.padding padLength="10" padString="
">Stefan</f:format.padding>ist cool<br />
<f:format.padding padLength="10" padString=" ">Ich</f:format.padding>bin
cool</pre>
Hier nahezu das gleiche Beispiel wie oben. Allerdings fangen die letzten beiden Wörter je Zeile nun
immer an der gleichen Position an. Mit Hilfe diesen ViewHelpers könnte man also so eine Art
Tabulator erstellen.
f:format.printf
Mit diesem ViewHelper können Platzhalter in einem Text mit den Werten auf dem Array ersetzt
werden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
arguments Array Gib hier Werte in Arraynotation ein, die die Platzhalter in dem Text, der sich zwischen den Tags befindet, ersetzt.
Beispiel
<f:format.printf arguments="{0: 'Stefan', 1: 2, 2: '4'}">%1$s hat eine
%3$d-seitige Dokumentation geschrieben und %2$d Tage dafür
gebraucht.</f:format.printf>
Mit %1, %2 und %3 wird der jeweilige Wert aus dem Array geholt. Da es unterschiedliche
Datentypen gibt, müssen wir jedem Wert noch mitteilen, um was für einen Datentyp es sich handelt.
Dabei steht $s für string also Text. $d für einen Zahlenwert, der auch ein Vorzeichen enthalten darf
und wie Ihr evtl. schon gesehen habt, habe ich die Zahl 4 als Text deklariert, gebe sie aber als Typ
Integer an den Text weiter. Weitere Infos auf php.net
Wenn dieser ViewHelper überhaupt nicht angezeigt wird, dann habt Ihr entweder einen Fehler in
Eurem Array oder Ihr habe die Typdefinition der Variablen wie $s oder $d vergessen mit
anzugeben.Parameter
f:format.raw
f:format.rawworks since 1.4 Es gibt viele ViewHelper, die Inhalte vor der Ausgabe durch
htmlspecialchars und anderen Methoden und Funktionen schleusen. Dies zu verhindern stellt auf
jeden Fall ein Sicherheitsrisiko dar, kann aber mit diesem ViewHelper erreicht werden. Ich denke
gerade im Bereich von Formulardaten kann dieser ViewHelper evtl. Verwendung finden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value Mixed Der Text, der unangetastet/unverändert ausgegeben werden soll
Beispiel
<f:format.raw value="{formData.nachricht}" />
f:format.stripTags
Dieser ViewHelper entfernt sämtliche HTML-Tags aus einem Text.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value String Der Text aus dem die HTML-Tags entfernt werden sollen
Beispiel
<f:format.stripTags>Ein <strong>fetter</strong> Text mit einigen <span
style="color: blue;">bunten</span> HTML-Tags.</f:format.stripTags>
f:format.urlencode
In Texten und Firmennamen kommen immer wieder Sonderzeichen wie @ & oder % vor. Diese
Zeichen sind nicht URL-sicher und sollten vor der Übermittlung durch diesen ViewHelper geschleust
werden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
value String Der Text, der für die Übergabe per Link vorbereitet werden soll
Beispiel
<f:format.urlencode>Text mit ein npaar Sonderzeichen, die für die URL
entsprechend maskiert werden müssen: @+%/</f:format.urlencode>
Ergebnis:
Text%20mit%20ein%20npaar%20Sonderzeichen%2C%20die%20f%C3%BCr%20die%20URL
%20entsprechend%20maskiert%20werden%20m%C3%BCssen%3A%20%40%2B%25%2F
ViewHelper: Link¶
f:link.action
Dieser ViewHelper erstellt einen Link zu einer anderen aufzurufenden Action
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
Eigenschaft Datentyp Beschreibung
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
name String Der name des Links
rel String Gibt die Beziehung zwischen dem aktuellen Dokument und dem verknüpften Dokument an
rev String Gibt die Beziehung zwischen dem verknüpften Dokument und dem aktuellen Dokument an
target String In welchem Fenster soll der Link geöffnet werden?
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
action String Auf welche Actionmethode soll der Link zeigen
arguments Array Welche Argumente/Parameter sollen dem Link angehängt werden
controller String Auf welchen Controller soll der Link zeigen
extensionName String Auf welchen Controller und/oder Action welcher Extension soll der Link zeigen
pluginName String Auf welchen Controller und/oder Action welchen Plugins soll der Link zeigen
pageUid Integer Auf welche Seiten-UID soll verlinkt werden
Eigenschaft Datentyp Beschreibung
pageType Integer Auf welche Seitentyp ID soll verlinkt werden.
noCache Boolean Verhindert das Caching der aufzurufenden Seite
noCacheHash Boolean Verhindert, dass der cHash-Parameter nicht mit an die URL angehangen wird.
section String Auf welchen Anker soll die Zielseite springen (#anker)
format String Gibt an um welches Format es sich bei der Zielseite handelt. Alternativ gibt es noch "xml"
linkAccessRestrictedPages Boolean Normalerweise werden Links auf geschützte Seiten nicht erzeugt. Hier mit kann man die Linkgeneration erzwingen.
additionalParams Array Fügt weitere Parameter der Zielseite an. Im Gegensatz zu arguments, können hiermit Variablen hinzugefügt werden die nicht mit dem Extensionnamen geprefixed werden.
absolute Boolean Nach Aktivierung wird der Zeilseite noch der Domainname und Pfad vorangestellt.
addQueryString Boolean Falls der aktuellen Seite bereits Parameter über die URL mitgegeben wurden, könnt Ihr hier nun entscheiden, ob diese Parameter auch mit auf die Zielseite übergeben werden.
argumentsToBeExcludedFromQueryString Array Falls Ihr addQueryString aktiviert habt, aber einen oder zwei bestimmte Parameter wieder entfernen wollt, dann tragt Ihr hier diese Parameter ein.
Beispiel
<f:link.action action="show">Zeige Details</f:link.action>
f:link.email
Mit diesem ViewHelper erstellt Ihr einen Link auf eine E-Mail-Adresse. Falls Ihr mit TypoScript im
Bereich "config" Angaben zum Verschlüsseln der E-Mail-Adresse gemacht habt, so werden diese
Einstellungen auch hier angewendet.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
name String Der name des Links
rel String Gibt die Beziehung zwischen dem aktuellen Dokument und dem verknüpften Dokument an
rev String Gibt die Beziehung zwischen dem verknüpften Dokument und dem aktuellen Dokument an
target String In welchem Fenster soll der Link geöffnet werden?
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung Standard
email String Die zu verlinkende E-Mail-Adresse
Beispiel
<f:link.email email="[email protected]" />
f:link.external
Dieser ViewHelper erstellt einen Link zu einer externen Seite.
Tip
Wenn Ihr bei uri einen vollständigen Link angebt, also inkl. http:// oder ftp://, dann braucht Ihr
defaultScheme nicht zu setzen.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
name String Der name des Links
rel String Gibt die Beziehung zwischen dem aktuellen Dokument und dem verknüpften Dokument an
rev String Gibt die Beziehung zwischen dem verknüpften
Eigenschaft Datentyp Beschreibung
Dokument und dem aktuellen Dokument an
target String In welchem Fenster soll der Link geöffnet werden?
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
uri String Die URL zu der externen Zielseite
defaultScheme String Hier sind alle gültigen Schemas für Links erlaubt wie z.B. ftp oder https
Beispiel
<f:link.external uri="www.example.com">Externer Link zu meiner
Seite</f:link.external>
f:link.page
Dieser ViewHelper erstellt einen Link zu einer anderen Seiten-UID
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach
Eigenschaft Datentyp Beschreibung
rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
target String In welchem Fenster soll der Link geöffnet werden?
rel String Gibt die Beziehung zwischen dem aktuellen Dokument und dem verknüpften Dokument an
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
pageUid Integer|NULL Auf welche Seiten-UID soll verlinkt werden
Eigenschaft Datentyp Beschreibung
additionalParams Array Fügt weitere Parameter der Zielseite an. Im Gegensatz zu arguments, können hiermit Variablen hinzugefügt werden die nicht mit dem Extensionnamen geprefixed werden.
pageType Integer Auf welche Seitentyp ID soll verlinkt werden.
noCache Boolean Verhindert das Caching der aufzurufenden Seite
noCacheHash Boolean Verhindert, dass der cHash-Parameter nicht mit an die URL angehangen wird.
section String Auf welchen Anker soll die Zielseite springen (#anker)
linkAccessRestrictedPages Boolean Normalerweise werden Links auf geschützte Seiten nicht erzeugt. Hier mit kann man die Linkgeneration erzwingen.
absolute Boolean Nach Aktivierung wird der Zeilseite noch der Domainname und Pfad vorangestellt.
addQueryString Boolean Falls der aktuellen Seite bereits Parameter über die URL mitgegeben wurden, könnt Ihr hier nun entscheiden, ob diese Parameter auch mit auf die Zielseite übergeben werden.
argumentsToBeExcludedFromQueryString Array Falls Ihr addQueryString aktiviert habt, aber einen oder zwei bestimmte Parameter wieder entfernen wollt, dann tragt Ihr hier diese Parameter ein.
Beispiel
<f:link.page pageUid="134">Linkname für die Seite 134</f:link.page>
ViewHelper: Security¶
f:security.ifAuthenticated
Eigenschaften
f:security.ifHasRole
Eigenschaften
ViewHelper: Uri
f:uri.action
Dieser ViewHelper erstellt einen Link zu einer anderen aufzurufenden Action
Eigenschaften
Eigenschaft Datentyp Beschreibung
action String Auf welche Actionmethode soll der Link zeigen
arguments Array Welche Argumente/Parameter sollen dem Link angehängt werden
controller String Auf welchen Controller soll der Link zeigen
extensionName String Auf welchen Controller und/oder Action welcher Extension soll der Link zeigen
pluginName String Auf welchen Controller und/oder Action welchen Plugins soll der Link zeigen
pageUid Integer Auf welche Seiten-UID soll verlinkt werden
pageType Integer Auf welche Seitentyp ID soll verlinkt werden.
noCache Boolean Verhindert das Caching der aufzurufenden Seite
noCacheHash Boolean Verhindert, dass der cHash-Parameter nicht mit an die URL angehangen wird.
section String Auf welchen Anker soll die Zielseite springen (#anker)
format String Gibt an um welches Format es sich bei der Zielseite handelt. Alternativ gibt es noch "xml"
Eigenschaft Datentyp Beschreibung
linkAccessRestrictedPages Boolean Normalerweise werden Links auf geschützte Seiten nicht erzeugt. Hier mit kann man die Linkgeneration erzwingen.
additionalParams Array Fügt weitere Parameter der Zielseite an. Im Gegensatz zu arguments, können hiermit Variablen hinzugefügt werden die nicht mit dem Extensionnamen geprefixed werden.
absolute Boolean Nach Aktivierung wird der Zeilseite noch der Domainname und Pfad vorangestellt.
addQueryString Boolean Falls der aktuellen Seite bereits Parameter über die URL mitgegeben wurden, könnt Ihr hier nun entscheiden, ob diese Parameter auch mit auf die Zielseite übergeben werden.
argumentsToBeExcludedFromQueryString
Array Falls Ihr addQueryString aktiviert habt, aber einen oder zwei bestimmte Parameter wieder entfernen wollt, dann tragt Ihr hier diese Parameter ein.
Beispiel
<f:link.action action="show">Zeige Details</f:link.action>
f:uri.email
Mit diesem ViewHelper erstellt Ihr einen Link auf eine E-Mail-Adresse. Falls Ihr mit TypoScript im
Bereich "config" Angaben zum Verschlüsseln der E-Mail-Adresse gemacht habt, so werden diese
Einstellungen auch hier angewendet.
Eigenschaften
Eigenschaft Datentyp Beschreibung Standard
email String Die zu verlinkende E-Mail-Adresse
Beispiel
<f:link.email email="[email protected]" />
f:uri.external
Dieser ViewHelper erstellt einen Link zu einer externen Seite.
Tip
Wenn Ihr bei uri einen vollständigen Link angebt, also inkl http:// oder ftp://, dann braucht Ihr
defaultScheme nicht zu setzen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
uri String Die URL zu der externen Zielseite
defaultScheme String Hier sind alle gültigen Schemas für Links erlaubt wie z.B. ftp oder https
Beispiel
<f:link.external uri="www.example.com">Externer Link zu meiner Seite</f:link.external>
f:uri.image
Eigenschaften
Eigenschaft Datentyp Beschreibung
src String Pfad und Dateiname zum Bild. Der Pfad muss vom Webroot aus angegeben werden. Konstanten wie EXT: können verwendet werden.
width String Breite des Bildes. Neben einem numerischen Wert können hier auch Angaben mit "c" oder "m" verwendet werden, um das Bild entsprechend zu skalieren.
height String Höhe des Bildes. Neben einem numerischen Wert können hier auch Angaben mit "c" oder "m" verwendet werden, um das Bild entsprechend zu skalieren.
minWidth Integer Minimale Breite des Bildes. Falls das Bild kleiner ist, wird es automatisch auf diese Breite vergrößert. Hinweis: Falls Ihr im Installtool [GFX][im_noScaleUp] aktiviert habt, wird das Bild nicht vergrößert.
minHeight Integer Minimale Höhe des Bildes. Falls das Bild kleiner ist, wird es automatisch auf diese
Eigenschaft Datentyp Beschreibung
Höhe vergrößert. Hinweis: Falls Ihr im Installtool [GFX][im_noScaleUp] aktiviert habt, wird das Bild nicht vergrößert.
maxWidth Integer Maximale Breite des Bildes. Falls das Bild größer ist, wird es automatisch auf diese Breite verkleinert.
maxHeight Integer Maximale Höhe des Bildes. Falls das Bild größer ist, wird es automatisch auf diese Breite verkleinert.
treatIdAsReference Boolean Wenn TRUE, dann wird die Angabe bei src als sys_file_reference interpretiert. FALSE als sys_file oder Dateipfad
f:uri.page
Eigenschaften
Eigenschaft Datentyp Beschreibung
pageUid Integer|NULL Auf welche Seiten-UID soll verlinkt werden
additionalParams Array Fügt weitere Parameter der Zielseite an. Im Gegensatz zu arguments, können hiermit Variablen hinzugefügt werden die nicht mit dem Extensionnamen geprefixed werden.
pageType Integer Auf welche Seitentyp ID soll verlinkt werden.
noCache Boolean Verhindert das Caching der aufzurufenden Seite
noCacheHash Boolean Verhindert, dass der cHash-Parameter nicht mit an die URL angehangen wird.
section String Auf welchen Anker soll die Zielseite springen (#anker)
linkAccessRestrictedPages Boolean Normalerweise werden Links auf geschützte Seiten nicht erzeugt. Hier mit kann man die Linkgeneration erzwingen.
absolute Boolean Nach Aktivierung wird der Zeilseite noch der Domainname und Pfad vorangestellt.
addQueryString Boolean Falls der aktuellen Seite bereits Parameter über die URL mitgegeben wurden, könnt Ihr hier nun entscheiden, ob diese Parameter auch mit auf die Zielseite übergeben werden.
argumentsToBeExcludedFromQueryString
Array Falls Ihr addQueryString aktiviert habt, aber einen oder zwei bestimmte Parameter wieder entfernen wollt, dann tragt Ihr hier diese Parameter ein.
f:uri.resource
Eigenschaften
Eigenschaft Datentyp Beschreibung
path String Der Pfad inkl. Dateiname zu der Datei. Die Angabe erfolgt relativ zum Resource-Verzeichnis der aktuellen Extension.
extensionName String Falls eine Datei einer anderen Extension benötigt wird, kann hier der entsprechende Extensionname angegeben werden. Auch hier muss die Pfad relativ zum Resourceverzeichnis angegeben werden.
absolute Boolean Wenn dieser Wert auf TRUE gesetzt wird, wird ein absoluter Pfad zurück geliefert.
ViewHelper: Widgets¶
f:widget.autocomplete
f:widget.link
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
Eigenschaft Datentyp Beschreibung
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
f:widget.link
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
Eigenschaft Datentyp Beschreibung
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
f:widget.paginate
f:widget.uri
f:alias
Dieser ViewHelper erstellt Variablen, die Ihr im weiteren Verlauf wieder verwenden könnt. Ihr könnt
den Variablen entweder einen eigenen statischen Wert oder aber dynamische Werte aus Objekten
und anderen ViewHelpern zuweisen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
map Array Der Key gibt den Namen der neuen Variable an, während der Value den Inhalt wieder spiegelt.
Beispiel für statische Werte
<f:alias map="{firstName: 'Stefan', lastName: 'Froemken'}">
<p>Hello, my name is {firstName} {lastName}</p>
</f:alias>
Ausgabe
<p>Hello, my name is Stefan Froemken</p>
Beispiel für Ergebnisse aus ViewHelpern
<f:alias map="{amount: '{addresses->f:count()}'}">
<p>There are {amount} records in database</p>
</f:alias>
Ausgabe
<p>There are 23 records in database</p>
Beispiel für Werte aus Objekten
<f:alias map="{firstName: address.firstName, lastName: address.lastName}">
<p>Hello, my name is {firstName} {lastName}</p>
</f:alias>
Ausgabe
<p>Hello, my name is Stefan Froemken</p>
f:base
Dieser ViewHelper bindet den base-Tag in Euer HTML-Template ein.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
Beispiel
<f:base />
Ausgabe
<base href="http://introgit:8080/">
Tip
Dieser ViewHelper macht nur dann Sinn, wenn Ihr Euer Webseitentemplate (inkl. Kopfbereich
<head>) mit Hilfe von Fluid aufbaut. Wenn kein <head>-Bereich vorhanden ist, wird dieser HTML-
Tag im Bodybereich der Webseite eingebunden, wo er nicht hingehört.
f:case
Dieser ViewHelper ist Bestandteil des f:switch.ViewHelpers. Wenn der Wert aus value dem Wert aus
f:switch übereinstimmt dann wird der enthaltene Text verarbeitet und ausgegeben.
Eigenschaften
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
value Mixed Gebt hier den Wert an, der vom f:switch ViewHelper als Entscheidungskriterium zur Vefügung gestellt werden könnte.
Beispiel
Beispiele zur Verwendung des f:case-ViewHelpers findet Ihr im f:switch-ViewHelper
f:cObject
Dieser ViewHelper stellt eine Verbindung zu TypoScript her. Übergebt einen TypoScript Objekt Pfad
(lib.*) und lasst TypoScript die Arbeit machen.
Eigenschaften
Eigenschaft Datentyp Beschreibung Standard
typoscriptObjectPath String Gebt hier den TypoScript Objektpfad an
data Mixed Gebt hier den TypoScript Objektpfad an
NULL
currentValueKey String Gebt hier den TypoScript Objektpfad an
NULL
Einfaches Beispiel
TypoScript
lib.fluidText = TEXT
lib.fluidText {
value = Text from TypoScript
}
Fluid-Template
<p><f:cObject typoscriptObjectPath="lib.fluidText" /></p>
Ausgabe
<p>Text from TypoScript</p>
Beispiel für lokalisierte Datumswerte
Der f:format.date ViewHelper arbeitet mit der PHP Funktion date() und kann somit nur englische
Monatsnamen ausgeben. Besser wäre da schon die Verwendung von strftime. TypoScript bietet
strftime formatierte Datumswerte an. Hier ein Beispiel unter Verwendung von current:
TypoScript
lib.formattedDate = TEXT
lib.formattedDate {
current = 1
strftime = %d. %B %Y
}
Fluid-Template
<p><f:cObject
typoscriptObjectPat
h="lib.formattedDate">{address.dayOfBirth}</f:cObject></p>
Ausgabe
<p>17. Januar 2013</p>
Beispiel mit einem Array/Objekt
TypoScript
lib.address = COA
lib.address {
10 = TEXT
10.value.current = 1
10.value.wrap = <p>First name: |</p>
20 = TEXT
20.value.dataWrap = <p>Full name: {field: firstName} {field: lastName}
}
Fluid-Template
<f:cObject typoscriptObjectPath="lib.address" data="{address}"
currentValueKey="firstName" />
Ausgabe
<p>First name: Stefan</p><p>Full name: Stefan Froemken</p>
Tip
Wie oben bereits erklärt, könnt Ihr mit currentValueKey angeben, welcher Wert aus dem Array oder
Objekt über current=1 zur Verfügung gestellt werden soll. Auf die anderen Werte eines Arrays oder
Objektes könnt Ihr dann wie hier im Beispiel mit "field" zugreifen.
f:comment
Alles was sich innerhalb des f:comment ViewHelpers befindet, wird schlichtweg entfernt. Evtl.
enthaltene ViewHelper werden nicht ausgeführt. Dieser ViewHelper ist gerade beim Debuggen von
Webseiten sinnvoll. So könnt Ihr damit z.B. f:for-Schleifen temporär ausblenden, um die Fehlersuche
auf das Wesentliche zu beschränken.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
Beispiel
<f:comment>
<p>This text will not be displayed</p>
<p>My name is: {address.firstName}</p>
</f:comment>
<p>{address.firstName} lives in city xyz</p>
<![CDATA[<p>This text was made by {address.firstName} and will be
displayed but not processed.</p>]]>
Ausgabe
<p>Stefan lives in city xyz</p>
<p>This text was made by {address.firstName} and will be displayed but not
processed.</p>
Tip
Die letzte Zeile ist etwas Besonderes. Denn mit Hilfe dieser CDATA-Notation, könnt Ihr die
Verarbeitung der Platzhalter unterbrechen. Der Text wird zwar angezeigt, aber der Platzhalter
{address.firstName} wird nicht ersetzt. Dies hat gerade dann den Vorteil, wenn Ihr in Eurem
Template JavaScript verwendet.
f:count
Dieser ViewHelper zählt die Elemente in dem angegebenen Objekt oder Array.
Eigenschaften
Eigenschaft Datentyp Beschreibung
subject Array Gebt hier das Array oder Objekt an, das gezählt werden soll. Wenn dieser Wert leergelassen wird, dann versucht der ViewHelper, den Inhalt zwischen den Tags als Array zu interpretieren und zählt diesen.
Beispiel: Array als renderChildren
<p>There are <f:count>{addresses}</f:count> records in our database</p>
Ausgabe
<p>There are 23 records in our database</p>
Beispiel: Array über subject
<p>There are <f:count subject="{addresses}" /> records in our database</p>
Ausgabe
<p>There are 23 records in our database</p>
Beispiel: Inlinenotation
<p>There are {f:count(subject: addresses)} records in our database</p>
Ausgabe
<p>There are 23 records in our database</p>
Beispiel: Die bessere Inlinenotation
<p>There are {addresses -> f:count()} records in our database</p>
Ausgabe
<p>There are 23 records in our database</p>
f:cycle
Mit diesem ViewHelper könnt Ihr die Ausgaben des f:for-ViewHelpers aufpeppen und zum Beispiel
odd/even-Tabellen erstellen. Zwar könnt Ihr mit dem f:for ViewHelper auf das erste und letzte
Element der Schleife zugreifen, aber um jeder zweiten oder dritten Zeile ein anderes Aussehen zu
verpassen, benötiget Ihr f:cycle.
Eigenschaften
Eigenschaft Datentyp Beschreibung
values Array Eingabe als Arraynotation. Erläuterung im Beispiel
as String Gebt hier den Namen der neuen Variable für das Template an
Beispiel
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{addresses}" as="address">
<f:cycle values="{0: 'green', 1: 'red', 2: 'blue'}" as="color">
<tr>
<td style="color: {color}">{address.firstName}</td>
<td style="color: {color}">{address.lastName}</td>
</tr>
</f:cycle>
</f:for>
</table>
Ausgabe
<table cellpadding="5" cellspacing="0" border="2">
<tr>
<td style="color: green">Stefan</td>
<td style="color: green">Froemken</td>
</tr>
<tr>
<td style="color: red">Bastian</td>
<td style="color: red">Krump</td>
</tr>
<tr>
<td style="color: blue">Thorsten</td>
<td style="color: blue">Ploemi</td>
</tr>
<tr>
<td style="color: green">Max</td>
<td style="color: green">Mustermann</td>
</tr>
</table>
f:debug
Falls eine eurer Variablen wieder erwarten nichts ausgeben sollte, könnt ihr mit Hilfe dieses
ViewHelpers die Inhalte eurer Variablen anzeigen lassen. In der Ausgabe seht ihr dann, ob euer
gewünschter Wert überhaupt gefüllt ist oder nicht.
Eigenschaften
Eigenschaft Datentyp Beschreibung
title String Mit dieser Eigenschaft könnt ihr der Debug-Ausgabe einen Titel geben, um die Ausgabe zwischen eventuell weiteren vorhandenen Ausgaben schneller identifizieren zu können.
maxDepth Integer Zu Zeiten vor TYPO3 4.7 wurden Arrays und Objekte immer komplett dargestellt. Je nach Objektgröße und Verschachtelung brach diese Darstellung jedoch ab. Mit dieser Eigenschaft werden die Arrays und Objekte nur noch bis zu einer Tiefe von 8 Verschachtelungen dargestellt, um das Problem zu umgehen. Je nach Rechnerleistung und Ausführungszeitraum könnt ihr die Tiefe entsprechend anpassen.
Eigenschaft Datentyp Beschreibung
plainText Boolean Für den CLI-Modus könnt ihr hier die Debug-Ausgabe als reinen Text ausgeben lassen.
ansiColors Boolean Bestimmte Shells unterstützen die farbliche Hervorhebung von Wörtern in einem Text. Nach Aktivierung werden der Debug-Ausgabe zusätzliche Steuerzeichen hinzugefügt, damit die Shell die Hervorhebung vornehmen kann. Dieses funktioniert nur zusammen mit 'plainText'.
inline Boolean Normalerweise erscheint die Debug-Ausgabe oberhalb der Webseite. Mit 'inline' erscheint die Ausgabe genau an der Stelle des f:debug-ViewHelpers.
blacklistedClassNames Array Hiermit können ausgewählte Klassen hervorgehoben werden. Funktioniert im Augenblick (?) nicht mit Namespaces.
blacklistedPropertyNames Array Hiermit können ausgewählte Objekteigenschaften hervorgehoben werden. Funktioniert im Augenblick (?) nicht mit Namespaces.
Tip
Das Debuggen von Aggregate-Root-Objekten führte in früheren Versionen immer wieder zu
Problemen. Viele Objekte sind sehr tief verschachtelt oder sind rekursiv aufrufbar. Dies führte in
vielen Fällen zur Überschreitung der in php.ini definierten memory_limit oder auch zur
Überschreitung der max_execution_time. In solchen Fällen hat es geholfen nur einen Teil des
Objektes zu debuggen oder das komplette Objekt in ein Array zu konvertieren.
Beispiele
<f:debug title="Results of customers">{customers}</f:debug>
{customers -> f:debug(title="Results of customers")}
{f:debug(subject: customers, title: "Results od customers")}
f:else
Dieser ViewHelper wird im Bereich f:if erklärt, da er nur dort verwendet werden kann.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
f:escape
Veraltet seit Extbase 1.4.0. Wird mit der Extbaseversion 1.6.0 entfernt. Bitte verwendet statt dessen
f:format.* ViewHelper.
f:flashMessages
Dieser ViewHelper macht nur im Bereich selbstprogrammierter Extensions Sinn. Denn nur hier
können Fehler auftauchen, die dem Webseitenbesucher mitgeteilt werden müssen. Hat der User
z.B. vergessen bei einem Loginformular seinen Usernamen anzugeben und die dafür zuständige
Action/Methode wurde so programmiert, dass der Username eine Pflichtangabe ist, dann wird dies
dem Validator gemeldet, der daraufhin eine errorAction-Methode aufruft, die dann wiederum
Fehlermeldungen zuerst sammelt und dann als "Bündel" an der Stelle ausgibt, an der Ihr diesen
ViewHelper-Tag platziert habt.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-
Eigenschaft Datentyp Beschreibung
Elemtent ausgeführt werden soll
Eigenschaft Datentyp Beschreibung
renderMode String Sollen die Fehlermeldungen als Liste (ul) oder als Container (div) gerendert werden
Beispiel Standard
<f:flashMessages />
Beispiel als Container
<f:flashMessages renderMode="div" />
f:for
Der f:for-ViewHelper ist DER ViewHelper für die Listengeneration. Schaut Euch die Erläuterung in
den Beispielen an.
Eigenschaften
Eigenschaft Datentyp Beschreibung
each Array Array oder Objekt, das durchlaufen werden soll
as String Ein Variablenname, der Daten des aktuellen Durchlaufs enthält
key String Falls Ihr den Key/Schlüssel des aktuellen Durchlaufes benötigt, könnt Ihr hiermit den Namen einer weiteren Variable definieren
reverse Boolean Der Durchlauf des Arrays oder Objektes geschieht rückwärts
iteration String Eine Arrayvariable, die Informationen darüber beinhaltet, ob man sich im ersten oder letzten Durchlauf befindet. Außerdem enthalten: index, cycle, total, isEven, isOdd
Einfaches Beispiel
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege">
<tr>
<td>{kollege.vorname}</td>
<td>{kollege.stadt}</td>
</tr>
</f:for>
</table>
</f:alias>
Ich weise der Variable mitarbeiter 6 Einträge zu, die dann eins nach dem Anderen von f:for
durchlaufen werden. Mit jedem Durchlauf wird eine weitere Tabellenzeile erstellt.
Beispiel für rückwärts
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege" reverse="1">
<tr>
<td>{kollege.vorname}</td>
<td>{kollege.stadt}</td>
</tr>
</f:for>
</table>
</f:alias>
Zu Info: Man könnte bei dem Parameter reverse auch TRUE statt 1 verwenden.
Beispiel mit key/Schlüssel
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege" reverse="1" key="eintrag">
<tr>
<th colspan="2">Eintrag: {eintrag}</th>
</tr>
<tr>
<td>{kollege.vorname}</td>
<td>{kollege.stadt}</td>
</tr>
</f:for>
</table>
</f:alias>
Beispiel mit Durchlaufinformationen
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege" iteration="iterator">
<f:if condition="{iterator.isFirst}">
<tr>
<th colspan="2">Los gehts</th>
</tr>
</f:if>
<tr>
<td>Durchlauf beginnend bei 0: {iterator.index}</td>
<td>Durchlauf beginnend bei 1: {iterator.cycle}</td>
<td{f:if(condition:iterator.isOdd, then: ' style="color:
green;"')}>{kollege.vorname}</td>
<td{f:if(condition:iterator.isEven, then: ' style="color:
red;"')}>{kollege.stadt}</td>
</tr>
<f:if condition="{iterator.isLast}">
<tr>
<th colspan="2">Eintraege: {iterator.total}</th>
</tr>
</f:if>
</f:for>
</table>
</f:alias>
iterator.cycle ist genau wie iterator.index einfach nur ein Zähler und hat nichts mit dem ViewHelper
f:cycle zu tun. Dieses Beispiel zeigt die Verwendung aller Durchlaufinformationen. Auch wenn Ihr
den f:if-ViewHelper noch nicht kennengelernt haben solltet, so sollte dieses Beispiel selbsterklärend
sein. Probierts mal aus.
f:form
Der f:form-ViewHelper schaut von seinen ganzen Parametern extremst gewaltig aus. Aber wenn
man mal bedenkt das allein 11 Parameter nur für die Generierung der Zielseiten-URL zuständig
sind, bleibt nur noch eine handvoll Parameter übrig. Der große Vorteil diesen ViewHelpers ist
Sicherheit und Arbeitserleichterung, die wir uns in den Beispielen mal näher anschauen.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach
Eigenschaft Datentyp Beschreibung
rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
enctype String Mit welchem Encoding sollen die Daten des Formulars versendet werden?
method String Übertragungsmethode. Mögliche Werte sind GET oder POST
name String Name des Formulars
onreset String JavaScript, das ausgeführt werden soll, wenn der Reset-Button für das Formular gedrückt wurde
onsubmit String JavaScript, das ausgeführt werden soll, wenn der Submit-
Eigenschaft Datentyp Beschreibung
Button für das Formular gedrückt wurde
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
action String Welche Actionmethode soll aufgerufen werden, wenn das Formular abgesendet wird
arguments Array Welche zusätzlichen Variablen sollen beim Absenden mit übergeben werden
controller String Falls sich die gewünschte Actionmethode nicht im gleichen Controller befindet, muss hier dieser entsprechende Controller angegeben werden
extensionName String Falls das Formular von einer anderen Extension abgearbeitet werden soll, dann muss hier der Extensionname ohne tx_ und ohne Unterstriche angegeben werden
pluginName String Falls das Formular von einem anderen Plugin abgearbeitet werden soll, dann muss hier der Pluginname angegeben werden
pageUid Integer Seiten-UID eintragen, wenn das Formular von einer anderen Seite aus abgearbeitet werden soll
object Mixed Übergebt hier ein Objekt mit Eigenschaften, die die Eingabefelder im Formular wiederspiegeln.
pageType Integer Gebt hier eine Seitentyp ID an, die das Formular abarbeiten soll. Könnte für AJAX interessant sein.
noCache Boolean Kann aktiviert werden, um das Caching für die Zielseite zu deaktivieren.
noCacheHash Boolean Nach Aktivierung wird dem generierten Link zur Zielseite kein cHash-Parameter angehangen
Eigenschaft Datentyp Beschreibung
section String Definition eines Ankers zu dem auf der Zielseite gesprungen werden soll. Interessant wir Seiten auf denen viele Inhalte sind.
format String Gibt an um welches Format es sich bei der Zielseite handelt. Alternativ ginge auch "xml", obwohl das bei einer Formularzielseite wenig Sinn machen würde. Klappt nur wenn actionUri nicht gesetzt ist.
additionalParams Array Fügt weitere Variablen der Zielseite an. Im Gegensatz zu arguments, können hiermit Variablen hinzugefügt werden die nicht mit dem Extensionnamen geprefixed werden. Klappt nur wenn actionUri nicht gesetzt ist.
absolute Boolean Nach Aktivierung wird der Zeilseite noch der Domainname und Pfad vorangestellt. Klappt nur wenn actionUri nicht gesetzt ist.
addQueryString Boolean Falls dem Formular bereits Parameter über die URL mitgegeben wurden, könnt Ihr hier nun entscheiden, ob diese Parameter auch mit auf die Zielseite übergeben werden. Klappt nur wenn actionUri nicht gesetzt ist.
argumentsToBeExcludedFromQueryString Array Falls Ihr addQueryString aktiviert habt, aber einen oder zwei bestimmte Parameter wieder entfernen wollt, dann tragt Ihr hier diese Parameter ein. Klappt nur wenn actionUri nicht gesetzt ist.
fieldNamePrefix String Falls ein anderer Prefix gewünscht ist. Macht eigentlich nur Sinn, wenn die Formulardaten von einer anderen Extension abgearbeitet werden müssen.
actionUri String Gebt hier Eure ganz eigene individuelle Zielseiten-URL ein. Viele der oberen Parameter haben aber dann keinen Wirkung mehr.
objectName String Hier kommt ein Objekt- bzw. Modelname rein, in das die nach Absenden gesammelten Formulardaten gespeichert werden sollen. Hat den Vorteil, dass Ihr nicht in jeder Action die Formulardaten überprüfen, sondern die Überprüfung nur einmalig im Model vornehmen müsst.
Beispiel
<f:form object="{feUser}" objectName="newFeUser">
<f:form.textarea property="firstName" rows="5" cols="50" />
</f:form>
Hier eine üngefähre Ausgabe was nun im Seitenquelltext hinzugefügt wurde:
<form action="/typo3_46/index.php?id=6&tx__%5Bcontroller
%5D=Standard&cHash=d1469ddb628871564f3257920c1f6ee8" method="post">
<div style="display: none">
<input type="hidden" name="__referrer[extensionName]" value="" />
<input type="hidden" name="__referrer[controllerName]"
value="Standard" />
<input type="hidden" name="__referrer[actionName]" value="index" />
<input type="hidden" name="__hmac" value="a:2:
{s:9:"newFeUser";a:1:
{s:9:"firstName";i:1;}s:4:"tx__";a:1:
{s:10:"controller";i:1;}}ff5ff9b62f7b5c49a696d3f7b1009991853d653
3" />
</div>
<textarea rows="5" cols="50" name="newFeUser[firstName]"></textarea>
</form>
Hier seht Ihr das Thema Sicherheit. Fluid baut automatisch einen versteckten Bereich mit ein paar
Werten in Euer Formular ein. Unteranderem befindet sich dort ein __hmac-Wert. Innerhalb diesen
Wertes sind alle erlaubten Formularfelder nochmals enthalten. Wenn also über bestimmte
Webseitenattacken Felder entfernt oder hinzugefügt werden, dann kann Extbase später feststellen,
dass die Anzahl und/oder Feldnamen nicht übereinstimmen und wirft eine Fehlermeldung. Das
Formular kann also nicht abgesendet werden.
Im Beispiel haben wir noch den Objektnamen "newFeUser" angegeben. Wie Ihr seht wurde dieser
Wert jedem Feld in meinem Formular vorangestellt. Das hat den Vorteil, dass Eure Formularfelder
nicht einzeln, sondern gebündelt in einem Array an die Zielseite übertragen werden. Dort
angekommen könnt Ihr Eurer Action mitteilen, dass der Inhalt diesen Arrays in ein Modell portiert
werden soll. Bei dieser Portierung werden auch automatisch die enthaltenen Werte auf Gültigkeit
überprüft, sofern Ihr überhaupt Überprüfungsregeln in Euren Modellen angegeben habt. Nur wenn
alle Überprüfungen gültig waren, kann das Modell mit den Formulardaten an die Action übergeben
werden und dort mit einem Einzeiler in der Datenbank gespeichert werden.
f:groupedFor
Ein sehr mächtiger ViewHelper im Bereich der Listengenerierung. Übergebt dem ViewHelper ein
Array und ein Gruppierungskriterium und Ihr erhaltet mit jedem Durchlauf bzw. mit jeder gefundenen
Gruppe ein Array mit den dazugehörigen Arrayelementen zurück.
Eigenschaften
Eigenschaft Datentyp Beschreibung
each Array Array oder Objekt, das durchlaufen werden soll
as String Ein Variablenname, der die gruppierten Datensätze enthält
groupBy String anhand welcher Eigenschaft soll das Array gruppiert werden
groupKey String Innerhalb der f:groupedBy-Tags kann mit dieser Variable auf den gruppierten Wert zugegriffen werden.
Beispiel
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:groupedFor each="{mitarbeiter}" as="kollegen" groupBy="stadt"
groupKey="stadt">
<tr>
<th colspan="2">{stadt}</th>
</tr>
<f:for each="{kollegen}" as="kollege">
<tr>
<td style="color: {color}">{kollege.vorname}</td>
<td style="color: {color}">{kollege.stadt}</td>
</tr>
</f:for>
</f:groupedFor>
</table>
</f:alias>
Hier wieder das Beispiel mit den 6 Mitarbeitern. Wie Ihr sehen könnt gruppiert der f:groupedBy-
ViewHelper diese Mitarbeiter anhand ihrer Städte (groupBy). Das geübte Auge sieht evtl. sofort,
dass die ersten beiden Arrayeinträge in Lindlar wohnen. Um innerhalb der f:groupedBy-Tags auf
diesen Städtenamen zugreifen zu können, verwendet Ihr den Parameter groupKey. Der Wert aus
groupBy und groupKey müssen nicht übereinstimmen. Innerhalb von groupKey könntet Ihr auch
einfach city nehmen.
Über die Variable "as" könnt Ihr nun auf die Elemente der ersten gefundenen Gruppe zugreifen und
mit f:for durchlaufen lassen.
f:if
Auch wenn dieser ViewHelper in seiner Ausführung noch etwas eingeschränkt ist gehört er trotzdem
zu den ViewHelpern, die Ihr auswendig kennen solltet. Wer sich mal den fed:if-ViewHelper aus der
fed-Extension angeschaut hat, weiß wovon wir reden.
Eigenschaften
Eigenschaft Datentyp Beschreibung
condition Boolean Hier kommt die Vergleichtsabfrage rein (Siehe Beispiele)
Folgende Vergleiche sind erlaubt: ==, !=, <, <=, >, >= und %
Vergleicht werden können nur Variablen folgenden Typs: Zahlen, Objekteigenschaften, Arrays und
Ergebnisse aus ViewHelpern
Einfache Beispiele
<f:alias map="{wert1: 1, wert5: 5}">
<f:if condition="{wert1}==1">
<p>Der Wert ist 1</p>
</f:if>
<f:if condition="{wert5}==5">
<f:then>
<p>Der Wert ist 5</p>
</f:then>
<f:else>
<p>Der Wert ist NICHT 5</p>
</f:else>
</f:if>
<f:if condition="{wert5} % 2">
<f:then>
<p>Die Berechnung liefert einen Restwert von 1.</p>
</f:then>
<f:else>
<p>Es konnte kein Restwert ermittelt werden</p>
</f:else>
</f:if>
<f:if condition="{wert1}!={wert5}">
<p>wert1 ist NICHT gleich wert5</p>
</f:if>
<f:if condition="{wert1}<{wert5}">
<p>wert1 ist kleiner als wert5</p>
</f:if>
<f:if condition="{0:wert1,1:wert5}=={0:1,1:5}">
<p>Der erste Array ist gleich mit allen Werten aus dem zweiten
Zahlenarray</p>
</f:if>
</f:alias>
<f:alias map="{elemente: {0: wert1, 1: wert2}}">
<f:if condition="{elemente -> f:count()==2">
<p>Vergleich mit ViewHelpern: Das Elementearray beinhaltet 2
Elemente</p>
</f:if>
</f:alias>
<f:alias map="{wert1: 'hallo'}">
<f:if condition="{0: wert1} == {0: 'hallo'}">
<p>Stringvergleiche klappen nur als Array</p>
</f:if>
</f:alias>
Wenn kein f:then oder f:else-ViewHelper gefunden wurde, dann wird der Inhalt zwischen den f:if-
ViewHelpern immer nur dann ausgegeben, wenn die Bedingung wahr ist. Wenn komplette WENN-
>DANN-SONST-Konstrukte erzeugt werden müssen, dann müssen auch immer die f:then und
f:else-ViewHelper verwendet werden.
f:image
Die Arbeit, die man sich normalerweise umständlich in einer Extension oder im TS machen musste
gibt es nun fertig als ViewHelper und die Bilder werden nicht einfach nur verkleinert dargestellt.
Nein! Sie werden mit Hilfe von PHP-GD und/oder imagemagick auf die hier angegebene Größe
verkleinert.
Eigenschaften
Globale Eigenschaften für das HTML-Element
Eigenschaft Datentyp Beschreibung
class String CSS-Klasse für dieses HTML-Element
dir String Die Textrichtung. Erlaubte Werte sind: ltr (links nach rechts) und rtl (rechts nach links)
id String Ein Bezeichner, der in dem Dokument ein HTML-Element eindeutig identifiziert
lang String Angabe der Sprache nach RFC 1766, die in diesem HTML-Element verwendet wird
style String Individuelle CSS-Stile, die nur für dieses HTML-Element gültig sein sollen
title String Ein Text, der beim berühren mit der Maus als Tooltip erscheinen soll
accesskey String Eine Tastenkombination, mit der dieses HTML-Element direkt angesprungen werden kann
tabindex Integer Gibt die TAB-Reihenfolge an
onclick String JavaScript Code, der bei Klick auf dieses HTML-Elemtent ausgeführt werden soll
Eigenschaften speziell für das HTML-Element
Eigenschaft Datentyp Beschreibung
alt String Wenn das Bild nicht geladen wird, wird dieser alternative Text stattdessen angezeigt.
ismap String Specifies an image as a server-side image-map
Eigenschaft Datentyp Beschreibung
longdesc String Hier können Sie ein URI hinterlegen, die auf eine Seite verweist, auf der sich eine umfangreiche Erläuterung diesen Bildes befindet.
usemap String Specifies an image as a client-side image-map
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
src String Pfad zu der Datei. Hier kann auch mit EXT: gearbeitet werden, da es sich hier um ein IMG_RESOURCE handelt
width String Breite des Bildes. Hier kann z.B. mit einem angehangenen "c" gesagt werden, dass das Bild, falls die Proportionen nicht genau passen geschnitten wird. Z.B. 200c
height String Höhe des Bildes. Hier kann z.B. mit einem angehangenen "c" gesagt werden, dass das Bild, falls die Proportionen nicht genau passen geschnitten wird. Z.B. 100c
minWidth Integer Minimale Breite des Bildes. Falls das Bild kleiner ist, wird es automatisch auf diese Breite vergrößert. Hinweis: Falls Ihr im Installtool [GFX][im_noScaleUp] aktiviert habt, wird das Bild nicht vergrößert.
minHeight Integer Minimale Höhe des Bildes. Falls das Bild kleiner ist, wird es automatisch auf diese Höhe vergrößert. Hinweis: Falls Ihr im Installtool [GFX][im_noScaleUp] aktiviert habt, wird das Bild nicht vergrößert.
maxWidth Integer Maximale Breite des Bildes. Falls das Bild größer ist, wird es automatisch auf diese Breite verkleinert.
maxHeight Integer Maximale Höhe des Bildes. Falls das Bild größer ist, wird es automatisch auf diese Breite verkleinert.
treatIdAsReference Boolean Wenn TRUE, dann wird die Angabe bei src als sys_file_reference
Eigenschaft Datentyp Beschreibung
interpretiert. Wenn FALSE als sys_file oder Dateipfad
Beispiel in Originalgröße
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" />
Beispiel: Beibehaltung der Proportionen
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" width="50"
/>
Beispiel: Geschnittenes Bild
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft"
width="100c" height="100c" />
Die kürzere Seite wird auf 100 Pixel gesetzt und bei der längeren Seite wird nach 100 Pixeln einfach
abgeschnitten.
f:layout
Mit diesem ViewHelper könnt Ihr ein Layout wählen, dass für das aktuelle Template verwendet
werden soll.
Eigenschaften
Eigenschaften speziell für diesen ViewHelper
Eigenschaft Datentyp Beschreibung
name String Name des zu verwendenden Layouts. Wenn kein Name angegeben wurde, dann wird "Default" verwendet.
f:render
Die Partials sind in Fluid wie die FCEs in TemplaVoila. Kurz: Wiederverwendbare Templates. Eine
geniale Sache solange Ihr diese ViewHelper in Maßen einsetzt, denn das Laden eines Partials
dauert ca. 5 Millisekunden. Wenn Ihr also irgendwann mal auf die Idee kommen solltet jede Zelle
einer Tabelle mit Partials generieren zu wollen, dann kann das Laden der Webseite bei 700
Tabellenzeilen und 15 Spalten schonmal etwas dauern: 700 Zeilen * 15 Spalten * 5 Millisekunden =
52500 Millisekunden. Plus die Zeit, die TYPO3 selbst noch braucht sind wir bei knapp einer Minute.
Eigenschaften
Eigenschaft Datentyp Beschreibung
section String Der Name einer Section, die gerendert werden soll.
partial String Pfad + Dateiname ohne .html-Endung ab dem Verzeichnis, das für Partials definiert wurde.
arguments Array Welche Variablen sollen in den Partial/das Layout übernommen werden.
optional Boolean Normalerweise hagelt es Fehlermeldungen, wenn Sections nicht auffindbar sind. Setzt man diesen Parameter aber auf TRUE, dann wird eben nichts ausgegeben.
Die Dateien für Partials liegen immer in fest vorgegebenen Verzeichnissen. Innerhalb von
Extensions ist dies: typo3conf/ext/[ExtensionKey]/Resources/Private/Partials/. Wenn Ihr allerdings
mit FLUIDTEMPLATE arbeitet, dann gebt Euren gewünschten Verzeichnispfad mit Hilfe der TS-
Eigenschaft "partialRootPath" mit abschließendem / an.
Sections haben kein eigenes Verzeichnis, da diese immer innerhalb der aktuellen Templatedatei
definiert werden müssen. Außnahmen machen da die Layouts.
Beispiel für Partial
In unserem Fluidtemplate:
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege">
<f:render partial="TableRow" arguments="{kollege: kollege}"/>
</f:for>
</table>
</f:alias>
In der Partial Datei TableRow.html
<tr>
<td>{kollege.vorname}</td>
<td>{kollege.stadt}</td>
</tr>
f:renderChildren
f:renderFlashMessages
f:section
Sections sind ähnlich Partials mit dem Unterschied, dass Partials in Dateien ausgelagert werden und
Sections innerhalb des Templates definiert werden müssen.
Eigenschaften
Eigenschaft Datentyp Beschreibung
name String Ein Name unter dem man den Inhalt zwischen den Tags wieder auffinden kann
Beispiel
<f:section name="TableRow">
<tr>
<td>{kollege.vorname}</td>
<td>{kollege.stadt}</td>
</tr>
</f:section>
<f:alias map="{mitarbeiter: {0: {vorname: 'Stefan', stadt: 'Lindlar'},1:
{vorname: 'Petra', stadt: 'Lindlar'},2: {vorname: 'Sascha', stadt:
'Remscheid'},3: {vorname: 'Patrick', stadt: 'Bonn'},4: {vorname: 'Sven',
stadt: 'Gummersbach'},5: {vorname: 'Andrea', stadt: 'Wuppertal'}}}">
<table cellpadding="5" cellspacing="0" border="2">
<f:for each="{mitarbeiter}" as="kollege">
<f:render section="TableRow" arguments="{kollege: kollege}"/>
</f:for>
</table>
</f:alias>
Wie Ihr seht wird hier erst das HTML für eine Tabellenzeile definiert und der Section der Name
"TableRow" gegeben. Später dann in der Schleife könnt Ihr mit Hilfe des f:render-ViewHelpers diese
Section wieder aufrufen.
f:then
Dieser ViewHelper wird im Bereich f:if erklärt, da er nur dort verwendet werden kann.
Eigenschaften
Dieser ViewHelper besitzt keine Eigenschaften
f:translate
Mit dem f:translate-ViewHelper greift Ihr auf eine beliebige Sprachdatei (meist locallang.xml) zu und
holt Euch die entsprechende Übersetzung mit Hilfe der Angabe im Parameter "key".
Eigenschaften
Eigenschaft Datentyp Beschreibung
key String Der key, mit dem man die Übersetzung aus dem Sprachdateien auslesen kann
default String Wenn der Key in der Sprachdatei nicht gefunden werden kann, dann verwende diesen Text. Wenn default nicht gesetzt ist, wird der Inhalt zwischen den Tags verwendet.
htmlEscape Boolean Alle Übersetzungen aus den Sprachdateien werden durch htmlspecialchars geschleust, was es unmöglich macht, HTML-Tags in den Übersetzungen anzeigen zu lassen. Setzt diesen Wert auf FALSE, um dieses Vorgehen zu unterbinden.
arguments Array In den Übersetzungen können Platzhalter definiert werden, die dann mit den Inhalten diesen Arrays gefüllt werden.
Innerhalb von Extensions wird immer auf die locallang.xml im Verzeichnis
Resources/Private/Language/ zugegriffen. Im Bereich FLUIDTEMPLATE müsste Ihr hier die
Pfadsyntax verwenden:
LLL:fileadmin/templates/locallang.xml:domain_model_irgendwas.titel
bzw:
LLL:EXT:meineExtension/Resources/Private/Language/
locallang.xml:domain_model_irgendwas.titel
Diese "LLL:" Prefixe müssen bei der Pfadnotation immer gesetzt sein!!! Etwas einfacher machen es
sich die FLUIDTEMPLATE-User, wenn sie im TS zuvor angeben auf welche locallang.xml welcher
Extension sie zugreifen wollen:
extbase.pluginName = Pi1
extbase.controllerExtensionName = MeineExtension
Dann reicht es auch wieder nur den "key" anzugeben OHNE den ganzen Pfad
Beispiel
<f:translate key="domain_model.title" htmlEscape="false" />
Beispiel mit Pfad
<f:translate key="LLL:fileadmin/lang/locallang.xml:domain_model.title" />
Beispiel mit Platzhaltern
In unserem Template:
<f:translate key="LLL:fileadmin/lang/locallang.xml:domain_model.title"
arguments="{0: 'Herr der Ringe'}" />
In der locallang.xml
<label index="domain_model.title">Title of: %s</label>
Mit %s wird auf den ersten Wert des übergebenen Arrays zugegriffen. Kommt %s nochmals vor,
dann wird auf den zweiten Arrayeintrag zugegriffen. Um das unabhängig von der Reihenfolge zu
machen empfehlen wir noch folgende Notation:
<label index="domain_model.title">Titel von: %1$s</label>
Mit %1 greift Ihr auf den ersten Eintrag zu und sagt diesem, dass er als String/Text interpretiert
werden soll ($s). Auf php.net findet Ihr heraus wofür diese ganzen Kürzel stehen.
Things to know
Here are some important informations around Fluid
Table of Contents
Arraynotation
JavaScript and Fluid Inline Syntax
Arraynotation
In TYPO3 6.1
Allow Fluid arrays only in ViewHelper arguments
Fluid arrays are a subset of the JavaScript object syntax, making it hard to work with them in mixed
HTML/JavaScript documents. For example the following JavaScript Object was parsed by Fluid:
var uris = {
endPoint1: '{f:uri.action(.)}',
endPoint2: '{f:uri.action(.)}',
};
With 6.1, Fluid now only parses arrays which are used inside ViewHelper arguments, such that an
array inside normal text is not converted anymore. This change is only breaking in very rare cases
where one relied on the inner contents of the ViewHelper being an array, eg. if one used the debug
ViewHelper as follows:
<f:debug>{key1: 'value1', key2: 'value2'}</f:debug>
ViewHelpers which were written like this should be re-written to take the array as ViewHelper
argument:
<f:debug value="{key1: 'value1', key2: 'value2'}" />
JavaScript and Fluid Inline Syntax
When Fluid ViewHelpers are used in mixed templates containing complex JavaScript blocks you
might come across the situation that a ViewHelper using inline syntax don't get interpreted. In this
case you can wake up the rendering by using a normal syntax ViewHelper or wrap the JavaScript
part in a CDATA block.
situation
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://layout.jquery-dev.net/lib/js/jquery.layout-
latest.js"></script>
<script type="text/javascript">
var myLayout;
$(document).ready(function() {
myLayout = $('body').layout({
north__size: 27
, north__initClosed: false
, north__initHidden: false
, center__maskContents: true // IMPORTANT -
enable iframe masking
});
});
</script>
<link rel="stylesheet" type="text/css"
href="{f:uri.resource(path:'Css/main.css')}" />
</head>
<body>
<div class="ui-layout-north">
Some dumb text
</div>
<div class="ui-layout-center">
Lorem ipsum
</div>
</body>
</html>
The ViewHelper in line
<link rel="stylesheet" type="text/css"
href="{f:uri.resource(path:'Css/main.css')}" />
is not interpreted but ignored by fluid.
Solution
wake up Fluid rendering Introduce after the JavaScript block a normal syntax term, maybe:
<f:commment>wake up, fluid!</f:comment>
wrap the JavaScript part in CDATA:
<![CDATA[
...
]]>
use the f:format.cdata viewHelper for the wrap:
<f:format.cdata>
<script type="text/javascript">
var myLayout; $(document).ready(function() {
myLayout = $('body').layout({
north__size: 27,
north__initClosed: false,
north__initHidden: false,
center__maskContents: true // IMPORTANT - enable iframe masking
});
});
</script>
</f:format.cdata>
Bewährte Vorgehensweisen
Statische Optionen für f:form.select
Der f:form.select-ViewHelper bringt einige coole Eigenschaften mit wie zum Beispiel
optionValueField und optionLabelField. Damit ist es möglich, auf bestimmte Eigenschaften eines
Objektes zuzugreifen, um diese als Value oder auch als Label für die zu generierenden Optionen
der Selectbox bereit zu stellen.
Diese beiden Eigenschaften haben aber ein Problem: sie funktionieren nur in Zusammenarbeit mit
Objekten. Selbst wenn ihr die Struktur in einem Array nachbaut, so scheitert der Versuch bereits hier
im f:form.select-ViewHelper:
if (is_object($value)) {
Denn nur dort werden diese beiden Eigenschaften verarbeitet.
Natürlich könnten wir uns auch ein kleines Mini-Domainmodel mit zwei Getter- und Setter-Methoden
bauen, um Label und Value hier abzuspeichern. Das erscheint jedoch als zu aufwändig, nur um
einige statische Werte bereit zu stellen.
Abhilfe schafft hier die PHP Standardklasse stdClass:
/**
* action list
*
* @return void
*/
public function listAction() {
$this->view->assign('categories', $this->getCategories());
}
/**
* prepare categories for select box
*
* @return array
*/
public function getCategories() {
$categories = array();
$entries = array('car', 'bike', 'train');
foreach ($entries as $entry) {
$category = new stdClass();
$category->key = $entry;
$category->value = LocalizationUtility::translate('category.' .
$entry, 'myExtName');
$categories[] = $category;
}
return $categories;
}
Im Fluid-Template könnt ihr dann wieder ganz normal die beiden Eigenschaften verwenden:
<f:form.select name="category" options="{categories}"
optionValueField="key" optionLabelField="value" />
Index: Labels for Crossreferencing
Index
[0032] :ref:`start`
Targets
[0033] :ref:`labels-for-crossreferencing`
Fluid/ViewHelper/Format/Cdata