TypoScript Conditions Spickzettel: Syntax, Beispiele und Migration

Moderne TypoScript-Bedingungen ersparen Ihnen Zeit und Mühe. In diesem Artikel finden Sie einfache Richtlinien & Beispiele für TypoScript-Bedingungen mit moderner Symfony-Ausdruckssprache (in Form eines einfachen Spickzettels).

TypoScript Conditions Spickzettel: Syntax, Beispiele und Migration

Moderne TypoScript-Bedingungen helfen Ihnen, eine sauberere, sicherere und wartungsfreundlichere TYPO3-Konfiguration zu schreiben. Dieser Leitfaden ist als praktischer Spickzettel aufgebaut und konzentriert sich auf reale Beispiele mit der Symfony Expression Language, die Sie direkt kopieren und verwenden können.

Seit TYPO3 v9.4 bildet die Symfony Expression Language die Grundlage für moderne TypoScript-Bedingungen und ersetzt die frühere Legacy-Syntax. Wenn Sie täglich mit TYPO3 arbeiten, wissen Sie bereits, wie wichtig Bedingungen für die Steuerung von Rendering, Umgebungen und Verhalten in Projekten sind.

Statt Theorie konzentriert sich dieser Leitfaden darauf, wie moderne TypoScript-Bedingungen tatsächlich funktionieren, einschließlich Variablen, Funktionen, benutzerdefinierten Bedingungen und häufigen Fehlerquellen.

In diesem Leitfaden zeigen wir Ihnen alles, was Sie benötigen, um TypoScript-Bedingungen korrekt, sicher und upgrade-sicher zu verwenden.

Kurzantwort: Eine TypoScript-Bedingung ist ein Ausdruck der Symfony Expression Language in eckigen Klammern, zum Beispiel [frontend.user.isLoggedIn]. Das darunter stehende TypoScript gilt nur, solange der Ausdruck wahr ist, bis [ELSE], [END] oder [GLOBAL] folgt. Bedingungen lesen Variablen wie page und tree sowie Funktionen wie site() und funktionieren ab TYPO3 9.4.

Wichtigste Punkte

  • Die Legacy-Syntax wie [globalVar = ...] wurde in TYPO3 9.5 als veraltet markiert und in TYPO3 10 entfernt.
  • getTSFE() wurde in TYPO3 v14 entfernt. Die Seiten-ID lesen Sie mit request?.getPageArguments()?.getPageId().
  • loginUser() und usergroup() wurden in v12 als veraltet markiert und in v13 entfernt. Nutzen Sie frontend.user und backend.user.
  • Seit TYPO3 v12 verhalten sich [END] und [GLOBAL] gleich, und Bedingungen lassen sich nur über getrennte Dateien verschachteln, zum Beispiel mit @import.
  • TYPO3 v14 ergänzt locale() als Kurzform für die Site-Locale. ip() funktioniert seit v13 nur im Frontend-TypoScript.
  • Sichern Sie Request-Prüfungen mit request && oder dem Null-Safe-Operator ?. ab, damit sie in CLI und TSconfig nicht fehlschlagen.

Getestet mit / gültig für: TYPO3 v13.4 LTS und v14.3 LTS, geprüft anhand der offiziellen TypoScript-Referenz zu Bedingungen und des TYPO3-Core-Changelogs.
Aktualisiert: November 2026

Jede Bedingung unten können Sie direkt in Ihr Frontend-TypoScript-Setup kopieren. Die Spalte "Funktioniert in" nennt die erste TYPO3-Version mit dieser Syntax; jede Zeile wurde anhand der TypoScript-Referenz für v13.4 und v14 geprüft. FE steht für Frontend-TypoScript, BE für Backend-TSconfig.

Die Syntax in einem Block

 

[frontend.user.isLoggedIn]
page.10.value = Welcome back
[ELSE]
page.10.value = Please log in
[END]

 

Kombinieren Sie Prüfungen mit && oder and, || oder or, und verneinen Sie mit !. Seit TYPO3 v12 bewirken [END] und [GLOBAL] dasselbe (Syntax-Referenz).

Seite und Seitenbaum

AnwendungsfallTypoScript-BedingungKontextFunktioniert in
Aktuelle Seiten-UID[traverse(page, "uid") == 17]FEv9.4+
Mehrere Seiten[traverse(page, "uid") in [17,24]]FEv9.4+
Bereich von Seiten-UIDs[traverse(page, "uid") in 10..20]FEv13.4, v14
Seiten-ID aus dem Routing (ersetzt getTSFE().id)[request?.getPageArguments()?.getPageId() == 42]FEv12.1+
Seitentyp, zum Beispiel 98[request && request.getPageArguments()?.getPageType() == 98]FEv12.1+
Backend-Layout inklusive Vererbung[tree.pagelayout === "pagets__Home"]FEv13.4, v14
Seite auf Root-Ebene[tree.level == 0]FEv9.4+
Seite 2 liegt in der Rootline[2 in tree.rootLineIds]FEv9.4+
Jede Unterseite von Seite 30[30 in tree.rootLineParentIds]FEv10.3+

Site und Sprache

AnwendungsfallTypoScript-BedingungKontextFunktioniert in
Sprach-ID[siteLanguage("languageId") == 1]FEv9.4+
Locale der Site-Sprache[siteLanguage("locale").getName() == "de-DE"]FEv13.4, v14
Locale-Abkürzung[locale().getName() == "de-DE"]FEv14
Site-Identifier[site("identifier") == "main"]FEv9.4+
Host der Site-Basis[site("base").getHost() == "www.example.org"]FEv13.4, v14
Eigene Site-Einstellung[traverse(site("configuration"), "settings/some/setting") == "someValue"]FEv13.4, v14

