TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n.de

Transcrição

TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n.de
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
t3n.de
TYPO3 Templates: SeitenLayouts mit Fluid umsetzen
original (http://t3n.de/magazin/seitentemplates-fluid-226788/)
Ursprünglich war die Idee für das Seitentemplate in TYPO3 (http://t3n.de/tag/typo3)
genauso einfach wie leistungsunfähig. Man hat ein HTML-Template und
platziert dort Marker unter Verwendung eines String, der mit den Zeichen
„###“ anfängt und wieder aufhört. Später ersetzt man den Marker dann im
TypoScript beispielsweise mit dort generiertem Inhalt. Einen Schritt weiter
geht der so genannte Subpart – dieser besteht lediglich aus zwei Markern und
der Regel, dass alles innerhalb der Marker enthaltene inklusive der Marker
selbst mit dem Inhalt ersetzt wird.
Die Schwächen dieses Vorgehens sind offensichtlich. Da es sich bei dem
System lediglich um eine Textersetzung handelt, muss TypoScript den
kompletten Inhalt inklusive der kompletten Darstellungslogik erzeugen. Will
man nun an der Darstellung etwas ändern, kommt man nicht umhin, direkt in
das TypoScript einzusteigen und dort die Änderungen vorzunehmen. Ebenso
kann das Ganze in einer Arie aus Conditions und Extension-Templates
ausarten, wenn man beispielsweise bei jedem Template verschiedenste
Untertemplates einbinden will – oder man verwendet dafür spezialisierte
Extensions. Wie man es aber dreht und wendet – es ist und bleibt suboptimal.
Herkömmliche Methode: HTML-Template
<!-- ###DOCUMENT begin -->
<div id =“content“>
###CONTENT###
</div>
<!-- ###DOCUMENT end -->
Listing 1
Herkömmliche Methode: TypoScript
page = PAGE
page.10 = TEMPLATE
page.10 {
template = FILE
1 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
template.file = fileadmin/site/template/tpl_main.html
workOnSubpart = DOCUMENT
marks {
CONTENT < styles.content.get
Listing 2
Die neue TYPO3 Version 4.5 soll diesen Umstand zumindest dahingehend
aufheben, als dass es nun möglich ist, die neue und bislang nur für FLOW3
(http://t3n.de/tag/flow3)
beziehungsweise für Extbase verwendete Templating-Engine
Fluid (http://t3n.de/tag/fluid) auch für das Seitentemplating zu benutzen. Dies
realisiert das neu eingeführte TypoScript-Objekt „FLUIDTEMPLATE“, das im
Hintergrund den ebenfalls in TYPO3 4.5 neu eingeführten FluidStandaloneview verwendet.
Installation und Konfiguration
Um das neue TypoScript-Objekt verwenden zu können, muss man
sicherstellen, dass Fluid (Extension-Key: fluid) und Extbase (Extension-Key:
extbase) im System installiert sind. Dies kann man ganz einfach im ExtensionManager überprüfen.
Im nächsten Schritt kopiert man das bisherige Template und verwendet dort
statt des Markers die Zeichenkette {content}. Nun kann TypoScript diese
ansprechen:
Fuid Methode: HTML-Template
<div id =“content“>
{content}
</div>
Listing 3
Fluid Methode: TypoScript
page = PAGE
page.10 = FLUIDTEMPLATE
page.10 {
template = FILE
template.file = fileadmin/site/template/tpl_fluid_main.html
variables {
content < styles.content.get
Listing 4
Bislang erinnert das Handling an das bekannte Vorgehen, aber es hat sich
2 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
bereits einiges im Hintergrund getan – unter anderem hat das System die
Daten anders transportiert. So gibt es nicht etwa die Content-Elemente der
Spalte „Normal“ aus, sondern deren Datenbankinhalt – also ohne die
zugehörige HTML-Darstellung. Dies liegt schlicht daran, dass normalerweise
die TypoScript-Bibliothek „css_styled_content“ für die Darstellung
verantwortlich ist – bei Fluid kann der Nutzer aber selbst im View
entscheiden, wie dieser dargestellt werden soll – daher kann der Anwender die
Darstellung als HTML explizit anstoßen. Um dies zu realisieren, schreibt man
folgendes in das Template:
Darstellung als HTML
<div id =“content“>
<f:format.html>{content}</f:format.html>
</div>
Listing 5
Wer sich bereits mit Fluid beschäftigt hat, sieht sofort, dass hier ein
sogenannter Fluid-ViewHelper zum Tragen kommt – eine eigene Klasse
innerhalb der Fluid-Systemextension, die in diesem Fall für die Formatierung
der Ausgabe in HTML zuständig ist.
Zugriff auf die Seiteneigenschaften
Das Array „data“ übergibt alle Seiteneigenschaften (wie UID, Titel,
Navigationstitel) automatisch an den Fluid-View. Die Seiteneigenschaften
stehen dementsprechend dort zur Verfügung.
Dafür verantwortlich ist letztlich die Anweisung „$view->assign('data',
$this->cObj->data);“ in der Datei „typo3/sysext/cms/tslib/content
/class.tslib_content_fluidtemplate.php“.
Man kann jede der Eigenschaften ganz einfach auslesen, indem man die
Eigenschaft als „Schlüssel“ für das Array „data“ verwendet und darauf mit der
Punktsyntax von Fluid zugreift:
Zugriff auf Seiteneigenschaften im Template
Sie befinden sich auf der Seite mit der UID {data.uid} und dem Titel {data.title
<f:if condition="{data.layout}==1">
<f:then>
Layout-Feld steht auf dem Wert "Layout 1"
</f:then>
<f:else>
Layout-Feld steht NICHT auf dem Wert "Layout 1"
3 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
</f:else>
</f:if>
Alle Eigenschaften: <f:debug>{data}</f:debug>
Listing 6
Das Beispiel zeigt auch, wie man im Template das Layout-Feld der
Seiteneigenschaften mit dem If-ViewHelper abfragen kann, um daraufhin eine
andere Ausgabe zu erzeugen. Dies funktioniert natürlich auch mit allen
anderen Feldern.
Eine Übersicht über alle verfügbaren Eigenschaften bietet der Fluid DebugViewHelper – diesen zeigt das oben stehende Listing ebenfalls am Ende. So
kann man einerseits die zur Verfügung stehenden Schlüssel wie auch deren
aktuelle Werte nachsehen.
TypoScript everywhere
Ein Nachteil der bisherigen Marker-Methode besteht darin, dass man im
Abschnitt, der die Marker befüllt, festlegen muss, welche TypoScript-Ausgabe
man im Template verwenden will. Das bisherige Vorgehen beinhaltete die
Integration eines Markers in das Template und die Zuweisung des TypoScriptObjekts an den Marker. Dies ist nicht nur sehr unflexibel, sondern auch
fehleranfällig.
Alternativ kann man nun ein FLUIDTEMPLATE verwenden. Schließlich gibt
es einen CObject-ViewHelper, der beliebige TypoScript-Objekte direkt ohne
vorherige Zuweisung flexibel integriert, in dem man lediglich den
TypoScript-Pfad angibt, der irgendwo im TypoScript-Setup definiert sein
muss.
Das folgende Beispiel zeigt jeweils, wie die TypoScript-Objekte aufgebaut sind
und darunter den jeweiligen Code, um darauf im Template zuzugreifen.
TypoScript
lib.test1 = TEXT
lib.test1.value = Aus dem TypoScript!
lib.test2 = IMAGE
lib.test2 {
file = GIFBUILDER
file {
XY = 300,30
backColor = #cc0000
10 = TEXT
4 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
10.text.current = 1
10.fontColor = #ffffff
10.offset = 10, 25
}
}
Listing 7
HTML-Template
<f:cObject typoscriptObjectPath="lib.test1" />
<f:cObject typoscriptObjectPath="lib.test2">Das wird als Bild gerendert</f:cObje
Listing 8
Über das Attribut „typoscriptObjectPath“ des „cObject“-ViewHelpers kann
man so beispielsweise das TypoScript-Objekt „lib.test1“ adressieren und somit
direkt an dieser Stelle ausgeben – ohne es vorher explizit zuzuweisen.
Diese Methode funktioniert aber nicht nur vom TypoScript-Setup ins
Template, sondern auch umgekehrt. So kann man Werte aus dem Template an
eine TypoScript-Bibliothek übergeben und das Ergebnis wiederum im
Template anzeigen lassen. So rendert das zweite Beispiel den String innerhalb
des ViewHelpers durch das TypoScript-Objekt „lib.test2“ mit dem
GIFBUILDER und zeigt wiederum das Bild im Template an.
Entscheidend ist hier, dass die „Eingabe“ innerhalb des ViewHelpers an das
TypoScript-Objekt so übergeben wurde, dass man dort mittels der stdWrapEigenschaft „current = 1“ darauf zugreifen kann. Das macht man sich zunutze,
indem man bei der GIFBUILDER-Eigenschaft „text“ darauf zugreift.
Layout und Partials
Gerade bei umfangreichen Darstellungen stellt man fest, dass die Ausgabe drei
wiederkehrende Bestandteile hat:
Ein Layout, das beispielsweise CI-Elemente oder eine Bereichsnavigation
enthält
Das Template, das die klassische Ausgabe enthält
Immer wiederkehrende Teile (Partials), die man nur einmal definiert und
an vielen Stellen einbinden kann. Sobald ein bestimmter Abschnitt im
Template öfter als einmal unverändert auftaucht, kann man diesen in
einem Partial auslagern
Im nächsten Schritt legt man im Verzeichnis „fileadmin“ die beiden
5 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
Verzeichnisse „Layouts“ und „Partials“ an und konfiguriert den jeweiligen Pfad
mit Hilfe von TypoScript (siehe nächster Abschnitt):
Konfigurieren des Verzeichnisse
page.10 = FLUIDTEMPLATE
page.10 {
layoutRootPath = fileadmin/Layouts/
partialRootPath = fileadmin/Partials/
}.
Listing 9
Nun kann man beides im Template verwenden:
Layout und Partial zum Template hinzufügen
<f:layout name="defaultLayout" />
<f:section name="content">
<h2>It works :-)</h2>
<f:render partial="testpartial" />
Weiterer Text...
</f:section>
Listing 10
Layout-File: fileadmin/Layouts/defaultLayout.html
<h1>Das kommt aus dem Layout</h1>
<f:render section="content" />
Listing 11
6 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
Die Ausgabe, besonders bei umfangreichen Darstellungen, beinhaltet mit dem Layout, dem
Template für die Ausgabe und den Partials (einmal definierte und wiederkehrende Teile) drei
wiederkehrende Bestandteile.
Beim Aufbau der Layout-Template-Struktur muss man nun etwas um die Ecke
denken:
1. Das Template selbst wird über die file-Eigenschaft des FUIDTEMPLATE
Content-Objekts definiert und aufgerufen.
2. Dieses Template-File kann einen Layout-ViewHelper beinhalten (oben in
der ersten Zeile). Dieser bestimmt wiederum das Layout-Template-File.
An diesen unter dem Attribut „name“ angegebenen Namen wird „.html“
zugefügt (beziehungsweise die entsprechende zuvor mit der TypoScriptEigenschaft „format“ festgelegte Formatendung) und das File aus dem
ebenfalls per TypoScript konfigurierten Verzeichnis.
3. Im Layout-Template-File kann man das Layout definieren. An der Stelle,
an der man das Template platzieren will, verwendet man den ViewHelper
<f:render section="content" />. Als Attribut „section“ benutzt man genau
den Namen, den man im Haupt-Template über den Section-ViewHelper
<f:section name="content"> verwendet hat. Damit wird dann der
Abschnitt (Section) des Templates (http://t3n.de/tag/templates) gerendert.
4. Partials kann man beliebig platzieren, indem man den RenderViewHelper <f:render partial="testpartial" /> verwendet. Hier gilt
ebenfalls, dass Fluid im jeweiligen konfigurierten Verzeichnis nach dem
7 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
Partial sucht, das den angegebenen Namen inklusive der Dateiendung, die
per Default .html lautet, haben muss.
TypoScript-Optionen
Zusammenfassend finden Sie in nachfolgender Tabelle alle TypoScriptOptionen, die mit dem Content-Objekt FLUIDTEMPLATE möglich sind.
Auf "file", "layoutRootPath" und "partialRootPath" können zudem stdWrap
Eigenschaften angewendet werden.
8 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
file
Pfad zur Templatedatei (string + stdWrap)
format
Format – Default ist HTML
extbase. pluginName
Festlegen des Plugin-Namens
extbase.
controllerExtensionName
Festlegen des Extension-Namens
extbase. controllerName
Festlegen des Controller-Namens
extbase. controllerActionName
Festlegen des Action-Namens
layoutRootPath
Pfad zu den Layout-Dateien (string + stdWrap)
partialRootPath
Pfad zu den Partial-Dateien (string + stdWrap)
variables
Array von Content-Objekten, auf die im Template via Schlüssl
zugegriffen werden kann
stdWrap
StdWrap-Eigenschaften auf die gesamte Ausgabe anwenden
Fazit
Das TypoScript-Content-Objekt ist bereits jetzt extrem leistungsfähig und
unterstützt TYPO3-Entwickler in vielerlei Hinsicht optimal. Zudem stehen so
Funktionen zur Verfügung, die mit der klassischen Methode schlicht nicht
möglich sind. Man denke beispielsweise alleine an die ViewHelper. Darüber
hinaus existieren eigene ViewHelper, die mit wenig Aufwand die
Möglichkeiten des Templating erheblich erweitern.
Allerdings fallen einem schnell Dinge auf, die nicht beziehungsweise noch
nicht realisiert wurden. So ist es durchaus sinnvoll, dass beispielsweise das
Auslesen einer Backend-Spalte nicht alle dort vorhandenen Inhaltselemente
als einen String zurückliefern sollte, sondern als Array. Dann könnte man
darauf auch andere Viewhelper wie „Cylcle“ oder „For“ anwenden, um so jedes
Content-Element einzeln anzusprechen.
Ebenfalls möglich wäre dann vielleicht ein Zugriff auf einzelne Eigenschaften
eines Content-Elements. Einem Kommentar im Bugtracker zufolge ist dies für
Version 4.6 angedacht.
Der Autor
Patrick Lobacher ist Inhaber und Geschäftsführer der
Full-Service Agentur "typovision – Agentur für multimediale Kommunikation"
(www.typovision.de), Autor, Trainer, Programmierer, Silber-Mitglied der
TYPO3 Association und „Certified TYPO3 Integrator“ und nicht zuletzt ein
Digital Native. Er berät seit 1996 Unternehmen beim Einsatz von
Webtechnologien, insbesondere seit 2002 zunehmend im TYPO3-Umfeld.
9 of 10
22/08/13 08:47
TYPO3 Templates: Seiten-Layouts mit Fluid umsetzen — t3n....
http://www.readability.com/articles/opvwwkbk?print=1
Original URL:
http://t3n.de/magazin/seitentemplates-fluid-226788/
10 of 10
22/08/13 08:47