Das ultimative TypoScript-Bedingungen-Spickzettel

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).

Das ultimative TypoScript-Bedingungen-Spickzettel

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.

AnwendungsfallTypoScript ConditionKontext
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

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-VersionUnterstützungHinweise
TYPO3 8 LTSNeinNur Legacy-TypoScript-Bedingungen
TYPO3 9.0–9.3NeinSymfony Expression Language nicht verfügbar
TYPO3 9.4 LTSJaErste Version mit modernen Bedingungen
TYPO3 10 LTSJaVollständig stabil
TYPO3 11 LTSJaEmpfohlen für den Produktivbetrieb
TYPO3 12 LTSJaAktuelle 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:
  • Niemals Legacy- und moderne Bedingungssyntax miteinander mischen.

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.

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

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

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-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-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

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"]

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 verwendet
  • backend.* 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

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

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 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

<?php
return [
'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

<?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
  • Vollständig kompatibel mit TYPO3 11 & 12
  • 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

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.

<?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]

Du kannst 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 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.

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.

Your One-Stop Solutions for Custom TYPO3 Development

  • A Decade of TYPO3 Industry Experience
  • 350+ Successful TYPO3 Projects
  • 87% Repeat TYPO3 Customers
TYPO3 Service
wolfgang weber

Post a Comment

×