Frontend- und Backend-Benutzer

AnwendungsfallTypoScript-BedingungKontextFunktioniert in
Frontend-Benutzer angemeldet[frontend.user.isLoggedIn]FEv9.4+
Frontend-Benutzer nicht angemeldet[!frontend.user.isLoggedIn]FEv9.4+
Frontend-Benutzer in Gruppe 11[11 in frontend.user.userGroupIds]FEv11.2+
Backend-Benutzer angemeldet[backend.user.isLoggedIn]FE / BEv9.4+
Backend-Benutzer ist Admin[backend.user.isAdmin]FE / BEv9.4+
Backend-Benutzer in Gruppe 2[2 in backend.user.userGroupIds]FE / BEv11.2+

Request: Host, HTTPS, Parameter, Gerät

AnwendungsfallTypoScript-BedingungKontextFunktioniert in
HTTPS-Anfrage[request && request.getNormalizedParams().isHttps()]FEv9.4+
Exakter Host[request && request.getNormalizedParams().getHttpHost() == "example.org"]FEv9.4+
Beliebige Subdomain[request && like(request.getNormalizedParams().getHttpHost(), "*.example.org")]FEv9.4+
GET-Parameter tx_news_pi1[news][request && traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0]FEv9.4+
Cookie-Wert[request && request.getCookieParams()['foo'] == 1]FEv9.4+
User-Agent enthält "Mobile"[request && like(traverse(request.getHeaders(), 'user-agent/0'), '*Mobile*')]FEv13.4, v14

Kontext, Version, IP und Datum

AnwendungsfallTypoScript-BedingungKontextFunktioniert in
Development-Kontext[applicationContext == "Development"]FE / BEv9.4+
Production und Unterkontexte[applicationContext matches "/^Production/"]FE / BEv9.4+
TYPO3 13.4 oder neuer[compatVersion("13.4")]FE / BEv9.4+
Exakter TYPO3-Branch[typo3.branch == "14.3"]FE / BEv9.4+
Client-IP passt zur devIPmask[ip("devIP")]FEv9.4+, seit v13 nur FE
Feature-Toggle aktiv[feature("security.frontend.enforceContentSecurityPolicy") === true]FE / BEv13.4, v14
Freitag[date("w") == 5]FE / BEv9.4+
Zwischen 9:00 und 16:59 Uhr[date("G") >= 9 && date("G") < 17]FE / BEv9.4+
Live-Workspace[workspace.workspaceId == 0]FE / BEv9.4+
Umgebungsvariable[getenv("VIRTUAL_HOST") == "www.example.org"]FE / BEv9.4+

Hinweis: compatVersion("13.4") ist auch unter TYPO3 14 wahr, weil die Funktion "diese Version oder neuer" prüft. User-Agent-Prüfungen sind nur ein grobes Signal; responsives CSS passt Layouts zuverlässiger an Geräte an.

Bedingungen mit der Symfony Expression Language funktionieren in jeder TYPO3-Version ab 9.4, auch in den aktuellen Versionen v13.4 LTS und v14.3 LTS. Zwischen den Versionen ändern sich die verfügbaren Variablen und Funktionen.

Welche TYPO3-Versionen unterstützen Symfony TypoScript Bedingungen?

TYPO3-VersionExpression-SyntaxWas sich bei Bedingungen geändert hat
9.3 und älterNeinNur Legacy-Syntax
9.4 / 9.5 LTSJaSymfony Expression Language in 9.4 eingeführt, Legacy-Syntax in 9.5 als veraltet markiert
10 LTSJaLegacy-Bedingungen entfernt; tree.rootLineParentIds in 10.3 ergänzt
11 LTSJaArrays userGroupIds für Frontend- und Backend-Benutzer in 11.2 ergänzt
12 LTSJaNeuer TypoScript-Parser: [END] entspricht [GLOBAL], @import in Bedingungen, Null-safe ?. (12.1); loginUser() und usergroup() veraltet
13.4 LTSJaloginUser() und usergroup() entfernt, ip() nur im Frontend, <INCLUDE_TYPOSCRIPT: veraltet
14.3 LTSJagetTSFE() entfernt, locale() ergänzt, <INCLUDE_TYPOSCRIPT: entfernt

Support-Stand November 2026: TYPO3 v14.3.0 LTS wurde am 21. April 2026 veröffentlicht. Der kostenlose Community-Support für TYPO3 v12 LTS endete am 30. April 2026, v13 LTS erhält Sicherheitsupdates bis Ende Dezember 2027, so die TYPO3-Mitteilung zum Ende des kostenlosen v12-Supports.

Veraltete vs. empfohlene Bedingungssyntax

  • Legacy-Bedingungen ([globalVar], [userFunc]) wurden in TYPO3 9.5 als veraltet markiert und in TYPO3 10 entfernt
  • Symfony-basierte Bedingungen sind:

    • Zukunftskompatibel
    • Upgrade-sicher
    • Aktiv gepflegt

Verwenden Sie für neue und aktualisierte Projekte ausschließlich die Symfony Expression Language.

Migrations- & Upgrade-Hinweise

  • TYPO3 ≤ 9.3
    Alle Bedingungen im Rahmen des Upgrades neu schreiben
  • TYPO3 12 auf 13.4
    loginUser() und usergroup() ersetzen
  • TYPO3 13.4 auf 14
    Jeden Aufruf von getTSFE() und jede Zeile mit <INCLUDE_TYPOSCRIPT: ersetzen

