Moderne TypoScript-Bedingungen helfen dir, eine sauberere, sicherere und wartungsfreundlichere TYPO3-Konfiguration zu schreiben. Dieser Leitfaden ist als praktischer Cheatsheet aufgebaut und konzentriert sich auf reale Beispiele mit der Symfony Expression Language, damit du sie schnell kopieren und direkt verwenden kannst.
Moderne TypoScript-Bedingungen helfen dir, eine sauberere, sicherere und wartungsfreundlichere TYPO3-Konfiguration zu schreiben. Dieser Leitfaden ist als praktischer Cheatsheet aufgebaut und konzentriert sich auf reale Beispiele mit der Symfony Expression Language für schnelles Copy-Paste und sofortige Anwendung.
Seit TYPO3 v9.4 LTS bildet die Symfony Expression Language die Grundlage für moderne TypoScript-Bedingungen und ersetzt die frühere Legacy-Syntax. Wenn du täglich mit TYPO3 arbeitest, weißt du 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 dir alles, was du benötigst, um TypoScript-Bedingungen korrekt, sicher und upgrade-sicher zu verwenden.
TypoScript-Bedingungen-Spickzettel (Schnellreferenz)
| Anwendungsfall | TypoScript Condition | Kontext |
| Site-Sprach-ID prüfen | [siteLanguage("languageId") == 1] | FE |
| Site-Sprachtitel prüfen | [siteLanguage("title") == "English"] | FE |
| Seiten-UID prüfen | [page["uid"] == 17] | FE |
| Mehrere Seiten prüfen | [page["uid"] in [17,24]] | FE |
| Backend-Layout der Seite prüfen | [page["backend_layout"] == 1] | FE |
| Root-Seite prüfen | [tree.level == 0] | FE |
| Prüfen, ob Seite in der Rootline ist | [2 in tree.rootLineIds] | FE |
| Prüfen, ob Frontend-Benutzer angemeldet ist | [frontend.user.isLoggedIn] | FE |
| Prüfen, ob Backend-Benutzer angemeldet ist | [backend.user.isLoggedIn] | BE |
| Backend-Admin-Benutzer prüfen | [backend.user.isAdmin] | BE |
| Anwendungskontext prüfen | [applicationContext == "Development"] | FE / BE |
| Produktionsumgebung prüfen | [applicationContext matches "#^Production#"] | FE / BE |
| TYPO3-Version prüfen | [compatVersion("11.5")] | FE / BE |
| Domain / Host prüfen | [like(request.getNormalizedParams().getHttpHost(), "*.example.com")] | FE |
| HTTPS prüfen | [request.getNormalizedParams().isHttps()] | FE |
| Query-Parameter prüfen | [request.getQueryParams()['foo'] == 1] | FE |
| Aktuellen Wochentag prüfen | [date("w") == 5] | FE |
| Site-Identifier prüfen | [site("identifier") == "mysite"] | FE |
| Workspace prüfen | [workspace.isLive] | FE / BE |
| Frontend-Benutzergruppe prüfen | [usergroup("12")] | FE |
TYPO3 Versionskompatibilität für Symfony TypoScript Bedingungen
Symfony Expression Language–basierte TypoScript Bedingungen sind die moderne und unterstützte Methode, um Bedingungen in TYPO3 zu schreiben. Sie ersetzen die frühere Legacy-Bedingungssyntax und sind in aktuellen LTS-Versionen stabil verfügbar.
TYPO3-Versionen, die Symfony TypoScript Bedingungen unterstützen
| TYPO3-Version | Unterstützung | Hinweise |
| TYPO3 8 LTS | Nein | Nur Legacy-TypoScript-Bedingungen |
| TYPO3 9.0–9.3 | Nein | Symfony Expression Language nicht verfügbar |
| TYPO3 9.4 LTS | Ja | Erste Version mit modernen Bedingungen |
| TYPO3 10 LTS | Ja | Vollständig stabil |
| TYPO3 11 LTS | Ja | Empfohlen für den Produktivbetrieb |
| TYPO3 12 LTS | Ja | Aktuelle Best Practice |
Veraltete vs empfohlene Bedingungssyntax
- Legacy-Bedingungen ([globalVar], [userFunc]) sind veraltet
- Symfony-basierte Bedingungen sind:
- Zukunftskompatibel
- Upgrade-sicher
- Aktiv gepflegt
Verwenden Sie für neue und aktualisierte Projekte ausschließlich die Symfony-Ausdruckssprache.
Migrations & Upgrade-Hinweise
- TYPO3 ≤ 8
Upgrade erforderlich, bevor moderne Bedingungen verwendet werden können - TYPO3 9.0–9.3
Bedingungen vor dem Upgrade refaktorieren - TYPO3 ≥ 9.4
Ausschließlich Symfony-basierte Bedingungen verwenden
Bewährte Verfahren für Unternehmen
- TYPO3 ≥ 9.4 als Basisversion voraussetzen.
- Bedingungen während Upgrades validieren, insbesondere bei:
- TYPO3 11 LTS
- TYPO3 12 LTS
- Niemals Legacy- und moderne Bedingungssyntax miteinander mischen.
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 LTS 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, erweiterbare und zukunftssichere Syntax einzuführen.
Unten findest du einen direkten Vorher-Nachher-Vergleich, der zeigt, wie häufige Bedingungen von der Legacy-Syntax zu modernem TYPO3 (≥ 9.4) übersetzt werden.
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
Vermächtnis
[globalVar = GP:L = 1]
Modern
[siteLanguage("languageId") == 1][siteLanguage("title") == "English"][siteLanguage("locale") == "en_US.UTF-8"]
TypoScript-Konstanten
Vermächtnis
[globalVar = LIT:1 = {$myConstant}]
Modern
[{$myConstant} == 1]
Seiten-UID-Prüfungen
Vermächtnis
[globalVar = TSFE:id = 17][globalVar = TSFE:id = 17, TSFE:id = 24]
Modern
[page["uid"] == 17][page["uid"] in [17,24]][getTSFE().id == 17][getTSFE().id in [17,24]]
Seiteneigenschaften
Vermächtnis
[page|backend_layout = 1]
Modern
[page["backend_layout"] == 1]
Domain / Hostname-Prüfungen
Vermächtnis
[globalString = IENV:HTTP_HOST = *.example.com]
Modern
[like(request.getNormalizedParams().getHttpHost(),"*.example.com")]
Datumsbasierte Bedingungen
Vermächtnis
[dayofweek = 5]
Modern
[date("w") == 5]
Extension / Request-Parameter
Vermächtnis
[globalVar = GP:tx_extkey|param > 0]
Modern
[(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
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]Verwende 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.
Anwendungskontext — 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#" && getTSFE().isBackendUserLoggedIn()][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. Achte 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]
backend — Backend-Benutzerkontext (nur BE)
Stellt Backend-Benutzerinformationen bereit. Nur im Backend-Kontext verfügbar.
[backend.user.isAdmin][backend.user.isLoggedIn][backend.user.userId == 5][like("," ~ backend.user.userGroupList ~ ",", ",1,")]
frontend — Frontend-Benutzerkontext (nur FE)
Stellt Frontend-Authentifizierungsdaten bereit. Nur im Frontend-Kontext verfügbar.
[frontend.user.isLoggedIn][frontend.user.userId == 5][like("," ~ frontend.user.userGroupList ~ ",", ",1,")]
typo3 — TYPO3-Umgebungsinformationen
Stellt systembezogene TYPO3-Metadaten bereit.
[typo3.version == "10.4.2"][typo3.branch == "10.4"][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 sowie eine initialisierte TSFE-Instanz (TypoScript Frontend Controller).
Wenn sie im Backend, in der CLI oder im Scheduler ausgewertet werden, ergeben diese Bedingungen immer false.
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
- Initialisierter TSFE-Instanz
Frontend-Benutzer & Authentifizierungsbedingungen
Werden verwendet, um Frontend-Benutzerstatus und Berechtigungen auszuwerten.
[frontend.user.isLoggedIn][frontend.user.userId == 5][usergroup("12")][loginUser("*")][loginUser("3,7,9")]
Hinweise
- usergroup() und loginUser() prüfen nur FE-Benutzer
- Anonyme Benutzer liefern immer false
Frontend-Seiten & TSFE-basierte Bedingungen
Diese Bedingungen greifen direkt auf das TSFE-Objekt zu.
[getTSFE().page["uid"] == 1][getTSFE().id in [17,24]][getTSFE().isBackendUserLoggedIn()]
Hinweise
- getTSFE() ist nur im Frontend verfügbar
- Ergibt immer false in BE oder CLI
Frontend-Anfrage-basierte Bedingungen
Werden verwendet, um Request-Daten, Header und Routing-Argumente auszuwerten.
[request.getQueryParams()['foo'] == 1][request.getParsedBody()['foo'] == 1][request.getHeaders()['Accept'] == 'json'][request.getCookieParams()['foo'] == 1][request.getPageArguments().get('foo_id') > 0][request.getNormalizedParams().isHttps()][request.getNormalizedParams().getHttpHost() == "t3planet.com"]
Hinweise
- Request-Daten sind in der CLI nicht verfügbar
- Nur während FE-Rendering verwenden
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") == "de_CH"][siteLanguage("title") == "German"]
Hinweise
- site() und siteLanguage() können null zurückgeben
- Nur im FE-Kontext sicher verwendbar
Frontend-Session-Bedingungen
Werden verwendet, um Werte aus der TYPO3-Frontend-Session zu lesen.
[session("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][backend.user.userGroupList matches "/,1,/"]
Hinweise
- backend.user ist im FE nicht definiert
- 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-Kontext existiert nur im BE
- FE-Rendering geht immer vom Live-Workspace aus
Utility-Funktionen für Frontend & Backend
Diese Funktionen sind kontextunabhängig, benötigen jedoch verfügbare Laufzeitdaten.
[date("d.m.") == "05.04.2019"][date("j") == 7][like("foobarbaz", "*bar*")][like("fooBarBaz", "/f[o]{2,2}[aBrz]+/")][traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0][ip("172.18.*")][ip("devIP")][compatVersion("11.5")][getenv("VIRTUAL_HOST") == "t3planet.de"]
Häufige Fehler bei TypoScript Bedingungen
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
- Bedingung wird im Backend, in der CLI oder im Scheduler ausgewertet
- TSFE ist nicht initialisiert
So vermeidest du es
- getTSFE() nur im Frontend-Rendering verwenden
- 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 vermeidest du 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 vermeidest du 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 vermeidest du 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 vermeidest du es
- request.* nur im FE verwenden
- Nicht während Cache-Warmup oder Builds einsetzen
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
Verwende TypoScript-Bedingungen, wenn du Konfiguration steuern möchtest, 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 (11 LTS, 12 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 extensions.
Vermächtnis 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
Registriere deinen benutzerdefinierten Provider in der Extension-Konfiguration.
Datei: Configuration/ExpressionLanguage.php
<?phpreturn ['typoscript' => [\Vendor\ExtensionName\ExpressionLanguage\CustomTypoScriptConditionProvider::class,]];
Dadurch werden deine Variablen oder Funktionen für TypoScript Bedingungen verfügbar.
Schritt 2: Den benutzerdefinierten Condition Provider implementieren
Erstelle 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
- Vollständig kompatibel mit TYPO3 11 & 12
- 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
Verwende 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
Verwende dies nicht für:
- Geschäftslogik
- Benutzerspezifische Entscheidungen
- Performance-kritische Rendering-Pfade
Schritt 1: Einen Expression Function Provider implementieren
Erstelle 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]
Du kannst 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 du bestehende TYPO3 Sites betreust, sollte die Migration von Legacy-Bedingungen zur modernen Syntax Teil jeder Upgrade-Strategie sein. Das reduziert technische Altlasten, verhindert stille Fehler und hält deine Konfiguration im Einklang mit aktuellen TYPO3-Standards.
Verwende TypoScript Bedingungen dort, wo sie sinnvoll sind für Konfiguration, nicht für Geschäftslogik und überprüfe 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.
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.

Wolfgang Weber
Brand & Communication LeadWolfgang Weber gestaltet TYPO3 mit Leidenschaft und Expertise. Als langjähriger TYPO3-Enthusiast hat er zu zahlreichen Projekten beigetragen, die Websites schneller und sicherer machen. Abseits von TYPO3 findet man ihn…
More From Author