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.
Was ist eine TypoScript-Bedingung? (Kurzantwort)
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 mitrequest?.getPageArguments()?.getPageId().loginUser()undusergroup()wurden in v12 als veraltet markiert und in v13 entfernt. Nutzen Siefrontend.userundbackend.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
TypoScript-Bedingungen-Spickzettel (Schnellreferenz)
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
| Anwendungsfall | TypoScript-Bedingung | Kontext | Funktioniert in |
| Aktuelle Seiten-UID | [traverse(page, "uid") == 17] | FE | v9.4+ |
| Mehrere Seiten | [traverse(page, "uid") in [17,24]] | FE | v9.4+ |
| Bereich von Seiten-UIDs | [traverse(page, "uid") in 10..20] | FE | v13.4, v14 |
| Seiten-ID aus dem Routing (ersetzt getTSFE().id) | [request?.getPageArguments()?.getPageId() == 42] | FE | v12.1+ |
| Seitentyp, zum Beispiel 98 | [request && request.getPageArguments()?.getPageType() == 98] | FE | v12.1+ |
| Backend-Layout inklusive Vererbung | [tree.pagelayout === "pagets__Home"] | FE | v13.4, v14 |
| Seite auf Root-Ebene | [tree.level == 0] | FE | v9.4+ |
| Seite 2 liegt in der Rootline | [2 in tree.rootLineIds] | FE | v9.4+ |
| Jede Unterseite von Seite 30 | [30 in tree.rootLineParentIds] | FE | v10.3+ |
Site und Sprache
| Anwendungsfall | TypoScript-Bedingung | Kontext | Funktioniert in |
| Sprach-ID | [siteLanguage("languageId") == 1] | FE | v9.4+ |
| Locale der Site-Sprache | [siteLanguage("locale").getName() == "de-DE"] | FE | v13.4, v14 |
| Locale-Abkürzung | [locale().getName() == "de-DE"] | FE | v14 |
| Site-Identifier | [site("identifier") == "main"] | FE | v9.4+ |
| Host der Site-Basis | [site("base").getHost() == "www.example.org"] | FE | v13.4, v14 |
| Eigene Site-Einstellung | [traverse(site("configuration"), "settings/some/setting") == "someValue"] | FE | v13.4, v14 |
Frontend- und Backend-Benutzer
| Anwendungsfall | TypoScript-Bedingung | Kontext | Funktioniert in |
| Frontend-Benutzer angemeldet | [frontend.user.isLoggedIn] | FE | v9.4+ |
| Frontend-Benutzer nicht angemeldet | [!frontend.user.isLoggedIn] | FE | v9.4+ |
| Frontend-Benutzer in Gruppe 11 | [11 in frontend.user.userGroupIds] | FE | v11.2+ |
| Backend-Benutzer angemeldet | [backend.user.isLoggedIn] | FE / BE | v9.4+ |
| Backend-Benutzer ist Admin | [backend.user.isAdmin] | FE / BE | v9.4+ |
| Backend-Benutzer in Gruppe 2 | [2 in backend.user.userGroupIds] | FE / BE | v11.2+ |
Request: Host, HTTPS, Parameter, Gerät
| Anwendungsfall | TypoScript-Bedingung | Kontext | Funktioniert in |
| HTTPS-Anfrage | [request && request.getNormalizedParams().isHttps()] | FE | v9.4+ |
| Exakter Host | [request && request.getNormalizedParams().getHttpHost() == "example.org"] | FE | v9.4+ |
| Beliebige Subdomain | [request && like(request.getNormalizedParams().getHttpHost(), "*.example.org")] | FE | v9.4+ |
| GET-Parameter tx_news_pi1[news] | [request && traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0] | FE | v9.4+ |
| Cookie-Wert | [request && request.getCookieParams()['foo'] == 1] | FE | v9.4+ |
| User-Agent enthält "Mobile" | [request && like(traverse(request.getHeaders(), 'user-agent/0'), '*Mobile*')] | FE | v13.4, v14 |
Kontext, Version, IP und Datum
| Anwendungsfall | TypoScript-Bedingung | Kontext | Funktioniert in |
| Development-Kontext | [applicationContext == "Development"] | FE / BE | v9.4+ |
| Production und Unterkontexte | [applicationContext matches "/^Production/"] | FE / BE | v9.4+ |
| TYPO3 13.4 oder neuer | [compatVersion("13.4")] | FE / BE | v9.4+ |
| Exakter TYPO3-Branch | [typo3.branch == "14.3"] | FE / BE | v9.4+ |
| Client-IP passt zur devIPmask | [ip("devIP")] | FE | v9.4+, seit v13 nur FE |
| Feature-Toggle aktiv | [feature("security.frontend.enforceContentSecurityPolicy") === true] | FE / BE | v13.4, v14 |
| Freitag | [date("w") == 5] | FE / BE | v9.4+ |
| Zwischen 9:00 und 16:59 Uhr | [date("G") >= 9 && date("G") < 17] | FE / BE | v9.4+ |
| Live-Workspace | [workspace.workspaceId == 0] | FE / BE | v9.4+ |
| Umgebungsvariable | [getenv("VIRTUAL_HOST") == "www.example.org"] | FE / BE | v9.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.
TYPO3 Versionskompatibilität für Symfony TypoScript Bedingungen
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-Version | Expression-Syntax | Was sich bei Bedingungen geändert hat |
| 9.3 und älter | Nein | Nur Legacy-Syntax |
| 9.4 / 9.5 LTS | Ja | Symfony Expression Language in 9.4 eingeführt, Legacy-Syntax in 9.5 als veraltet markiert |
| 10 LTS | Ja | Legacy-Bedingungen entfernt; tree.rootLineParentIds in 10.3 ergänzt |
| 11 LTS | Ja | Arrays userGroupIds für Frontend- und Backend-Benutzer in 11.2 ergänzt |
| 12 LTS | Ja | Neuer TypoScript-Parser: [END] entspricht [GLOBAL], @import in Bedingungen, Null-safe ?. (12.1); loginUser() und usergroup() veraltet |
| 13.4 LTS | Ja | loginUser() und usergroup() entfernt, ip() nur im Frontend, <INCLUDE_TYPOSCRIPT: veraltet |
| 14.3 LTS | Ja | getTSFE() 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()undusergroup()ersetzen - TYPO3 13.4 auf 14
Jeden Aufruf vongetTSFE()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.
Symfony Expression Language in TYPO3 TypoScript Bedingungen
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.
Alte vs Neue TypoScript Bedingungen (Vorher-Nachher-Vergleich)
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 Bedingung | Ersatz | Hinweis |
[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.
Variablen und Funktionen in TypoScript Bedingungen verstehen
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
Verfügbare TypoScript Bedingungsvariablen
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 TypoScript Bedingungen
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
- usergroup() und loginUser() wurden in TYPO3 v12 als veraltet markiert und in v13 entfernt; verwenden Sie stattdessen frontend.user
- Anonyme Benutzer liefern immer false
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
Nur-Backend TypoScript Bedingungen
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
Utility-Funktionen für Frontend & Backend
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"]
Warum greift meine TypoScript-Bedingung nicht? (Fehlerbehebung)
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 Variablepageersetzen - Niemals in Backend-Logik einsetzen
2. Verwechslung von Frontend- und Backend-Kontext
Was passiert
Bedingungen ergeben immer false.
Warum das passiert
frontend.*im Backend verwendetbackend.*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:
@importin 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
requestergibt im Page- und User-TSconfig immer falseip()benötigt einen Request und ist seit TYPO3 v13 nur im Frontend verfügbar
So vermeiden Sie es
- Im TSconfig
backend.user,treeoder 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.
Best Practices & Anti-Patterns für TypoScript 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
| Anforderung | Empfohlene Lösung |
| Geschäftslogik | PHP-Services |
| Personalisierung | Controller / ViewHelpers |
| Laufzeitentscheidungen | Middleware |
| Feature-Toggles | Konfiguration oder Feature-Flags |
| Umfangreiche Logik | Gecachte 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.
Benutzerdefinierte TypoScript Bedingungen mit Symfony Expression Language erstellen
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
<?phpreturn ['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
<?phpnamespace 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 = PAGEpage.10 = TEXTpage.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
Erweiterte benutzerdefinierte TypoScript Bedingungen mit Symfony Expression Language
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.
<?phpnamespace 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 = TEXTpage.10.value = Matched[GLOBAL]
Sie können den zurückgegebenen Wert auch explizit vergleichen.
[webservice('pages', 10) === 'Expected title']page.10 >page.10 = TEXTpage.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
Fazit
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.
FAQs
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
Wolfgang Weber
Brand & Communication LeadWolfgang Weber gestaltet TYPO3 mit Leidenschaft und Fachwissen. Als TYPO3-Enthusiast beim T3Planet Shop hat er an TYPO3-Projekten mitgewirkt, die Websites schneller und sicherer machen. Abseits von TYPO3 findet man ihn wahrscheinlich beim Erkunden lokaler Cafés oder beim Fußball.
More From Author