Bewährte Verfahren für Unternehmen

  • Bedingungen bei jedem Upgrade prüfen, zum Beispiel von TYPO3 12 LTS auf 13.4 LTS und 14.3 LTS.
  • Niemals Legacy- und moderne Bedingungssyntax miteinander mischen.
  • Die weiteren Upgrade-Schritte beschreibt unser Leitfaden zur TYPO3-v13-Migration.

TYPO3 integriert ausgewählte Symfony-Komponenten, um seine Kernarchitektur zu stärken, ohne unnötige Komplexität hinzuzufügen.

  • Die Komponenten wie Console, Routing, YAML, PropertyAccess und ExpressionLanguage sind tief im TYPO3 Core integriert und für langfristige Stabilität konzipiert.
  • Die Symfony Expression Language bietet eine kompakte und gut lesbare Möglichkeit, logische Ausdrücke auszuwerten, die einen Wert zurückgeben, meist Boolean-Werte.
  • TYPO3 verwendet diese Komponente, um moderne TypoScript-Bedingungen zu ermöglichen, und ersetzt damit die fragmentierte Legacy-Syntax durch ein einheitliches Ausdrucksmodell.
  • Seit TYPO3 v9.4 bildet die Symfony Expression Language die Grundlage für TypoScript-Bedingungen sowohl im Frontend als auch im Backend.

Die Bedingungslogik wird über Variablen und Funktionen bereitgestellt. Dadurch wird eine sauberere Konfiguration, einfachere Erweiterbarkeit und vollständig upgradesichere benutzerdefinierte Bedingungen ermöglicht, die mit der langfristigen TYPO3-Roadmap abgestimmt sind.

TYPO3 hat Legacy-TypoScript-Bedingungen durch die Symfony-Ausdruckssprache ersetzt, um eine einheitliche und erweiterbare Syntax einzuführen.

Unten finden Sie einen direkten Vorher-Nachher-Vergleich, der zeigt, wie häufige Bedingungen von der Legacy-Syntax zu modernem TYPO3 (≥ 9.4) übersetzt werden.

Alte Bedingungen migrieren: die Kurztabelle

Die ersten elf Zeilen sind Legacy-Bedingungen, die TYPO3 10 entfernt hat. Die letzten drei sind Expression-Funktionen, die seit TYPO3 v13 oder v14 nicht mehr funktionieren. Quellen: die Abkündigung der alten Syntax, die Abkündigung von loginUser() und usergroup() und die Entfernung von getTSFE().

Alte BedingungErsatzHinweis
[globalVar = GP:L = 1][siteLanguage("languageId") == 1]Sprache kommt aus der Site-Konfiguration
[globalVar = TSFE:id = 17][traverse(page, "uid") == 17]
[treeLevel = 0][tree.level == 0]
[PIDinRootline = 2][2 in tree.rootLineIds]
[PIDupinRootline = 30][30 in tree.rootLineParentIds]Seit TYPO3 10.3
[loginUser = *][frontend.user.isLoggedIn]
[usergroup = 11][11 in frontend.user.userGroupIds]Seit TYPO3 11.2
[applicationContext = Development*][applicationContext matches "/^Development/"]
[globalString = IENV:HTTP_HOST = *.example.com][request && like(request.getNormalizedParams().getHttpHost(), "*.example.com")]
[dayofweek = 5][date("w") == 5]
[IP = devIP][ip("devIP")]Seit v13 nur im Frontend
[getTSFE().id == 42][request?.getPageArguments()?.getPageId() == 42]getTSFE() in v14 entfernt
[loginUser('*')][frontend.user.isLoggedIn]In v13 entfernt
[usergroup(11)][11 in frontend.user.userGroupIds]In v13 entfernt

Bedingungssyntax-Struktur

TYPO3 ≤ 9.3 (Legacy)

Bedingungen wurden einzeln ausgewertet und miteinander verkettet.

[condition1] && [condition2]

TYPO3 ≥ 9.4 (Symfony-basiert)

Bedingungen werden als ein einzelner Ausdruck ausgewertet.

[condition1 && condition2]

Spracherkennung

Legacy

[globalVar = GP:L = 1]

Modern

[siteLanguage("languageId") == 1]

[siteLanguage("title") == "English"]

[siteLanguage("locale").getName() == "en-US"]

TypoScript-Konstanten

Legacy

[globalVar = LIT:1 = {$myConstant}]

Modern

[{$myConstant} == 1]

Seiten-UID-Prüfungen

Legacy

[globalVar = TSFE:id = 17]

[globalVar = TSFE:id = 17, TSFE:id = 24]

Modern

[page["uid"] == 17]

[page["uid"] in [17,24]]

[request?.getPageArguments()?.getPageId() == 17]

Ältere Beispiele verwenden getTSFE().id. Diese Funktion wurde in TYPO3 v14 entfernt; nutzen Sie daher die Variable page oder die oben gezeigten Page Arguments.

Seiteneigenschaften

Legacy

[page|backend_layout = 1]

Modern

[page["backend_layout"] == 1]

Domain / Hostname-Prüfungen

Legacy

[globalString = IENV:HTTP_HOST = *.example.com]

Modern

[like(request.getNormalizedParams().getHttpHost(),"*.example.com")]

Datumsbasierte Bedingungen

Legacy

[dayofweek = 5]

Modern

[date("w") == 5]

Extension / Request-Parameter

Legacy

[globalVar = GP:tx_extkey|param > 0]

Modern

[request && traverse(request.getQueryParams(), 'tx_extkey/param') > 0]

