TYPO3 Fluid: f:if inline

Bedingungen in einer Zeile – mit Vergleichen, Ternär-Ausdruck und den typischen Fallen. Alle Beispiele mit TYPO3 14.3 geprüft.

Erschienen am · von Mathias Wortmann

Wann sich die Inline-Schreibweise lohnt

Für ganze Blöcke ist die Tag-Schreibweise <f:if> mit <f:then> und <f:else> die lesbarere Wahl. Sobald aber nur ein Wort, eine CSS-Klasse oder ein Attributwert von einer Bedingung abhängt, ist die Inline-Schreibweise kürzer und hält das Markup übersichtlich – typisch in Schleifen, wo der erste oder jeder dritte Eintrag anders aussehen soll.

Alle Beispiele auf dieser Seite haben wir am 1. Oktober 2026 mit Fluid 5.3.2 gerendert, der Version in TYPO3 14.3.7. Ternär- und Rechenausdrücke kennt auch Fluid 4 (TYPO3 13).

Die Grundform

Der ViewHelper bekommt eine Bedingung und einen oder zwei Werte. else ist optional; fehlt es, gibt eine falsche Bedingung nichts aus.

{f:if(condition: aktiv, then: 'an', else: 'aus')}
{f:if(condition: aktiv, then: 'an')}

Als falsch gelten: false, die Zahl 0, der Text "0", ein leerer Text, ein leeres Array und eine Variable, die es gar nicht gibt. Alles andere ist wahr.

Vergleiche und Verknüpfungen

Sobald verglichen oder verknüpft wird, steht die ganze Bedingung in einfachen Anführungszeichen, und jede Variable darin in geschweiften Klammern:

{f:if(condition: '{anzahl} > 3', then: 'viele', else: 'wenige')}
{f:if(condition: '{status} == 1', then: 'eins')}
{f:if(condition: '{a} && {b}', then: 'beide')}
{f:if(condition: '{a} || {b}', then: 'mindestens eins')}
{f:if(condition: '!{a}', then: 'nicht a')}

Texte vergleichen Sie am einfachsten mit doppelten Anführungszeichen. Einfache gehen auch, müssen dann aber mit einem Backslash maskiert werden:

{f:if(condition: '{farbe} == "rot"', then: 'rot!')}
{f:if(condition: '{farbe} == \'rot\'', then: 'rot!')}

Kürzer: der Ternär-Ausdruck

Für ein einfaches Entweder-oder braucht es keinen ViewHelper. Fluid versteht den Ternär-Ausdruck direkt, auch mit Variablen statt fester Texte:

{aktiv ? 'an' : 'aus'}
{aktiv ? textAn : textAus}

Für Vergleiche bleibt f:if die richtige Wahl – der Ternär-Ausdruck prüft nur, ob ein Wert wahr ist.

Praxis: CSS-Klassen in Schleifen

Der häufigste Einsatz: Der erste Eintrag einer Liste bekommt eine eigene Klasse. Mit iteration stellt f:for dafür isFirst, isLast, index und cycle bereit:

<f:for each="{eintraege}" as="eintrag" iteration="i">
    <div class="{i.isFirst ? 'erste' : 'weitere'}">{eintrag.titel}</div>
</f:for>

Jeder dritte Eintrag lässt sich mit dem Rest-Operator erkennen; cycle zählt ab 1:

<div class="{f:if(condition: '{i.cycle} % 3 == 0', then: 'dritter')}">

Die frühere Schreibweise, bei der f:if das ganze Attribut ausgibt (<div{f:if(condition: i.isFirst, then: ' class="erste"')}>), funktioniert weiterhin. Lesbarer und robuster ist es, nur den Wert des Attributs bedingt zu setzen.

Verschachteln – besser nicht

Ein „sonst wenn“ lässt sich inline bauen, indem im else ein weiteres f:if steht. Die inneren Anführungszeichen müssen dann maskiert werden:

{f:if(condition: a, then: 'A', else: '{f:if(condition: b, then: \'B\', else: \'C\')}')}

Das funktioniert, ist aber schwer zu lesen. Für mehr als zwei Fälle ist die Tag-Schreibweise mit <f:else if="…"> klarer:

<f:if condition="{a}">
    <f:then>A</f:then>
    <f:else if="{b}">B</f:else>
    <f:else>C</f:else>
</f:if>

Wird das Ergebnis mehrfach gebraucht, lohnt sich f:variable: <f:variable name="klasse" value="{f:if(condition: aktiv, then: 'an', else: 'aus')}" /> und danach einfach {klasse}.

Ausgabe und Escaping

Feste Texte in then und else gibt Fluid so aus, wie sie dastehen. Kommt der Wert aus einer Variable, wird er wie jede Variable maskiert: Steht in text zum Beispiel <b>x</b>, erscheint im HTML &lt;b&gt;x&lt;/b&gt;. Das schützt vor eingeschleustem Markup und ist fast immer gewollt.

Häufige Fragen

Meist fehlen die geschweiften Klammern: condition: 'aktiv' prüft den Text „aktiv“, und der ist nie leer – die Bedingung ist also immer wahr. Richtig ist condition: aktiv oder condition: '{aktiv}'.

false, 0, der Text "0", ein leerer Text, ein leeres Array und eine nicht vorhandene Variable. Alles andere gilt als wahr.

Ja, in der Tag-Schreibweise: <f:else if="{bedingung}"> innerhalb von <f:if>. Inline geht es nur über ein verschachteltes f:if im else.

Welche Version läuft bei Ihnen?

Der CMS-Check nennt System, Version und Wartungsstand – in wenigen Sekunden.

Erzählen Sie uns von Ihrem Projekt.

Templates, Updates oder eine eigene Extension: Wir arbeiten für Agenturen im Hintergrund. Schicken Sie uns kurz, worum es geht.

Projekt anfragen Für Agenturen

Nach oben