Tipps und Tricks zu Fluid

If condition mit strings

Mitte Januar hatten wir eine Extbase/Fluid-Schulung mit Patrick Lobacher. Klar...auch hier kam die Frage auf, wie man eine Variable gegen einen String abgleicht. Leider funktioniert diese nahe liegende Lösung (noch) nicht:

<f:if condition="{data.ctype} == 'table'">
 {data.bodytext}
</f:if>

Die Alias-Lösung

Das liegt daran, dass Fluid nur Arrays und Objekte miteinander vergleichen kann. Nach ein bissl tüfteln bin ich dann auf die mittlerweile auch im Internet mehrfach veröffentliche Lösung gestoßen:

<f:alias map="{myText: 'table'}">
 <f:if condition="{data.ctype} == {myText}">
 {data.bodytext}
 </f:if>
</f:alias>

Die Array-Lösung

<f:if condition="{0:data.ctype} == {0:'table'}">
 {data.bodytext}
</f:if>

Mehrere Werte als Array überprüfen

<f:if condition="{0:data.ctype,1:data.hidden,2:data.deleted} == {0:'table',1:'0',2:'0'}">
 {data.bodytext}
</f:if>

Rendern von Contentelementen

Es gibt ja diese Contentelemente Text, Text mit Bild, Tabelle, Liste und so weiter. Wenn Ihr mit Hilfe von Extbase mal auf die Inhaltselemente zugreifen müsst, dann holt Ihr Euch den Inhalt üblicherweise über das Feld bodytext.

Wenn Ihr wie ich auch den RTE verwendet, könnt Ihr nun mit Hilfe von Fluid, den Text aus der Datenbank wieder in HTML-Quelltext konvertieren:

<f:format.html>{content.bodytext}</f:format.html>

Bis hierhin ist die Welt noch in Ordnung, aber spätestens, wenn Ihr den bodytext einer Tabelle ausgeben müsst steht Ihr vor einem Problem und f:format.html wandelt Euch das bestimmt nicht in eine Tabelle um. Folgende Lösungen stehen Euch zur Verfügung, wobei die letzte Lösung die Beste ist:

1.) Schon bei der Datenbankabfrage im Repository könnt Ihr mit Hilfe einer Switch-Case-Anweisung herausfinden, welchen CType Ihr aktuell habt und die dafür entsprechenden css_styled_content-Funktionen ausführen. Ich geh da jetzt nicht weiter drauf ein, weil das bestimmt nicht der way-of-fluid ist.

2.) Innerhalb des Controllers holt Ihr Euch ein Objekt von tslib_cObj und ladet Euch die Contentinhalte mit Hilfe des Contentobjects CONTENT.

3.) Die geilste und vor allem die kürzeste Variante ist aber:

<f:if condition="{content.ctype}">
 <f:cObject typoscriptObjectPath="tt_content.{content.ctype}.20" data="{content}" />
</f:if>

Beachtet aber, dass Ihr für diese Lösung auch alle benötigten tt_content-Felder in Eurem Model definiert habt.