Warum die neue Syntax besser ist

  • Eine einheitliche Ausdruckssprache
  • Sauberere und besser lesbare Bedingungen
  • Unterstützt komplexe Logik (&&, ||, in, regex)
  • Ermöglicht benutzerdefinierte TypoScript-Bedingungen
  • Konsistentes Verhalten im Frontend und Backend

Kostenloser Leitfaden: Upgrade-Leitfaden für TYPO3

Entfernte Funktionen wie getTSFE() gehören auf jede Upgrade-Checkliste. Der kostenlose Upgrade-Leitfaden plant Ihr TYPO3-Upgrade in vier Phasen, mit ELTS-Fakten, Wartungskalender und Excel-Arbeitsblatt.

Kostenlosen Upgrade-Leitfaden holen

Moderne TypoScript-Bedingungen stellen Variablen und Funktionen über die Symfony Expression Language bereit. Beide werden innerhalb von Bedingungsausdrücken verwendet, erfüllen jedoch unterschiedliche Zwecke.

Variablen

Variablen repräsentieren verfügbare Laufzeitdaten und werden für direkte Vergleiche verwendet.

Eigenschaften

  • Nur lesbar (Read-only)
  • Keine Argumente
  • Kontextabhängig (FE / BE)

Typische Anwendungsfälle

  • Seiteneigenschaften
  • Sprachinformationen
  • Benutzerstatus
  • Anwendungskontext
  • Site-Konfiguration

Beispiel:

[page["uid"] == 1]

Funktionen

Funktionen kapseln Logik oder Verarbeitungsschritte und können Parameter akzeptieren.

Eigenschaften

  • Aufrufbare Ausdrücke
  • Akzeptieren Argumente
  • Können dynamische Werte zurückgeben

Typische Anwendungsfälle

  • Request-Analyse
  • Datumsbewertung
  • Pattern-Matching
  • Versionsprüfungen
  • Umgebungslogik

Beispiel:

[date("w") == 5]

Verwenden Sie Variablen für einfache Prüfungen und Funktionen für dynamische oder berechnete Bedingungen. Die folgenden Abschnitte sind entsprechend gruppiert.

Warum diese Unterscheidung wichtig ist

  • Verhindert falsche Verwendung von Bedingungen
  • Verbessert die Lesbarkeit in komplexen Setups
  • Hilft bei der Strukturierung eigener Condition-Provider
  • Ermöglicht schnelleres Debugging

TYPO3 stellt eine Reihe integrierter Variablen bereit, die direkt in modernen TypoScript Bedingungen verwendet werden können. Diese Variablen liefern Laufzeitinformationen und werden mit der Symfony Expression Language ausgewertet.

Jede der folgenden Variablen repräsentiert eine Datenquelle, keine ausführbare Logik.

applicationContext — Anwendungsumgebung

Gibt den aktuellen TYPO3-Anwendungskontext als String zurück.

Typische Anwendungsfälle

  • Umgebungsbasierte Konfiguration
  • Feature-Toggles je Phase (Dev / Staging / Live)

 

[applicationContext == "Development"]
[applicationContext matches "#^Development#"]
[applicationContext matches "#^Production/Dev#"]
[applicationContext matches "#^Production/(Dev|Staging)#"]
[applicationContext matches "#^Production/Live#"]
[applicationContext == "Production/Live/ClusterServer1"]
[applicationContext matches "#^Production/Live#" && backend.user.isLoggedIn]
[not (applicationContext matches "#Production#")]

page — Seiteneigenschaften

Ermöglicht Zugriff auf den aktuellen Seitendatensatz als Array.

Typische Anwendungsfälle

  • Seitenbasierte Rendering-Logik
  • Template- oder Layout-Wechsel

 

[page["pid"] == 2]
[page["uid"] == 17]
[page["backend_layout"] == 1]

TypoScript-Konstanten — {$foo.bar}

Alle TypoScript-Konstanten sind innerhalb von Bedingungen verfügbar. Achten Sie beim Vergleichen auf den Datentyp.

[{$foo.bar} == 4711]
["{$foo.bar}" == "4711"]

tree — Seitenbaum-Informationen

Ermöglicht Zugriff auf Seitenbaum- und Rootline-Daten.

Typische Anwendungsfälle

  • Root-Seitenerkennung
  • Bereichsbasierte Konfiguration
[tree.level == 0]
[tree.rootLine[0]["uid"] == 1]
[2 in tree.rootLineIds]
[30 in tree.rootLineParentIds]
[tree.pagelayout === "pagets__Home"]

backend — Backend-Benutzerkontext (FE und BE)

Stellt Backend-Benutzerinformationen bereit. Verfügbar im Frontend-TypoScript und im Backend-TSconfig.

[backend.user.isAdmin]
[backend.user.isLoggedIn]
[backend.user.userId == 5]
[2 in backend.user.userGroupIds]

frontend — Frontend-Benutzerkontext (nur FE)

Stellt Frontend-Authentifizierungsdaten bereit. Nur im Frontend-Kontext verfügbar.

[frontend.user.isLoggedIn]
[frontend.user.userId == 5]
[4 in frontend.user.userGroupIds]

typo3 — TYPO3-Umgebungsinformationen

Stellt systembezogene TYPO3-Metadaten bereit.

[typo3.version == "14.3.5"]
[typo3.branch == "14.3"]
[typo3.devIpMask == "192.168.0.100"]

workspace — TYPO3-Workspace-Kontext

Stellt workspacebezogene Informationen bereit. Wird hauptsächlich im Backend-Kontext verwendet.

[workspace.workspaceId == 1]
[workspace.isLive]
[workspace.isOffline]

Wichtige Hinweise

  • Variablen sind read-only
  • Die Verfügbarkeit hängt vom Ausführungskontext ab (FE / BE)
  • Für einfache, deterministische Prüfungen bevorzugt Variablen verwenden

Nur-Frontend-Bedingungen werden während des Frontend-Renderings ausgewertet und benötigen eine aktive HTTP-Anfrage mit aufgelöster Site und Sprache. TYPO3 v14 hat den TypoScript Frontend Controller (TSFE) entfernt, Frontend-Bedingungen hängen daher nicht mehr davon ab.

Wenn sie im Backend, in der CLI oder im Scheduler ausgewertet werden, greifen diese Bedingungen nicht, und ip() kann ohne Request eine Exception auslösen.

FE-Kontext & Auswertungslebenszyklus

Frontend-Bedingungen sind verfügbar:

  • Nach der Site-Auflösung
  • Nach der Sprachauflösung
  • Während des Seiten-Renderings

Sie basieren auf:

  • Aktivem Request-Objekt
  • Aufgelöster Site- und Sprachkonfiguration
  • Aufgelösten Page Arguments aus dem Routing

Frontend-Benutzer & Authentifizierungsbedingungen

Werden verwendet, um Frontend-Benutzerstatus und Berechtigungen auszuwerten.

[frontend.user.isLoggedIn]
[frontend.user.userId == 5]
[11 in frontend.user.userGroupIds]
[frontend.user.userId in [3,7,9]]
[!frontend.user.isLoggedIn]

 

Hinweise

Page Arguments (Ersatz für getTSFE())

getTSFE() wurde in TYPO3 v14 entfernt. Lesen Sie Seiten-ID und Seitentyp stattdessen aus dem Routing-Ergebnis.

[request?.getPageArguments()?.getPageId() == 1]
[request?.getPageArguments()?.getPageId() in [17,24]]
[backend.user.isLoggedIn]

Hinweise

  • Der Null-safe-Operator ?. funktioniert ab TYPO3 v12.1
  • Bestehende getTSFE()-Bedingungen laufen in v13.4 noch, müssen aber vor v14 migriert werden

Frontend-Anfrage-basierte Bedingungen

Werden verwendet, um Request-Daten, Header und Routing-Argumente auszuwerten.

[request && traverse(request.getQueryParams(), 'foo') == 1]
[request && traverse(request.getParsedBody(), 'foo') == 1]
[request && request.getHeaders()['host'][0] == 'www.example.org']
[request && like(traverse(request.getHeaders(), 'user-agent/0'), '*Mobile*')]
[request && request.getCookieParams()['foo'] == 1]
[request && request.getPageArguments().get('foo_id') > 0]
[request && request.getNormalizedParams().isHttps()]
[request && request.getNormalizedParams().getHttpHost() == "t3planet.com"]

 

Hinweise

  • Request-Daten sind in der CLI nicht verfügbar
  • request ergibt in Page-TSconfig und User-TSconfig immer false
  • Header-Namen sind kleingeschrieben, zum Beispiel user-agent

Frontend-Site- & Sprachbedingungen

Nur verfügbar, nachdem die Site-Konfiguration aufgelöst wurde.

 

[site("identifier") == "t3terminal"]
[site("base").getHost() == "t3planet.com"]
[site("rootPageId") == 1]
[siteLanguage("languageId") == 0]
[siteLanguage("locale").getName() == "de-CH"]
[locale().getName() == "de-DE"]
[siteLanguage("title") == "German"]

 

Hinweise

  • site() und siteLanguage() können null zurückgeben
  • Nur im FE-Kontext sicher verwendbar
  • locale() ist ab TYPO3 v14 verfügbar (Changelog)

Frontend-Session-Bedingungen

Werden verwendet, um Werte aus der TYPO3-Frontend-Session zu lesen.

[session("foo|bar") == 1234567]

Hinweise

  • Erfordert eine aktive FE-Session
  • Nicht verfügbar in BE oder CLI

Souveräne TYPO3 KI

AI Foundation Symbol

AI Foundation für TYPO3T3AF

Die Basis, auf der jede Erweiterung läuft. Anbieter, Prompts, Berechtigungen und Kosten verwalten Sie an einer Stelle.

Kostenlos installieren

Nur Backend-Bedingungen werden im TYPO3 Backend Kontext ausgewertet, wo keine TSFE-Instanz existiert.

Sie basieren auf:

  • Authentifiziertem Backend-Benutzer
  • Backend-Request-Kontext
  • Workspace-Konfiguration

Backend-Benutzer & Berechtigungsbedingungen

Werden verwendet, um backend-spezifische TypoScript-Logik zu steuern.

[backend.user.isLoggedIn]
[backend.user.isAdmin]
[backend.user.userId == 5]
[2 in backend.user.userGroupIds]

Hinweise

  • backend.user funktioniert auch im Frontend-TypoScript, zum Beispiel für Ausgaben, die nur angemeldete Redakteure sehen
  • Berechtigungsprüfungen gelten nur im BE

Backend-Workspace-Bedingungen

Werden verwendet, um Live- und Nicht-Live-Workspaces zu unterscheiden.

[workspace.isLive]
[workspace.workspaceId == 1]

Hinweise

  • workspace.workspaceId == 0 steht für den Live-Workspace
  • Workspace-Prüfungen eignen sich für Konfiguration, die nur in der Vorschau gilt

Diese Funktionen funktionieren im Frontend-TypoScript und im Backend-TSconfig, mit einer Ausnahme: ip() ist seit TYPO3 v13 nur im Frontend verfügbar. compatVersion("13.4") ist unter 13.4 und jeder neueren Version wahr.

 

[date("d.m.") == "24.12."]
[date("j") == 7]

[like("foobarbaz", "*bar*")]
[like("fooBarBaz", "/f[o]{2,2}[aBrz]+/")]

[request && traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0]

[ip("172.18.*")]
[ip("devIP")]

[compatVersion("13.4")]
[feature("security.frontend.enforceContentSecurityPolicy") === true]
[getenv("VIRTUAL_HOST") == "t3planet.de"]

Eine Bedingung, die nie greift, wird meist im falschen Kontext ausgewertet, nutzt eine Funktion, die Ihre TYPO3-Version entfernt hat, oder kommt aus dem Cache. Die meisten Probleme mit TypoScript-Bedingungen schlagen stillschweigend fehl. Die folgenden Punkte verursachen den Großteil realer Fehler.

1. getTSFE() ergibt immer false

Was passiert

Bedingungen mit getTSFE() greifen nie.

Warum das passiert

  • TYPO3 v14 hat getTSFE() entfernt, solche Bedingungen werden nie wahr
  • In v13.4 und älter: Die Bedingung wird im Backend, in der CLI oder im Scheduler ausgewertet, wo TSFE nicht initialisiert ist

So vermeiden Sie es

  • Durch request?.getPageArguments()?.getPageId() oder die Variable page ersetzen
  • Niemals in Backend-Logik einsetzen

2. Verwechslung von Frontend- und Backend-Kontext

Was passiert
Bedingungen ergeben immer false.

Warum das passiert

  • frontend.* im Backend verwendet
  • backend.* im Frontend verwendet

So vermeiden Sie es

  • FE- und BE-Bedingungen in getrennten Blöcken halten
  • Kontexte niemals in derselben Bedingung mischen

3. site() oder siteLanguage() ergibt null

Was passiert

Sprach- oder Site-Bedingungen greifen nicht.

Warum das passiert

  • Site-Konfiguration nicht aufgelöst
  • Bedingung zu früh oder in CLI ausgewertet

So vermeiden Sie es

  • Site-bezogene Bedingungen nur im FE verwenden
  • Immer einkalkulieren, dass null möglich ist

4. Typkonflikt (String vs Integer)

Was passiert

Bedingung wirkt korrekt, greift aber nie.

Warum das passiert

  • Vergleich von "1" mit 1
  • TypoScript-Konstanten werden als Strings ausgewertet

So vermeiden Sie es

  • Datentypen explizit vergleichen
  • Vorsicht bei Anführungszeichen um Konstanten

5. Request-Daten nicht verfügbar

Was passiert

Anfrage-basierte Bedingungen schlagen unerwartet fehl.

Warum das passiert

  • Bedingung wird in CLI oder BE ausgewertet
  • Keine HTTP-Anfrage vorhanden

So vermeiden Sie es

  • request.* nur im FE verwenden
  • Mit request && absichern und nicht während Cache-Warmup oder Builds einsetzen

6. Eine verschachtelte Bedingung schließt die äußere

Was passiert

Der innere Block gilt auch dann, wenn die äußere Bedingung falsch ist.

Warum das passiert

  • Eine neue Bedingung schließt die vorherige automatisch
  • Bedingungen dürfen nicht innerhalb geschweifter Klammern stehen

So vermeiden Sie es

  • Seit TYPO3 v12 über Dateien verschachteln: @import in die äußere Bedingung setzen, die innere Bedingung in die importierte Datei
  • Oder beide Prüfungen mit && in einer Bedingung kombinieren

7. Änderungen in eingebundenen Dateien erscheinen nicht

Was passiert

Sie ändern eine Bedingung in einer importierten .typoscript-Datei, und das Frontend zeigt weiterhin das alte Ergebnis.

Warum das passiert

  • Seit TYPO3 v12 wird TypoScript aus eingebundenen Dateien gecacht, und eine Dateiänderung löst kein neues Rendering aus

So vermeiden Sie es

  • Mit angemeldetem Backend-Benutzer das Frontend per Shift-Reload neu laden
  • Vor dem Test als normaler Besucher "Frontend-Caches leeren" ausführen

8. Bedingungen schlagen im Page-TSconfig fehl

Was passiert

Eine Bedingung, die im TypoScript-Setup funktioniert, greift im Page-TSconfig oder User-TSconfig nie, oder ip() löst eine Exception aus.

Warum das passiert

  • request ergibt im Page- und User-TSconfig immer false
  • ip() benötigt einen Request und ist seit TYPO3 v13 nur im Frontend verfügbar

So vermeiden Sie es

  • Im TSconfig backend.user, tree oder Site-Einstellungen verwenden

Ein Linter findet offene Klammern und fehlerhafte Bedingungen, bevor sie live gehen. Lesen Sie dazu unser Tutorial TypoScript Lint in TYPO3. Alle Regeln stehen in der TypoScript-Syntax-Referenz zu Bedingungen.

TypoScript-Bedingungen sind leistungsstark, aber sie sind Konfigurationswerkzeuge und kein Ort für Geschäftslogik. Eine korrekte Nutzung verbessert Performance, Upgrade-Sicherheit und langfristige Wartbarkeit.

Best Practices für TypoScript-Bedingungen

Verwenden Sie TypoScript-Bedingungen, wenn Sie Konfiguration steuern möchten, nicht das Anwendungsverhalten.

Empfohlene Einsatzbereiche

  • Funktionen aktivieren oder deaktivieren
  • Templates oder Assets wechseln
  • Umgebungsspezifische Konfiguration anwenden
  • Rendering basierend auf Seite, Site oder Sprache steuern

Richtlinien

  • Deterministische Prüfungen bevorzugen (page, site, applicationContext)
  • Ausdrücke kurz und gut lesbar halten
  • Frontend- und Backend-Bedingungen klar trennen
  • Alle Bedingungen bei TYPO3-Upgrades erneut validieren (13.4 LTS, 14.3 LTS)

Anti-Muster: Wann TypoScript Bedingungen NICHT verwenden

TypoScript-Bedingungen vermeiden, wenn Logik dynamisch, komplex oder datenabhängig wird.

Nicht verwenden für

  • Geschäftsregeln oder Workflows
  • Komplexe Entscheidungsbäume
  • Benutzerabhängige Personalisierungslogik
  • Performance-kritische Laufzeitentscheidungen
  • Externe API- oder Service-Aufrufe

Bessere Alternativen

AnforderungEmpfohlene Lösung
GeschäftslogikPHP-Services
PersonalisierungController / ViewHelpers
LaufzeitentscheidungenMiddleware
Feature-TogglesKonfiguration oder Feature-Flags
Umfangreiche LogikGecachte Konfiguration

Faustregel

Wenn eine Bedingung:

  • Schwer zu lesen ist
  • Kommentare zur Erklärung benötigt
  • Von Laufzeitdaten abhängt

Dann gehört sie wahrscheinlich nicht in TypoScript.

Einer der größten Vorteile moderner TypoScript-Bedingungen ist die Möglichkeit, benutzerdefinierte Bedingungen zu definieren. Im Gegensatz zu Legacy-Bedingungen auf Basis von userFunc erlaubt die Symfony Expression Language saubere, wiederverwendbare und upgrade-sichere Erweiterungen.

Legacy vs. moderner Ansatz (Kurzer Kontext)

TYPO3 ≤ 9.3 (Legacy)

[userFunc = \Vendor\Extension\UserFunc\MyUserFunc('foo')]

TYPO3 ≥ 9.4 (Modern)

[variableA === 'valueB']

Moderne Bedingungen sind:

  • Deklarativ
  • Gut lesbar
  • Vollständig in den TYPO3 Core integriert

Schritt 1: Den Expression Language Provider registrieren

Registrieren Sie Ihren benutzerdefinierten Provider in der Extension-Konfiguration.

Datei: Configuration/ExpressionLanguage.php

<?php
return [
'typoscript' => [
\Vendor\ExtensionName\ExpressionLanguage\CustomTypoScriptConditionProvider::class,
]
];

Dadurch werden Ihre Variablen oder Funktionen für TypoScript Bedingungen verfügbar.

Schritt 2: Den benutzerdefinierten Condition Provider implementieren

Erstellen Sie einen Provider, der Variablen für die Expression Language bereitstellt.

Datei: Classes/ExpressionLanguage/CustomTypoScriptConditionProvider.php

<?php

namespace Vendor\ExtensionName\ExpressionLanguage;

use TYPO3\CMS\Core\ExpressionLanguage\AbstractProvider;

class CustomTypoScriptConditionProvider extends AbstractProvider
{
public function __construct()
{
$this->expressionLanguageVariables = [
'variableA' => 'valueB',
];
}
}

Wichtige Punkte

  • Variablen sind schreibgeschützt
  • Werte sollten deterministisch sein
  • Aufwendige Laufzeitlogik hier vermeiden

Schritt 3: Die benutzerdefinierte Bedingung in TypoScript verwenden

Nach der Registrierung kann die Variable wie jede integrierte Bedingung verwendet werden.

[variableA === 'valueB']
page >
page = PAGE
page.10 = TEXT
page.10.value = Matched
[GLOBAL]

Die Bedingung wird mit der Symfony Expression Language ausgewertet und verhält sich über TYPO3 Versionen hinweg konsistent.

Best Practices für benutzerdefinierte Bedingungen

  • Benutzerdefinierte Bedingungen nur für Konfigurationsentscheidungen verwenden
  • Die Logik einfach und vorhersehbar halten
  • Datenbankabfragen, API-Aufrufe oder benutzerspezifische Daten vermeiden
  • Benutzerdefinierte Provider bei TYPO3-Upgrades immer erneut testen

Warum dieser Ansatz bevorzugt wird

  • Keine veralteten APIs
  • Gleiche Provider-API in TYPO3 v13.4 und v14
  • Sauberer als userFunc
  • Leichter zu warten in Enterprise-Projekten

TYPO3 erlaubt auch die Registrierung benutzerdefinierter Expression-Funktionen, nicht nur von Variablen. Das ist eine fortgeschrittene Technik und sollte nur verwendet werden, wenn einfache Variablen nicht ausreichen.

Dieser Ansatz eignet sich für:

  • Wiederverwendbare Bedingungslogik
  • Read-only-Lookups
  • Kontrollierte externe Prüfungen (mit Vorsicht)

Wann eine benutzerdefinierte Expression-Funktion verwendet werden sollte

Verwenden Sie eine benutzerdefinierte Funktion, wenn:

  • Eine Bedingung Parameter benötigt
  • Die Logik nicht als statische Variable ausgedrückt werden kann
  • Das Ergebnis als Konfigurationsdaten behandelt werden kann

Verwenden Sie dies nicht für:

  • Geschäftslogik
  • Benutzerspezifische Entscheidungen
  • Performance-kritische Rendering-Pfade

Schritt 1: Einen Expression Function Provider implementieren

Erstellen Sie einen Provider, der eine benutzerdefinierte Funktion für TypoScript Bedingungen registriert.

<?php

namespace Vendor\ExtensionName\TypoScript;

use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class CustomConditionFunctionsProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions(): array
{
return [
$this->getWebserviceFunction(),
];
}

protected function getWebserviceFunction(): ExpressionFunction
{
return new ExpressionFunction(
'webservice',
function () {
// Compiler not required for TypoScript usage
},
function ($existingVariables, string $endpoint, int $uid) {
return GeneralUtility::getUrl(
'https://t3planet.de/en/endpoint/' . $endpoint . '/' . $uid
);
}
);
}
}

Wichtige Hinweise

  • Für TypoScript wird nur der Evaluator verwendet
  • Rückgabewerte müssen vorhersehbar sein
  • Langsame oder instabile Endpunkte vermeiden

Schritt 2: Die benutzerdefinierte Funktion in TypoScript verwenden

Nach der Registrierung verhält sich die Funktion wie eine native Bedingungsfunktion.

[webservice('pages', 10)]
page.10 >
page.10 = TEXT
page.10.value = Matched
[GLOBAL]

Sie können den zurückgegebenen Wert auch explizit vergleichen.

[webservice('pages', 10) === 'Expected title']
page.10 >
page.10 = TEXT
page.10.value = Matched
[GLOBAL]

Wichtige Warnhinweise (Vor der Verwendung lesen)

  • Bedingungen werden häufig ausgewertet
  • Externe Requests können das Rendering verlangsamen
  • Fehler können Bedingungen stillschweigend beeinträchtigen

Best Practice

  • Ergebnisse konsequent cachen
  • Funktionen ohne Seiteneffekte halten
  • Wenn möglich statische Variablen bevorzugen

Warum dies ein fortgeschrittenes Muster ist

  • Leistungsstark, aber leicht falsch einzusetzen
  • Erfordert starke Kontrolle über die Performance
  • Am besten geeignet für Enterprise-Projekte mit klaren Richtlinien

Wenn eine Bedingung schwer nachvollziehbar wird, gehört sie wahrscheinlich eher in:

  • PHP-Services
  • Controller
  • Middleware

Moderne TypoScript-Bedingungen auf Basis der Symfony Expression Language sind der empfohlene und zukunftssichere Ansatz für die Konfiguration von TYPO3-Projekten. Sie bieten eine sauberere Syntax, bessere Lesbarkeit und ein konsistentes Auswertungsmodell im Frontend und Backend.

Wenn Sie bestehende TYPO3-Sites betreuen, sollte die Migration von Legacy-Bedingungen zur modernen Syntax Teil jeder Upgrade-Strategie sein. Teams, die ihren gesamten Entwicklungs-Workflow modernisieren, können die AI Foundation für TYPO3 zudem als kontrollierte Grundlage für AI-Tools und Automatisierung nutzen.

Das reduziert technische Altlasten, verhindert stille Fehler und hält Ihre Konfiguration im Einklang mit aktuellen TYPO3-Standards. Dieselben Bedingungen funktionieren im TypoScript unserer TYPO3 Templates, zum Beispiel um ein Layout je Sprache oder Seitenbaum umzuschalten.

Verwenden Sie TypoScript-Bedingungen dort, wo sie sinnvoll sind: für Konfiguration, nicht für Geschäftslogik. Prüfen Sie sie immer bei größeren TYPO3 Upgrades. Mit der richtigen Struktur und Disziplin werden moderne Bedingungen zu einem leistungsstarken und zuverlässigen Werkzeug in der täglichen TYPO3 Entwicklung.

Weitere kostenlose TYPO3-Leitfäden

Upgrade, Barrierefreiheit, Relaunch, Mehrsprachigkeit, MCP, EU AI Act und Cyber Resilience Act: Jeder Leitfaden ist ein kostenloses PDF mit Excel-Arbeitsblatt zum Ausfüllen.

Alle kostenlosen TYPO3-Leitfäden ansehen

Moderne TypoScript Bedingungen verwenden die Symfony-Ausdruckssprache (eingeführt in TYPO3 v9.4), um Logik in einem einzelnen, gut lesbaren Ausdruck auszuwerten. Sie ersetzen die Legacy-Bedingungssyntax und sind upgrade-sicher.

Legacy-Bedingungen wie [globalVar] und [userFunc] sind veraltet. Sie können in älteren TYPO3-Versionen noch funktionieren, sollten jedoch in neuen Projekten oder bei Upgrades nicht mehr verwendet werden.

Ja, jedoch funktionieren nicht alle Bedingungen in beiden Bereichen. Einige sind nur im Frontend verfügbar (z. B. getTSFE(), siteLanguage()), andere nur im Backend (z. B. backend.user.*, workspace.*).

getTSFE() ist nur während des Frontend-Renderings verfügbar. Wenn die Bedingung im Backend, in der CLI oder im Scheduler-Kontext ausgeführt wird, ergibt sie immer false.

Erstelle benutzerdefinierte Bedingungen nur für Konfigurationsentscheidungen, die sich nicht mit integrierten Variablen oder Funktionen ausdrücken lassen. Verwende sie nicht für Geschäftslogik oder performancekritische Prüfungen.

Ja. TypoScript-Bedingungen werden sehr häufig ausgewertet. Deshalb sollten sie einfach, deterministisch und schnell sein. Umfangreiche Logik oder externe Aufrufe können die Performance negativ beeinflussen.

Souveräne TYPO3 KI: AI Foundation ist kostenlos und Open Source, sechs KI-Erweiterungen bauen darauf auf.

TYPO3 KI entdecken