TYPO3: TypoScript Bedingungen (TYPO3 Version 8)

Bedingungen für die Verwendung in TypoScript.

Achtung: In TYPO3 ab Version 9 gibt es eine neue Syntax: Symfony ExpressionLanguage

 

Grundsätzliches

  1. Manche der nachfolgenden Bedingungen machen nur im Frontend Sinn, teilweise funktionieren die Bedingungen aber auch im Backend, also in der Page und User TSConfig. Dies ist bei den jeweiligen Bedingungen in Klammern vermerkt.
  2. Achtung: So wenig TypoScript Conditions wie möglich einsetzen, denn mit jeder Condition steigen die Cache-Einträge in der Datenbank exponentiell.
  3. Jede Bedingung muss mit [end] abgeschlossen werden. [global] hat den gleichen Effekt, ist aber selbst eigentlich eine Bedingung, für den „globalen“ Context. Ausnahme: Nach der Bedingung erfolgt eine weitere, dann kann [end] weggelassen werden:
    [globalVar = ...]
    ...
    [PIDinRootline = ...]
    ...
    [end]
  4. Bedingungen dürfen nicht innerhalb geschweifter Klammern stehen, z.B. diese Anweisung ist fehlerhaft:
    plugin.my_ext {
      [globalVar = GP:L = 2]
      mySetting = myValue
      [end]
    }
  5. Bei vielen Bedingungen kann * als Platzhalter (=keines, eins oder mehrere beliebige Zeichen) verwendet werden
  6. Die Bedingungen funktionieren auch in Feld „Constants„. Konstanten können dort aber nicht eingesetzt werden, dies geht also NICHT:
    [globalVar = LIT:{$MEINE_KONSTANTE} > 0]
  7. Bei Bedingungen kann man [else] verwenden:
    [globalVar = ...]
    ...
    [else]
    ...
    [end]
  8. In Funktion TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractConditionMatcher->evaluateConditionCommon() stehen alle verfügbaren Bedingungen.
  9. Variablen aus dem REGISTER können nicht genutzt werden, da das REGISTER zu einem späteren Zeitpunkt befüllt wird. NICHT möglich ist also:
    page.100 = LOAD_REGISTER
    page.100.myValue.data = levelfield:-1, title, slide
    [globalVar = TSFE:register|myValue = 123]
    ...
    [end]

1) globalVar / globalString (FE)

Überprüfung auf „globale“ Variablen: globalVar überprüft, ob eine Variable mit einer Zahl übereinstimmt, globalString überprüft eine Variable auf die Übereinstimmung mit einer Zeichenketten.

Als globale Variablen gibt es z.B. TSFE, GP, BE_USER, IENV, HTTP_HOST, LIT oder TYPO3_LOADED_EXT und weitere.

Als Vergleichsoperatoren sind bei globalVar >, <, >=, <=, = und != möglich, bei globalString nur =.

1.1) GP (GET/POST)

Überprüfung auf Parameter in der GET und POST Superglobalen.

Beispiel 1: Überprüfen auf Sprache

[globalVar = GP:L = 123]

Beispiel 2: Überprüfen auf Parameter einer Extension

Parameter aus GET bei einer tt_news Detailseite:

[globalVar = GP:tx_ttnews|tt_news > 0]

Parameter aus POST bei einem formhandler Formular

[globalString = GP:formhandler|gender = w]

Wenn der Parameter in einem Array liegt (hier $_GET[‚tx_ttnews‘][‚tt_news‘] und $_POST[‚formhandler‘][‚gender‘]), wird der Array mit der Pipe durchlaufen.

1.2) TSFE

1.2.1) TSFE:id (Seiten-ID)

Beispiel 1: Überprüfen auf Seiten-ID

[globalVar = TSFE:id = 123]

Beispiel 2: Überprüfen, ob eine TypoScript Konstante gleich der Seiten-ID ist:

[globalVar = TSFE:id = {$MEINE_KONSTANTE}]

1.2.2) TSFE:page (Seiteneigenschaften)

Eigenschaften einer Seite überprüfen.

Beispiel: Überprüfen auf Feld „Alias“

[globalString = TSFE:page|alias = home]

1.2.3) TSFE:beUserLogin: Eingeloggter BE User

Überprüfen, ob der Webseiten-Besucher im Backend eingeloggt / nicht eingeloggt ist:

[globalVar = TSFE:beUserLogin > 0]
[globalVar = TSFE:beUserLogin < 1]

1.2.4) TSFE:fe_user (Daten des Benutzers)

Beispiel 1: Überprüfen auf Erstellungsdatum des Benutzer-Datensatzes

[globalString = TSFE:fe_user|user|crdate > {$userCreationDate}]

Beispiel 2: Überprüfen auf einen Wert in der Benutzer-Session

[globalString = TSFE:fe_user|sesData|hasDoneSomething > 0]

Hinweis: Auf einen beliebigen Wert in der Session-Superglobalen kann man über TypoScript nicht direkt zugreifen, man muss den Umweg über eine PHP-Funktion gehen oder über Ext. session.

1.3) ENV / IENV (Server-Umgebungsvariablen)

Überprüfung auf Server-Umgebungsvariablen ($_SERVER-Superglobale).

Achtung: Bei Verwendung von ENV hat man den Nachteil, dass man die unbearbeitete Rückgabe der Funktion getenv() erhält, die NICHT auf allen Systemen gleich ist.

Beispiel: Überprüfen auf Domain

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

1.4) LIT (TypoScript-Konstante)

Diese Variable ist etwas schwer zu erklären: „LIT“ bedeutet „literal“, also „wörtlich“, „buchstäblich“. Hinter „LIT:“ wird also ein String (oder Integer) erwartet, der dann – so wie er ist – mit dem zweiten Wert verglichen wird. Verwendungszweck wären also nur solch unsinnige Überprüfungen wie

[globalVar = LIT:1 > 0]
[globalString = LIT:text1 = text1]

Da aber alle TypoScript-Konstanten im TypoScript-Setup ersetzt werden (bevor diese Bedingung überprüft wird), kann man LIT verwenden, um TypoScript-Konstanten zu überprüfen. Diese Conditions funktionieren daher nur im TypoScript Setup und nicht bei den TypoScript Konstanten.

Beispiel 1: Überprüfen, ob TypoScript Konstante größer als 0 ist:

[globalVar = LIT:{$MEINE_KONSTANTE} > 0]

Beispiel 2: Überprüfen, ob eine TypoScript Konstante gesetzt ist:

[globalString = LIT:{$MEINE_KONSTANTE} = /(.+)/]

Diese Bedingung ist „wahr“, wenn die Konstante einen Wert enthält oder (Achtung!) NICHT vorhanden ist. Die Bedingung ist „falsch“, wenn die Konstante keinen Wert enthält oder „0“.

1.5) TYPO3_LOADED_EXT (Geladene Erweiterungen)

Achtung: Nach TYPO3_LOADED_EXT steht eine Pipe, im Gegensatz zu den anderen Variablen. Wenn du weißt, wieso das so ist, bitte informiere mich.

Beispiel: Überprüfen, ob eine Extension installiert ist.

[globalString = TYPO3_LOADED_EXT|tt_news|type = /(.+)/]

Alternative: Möglich ist auch die Verwendung einer Core-Funktion:

[userFunc = TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('tt_news')]

1.6) _COOKIE (Cookies)

Beispiel: Überprüfen auf Wert in Cookie

[globalString = _COOKIE|myCookie = someValue]
[globalVar = _COOKIE|myCookie = false]

1.7) SIM_EXEC_TIME

Enthält den aktuellen Timestamp oder das über das Admin-Tool gewählte „simulierte Datum“.

Beispiel: Überprüfen auf Datum größer 20.2.2015, 0:00 Uhr (GMT)

[globalVar = SIM_EXEC_TIME > 1424390400]

1.8) Reguläre Ausdrücke

Beim Überprüfen einer Zeichenkette kann man einen regulären Ausdruck einsetzen. Der reguläre Ausdruck muss in Slashes stehen.

Beispiel: Überprüfen, ob die Konstante nur aus Buchstaben besteht

[globalString = LIT:{$MEINE_KONSTANTE} = /[a-z]/]

Achtung: Der reguläre Ausdruck darf keine Kommas enthalten! NICHT erlaubt ist also zum Beispiel /[a-z]{2,4}/

2) page (FE & BE)

Eigenschaften einer Seite überprüfen (identisch zu Bedingung TSFE:page, diese Bedingung funktioniert aber auch im Backend).

Beispiel: Überprüfen auf Seitentyp

[page|doktype = 1]

3) PIDinRootline / PIDupinRootline (FE & BE)

Beispiel 1: Überprüfen, ob die aktuelle Seite die genannte Seite oder eine Unterseite ist

[PIDinRootline = 123, 124]

Beispiel 2: Überprüfen, ob sich die aktuelle Seite innerhalb einem bestimmten Seitenbaum befindet

[PIDupinRootline = 123, 124]

4) Login Status / Benutzerrechte

4.1) loginUser (FE & BE)

Beispiel 1: Überprüfen, ob der Benutzer eingeloggt ist

[loginUser = *]

Beispiel 2: Überprüfen, ob der Benutzer einer bestimmten Benutzer-ID angehört.

[loginUser = 1,2,3,...]

Hinweis: Funktioniert auch im Backend. Im Frontend wird auf User der Tabelle fe_users überprüft, im Backend auf User der Tabelle be_users.

4.2) usergroup (FE & BE)

Beispiel: Überprüfen, ob der Benutzer einer bestimmten Benutzergruppen angehört

[usergroup = 1,2,...]

Achtung: Die Anweisung [usergroup = *] sollte nicht verwendet werden, um zu prüfen, ob ein User eingeloggt ist.

Hinweis: Funktioniert auch im Backend. Im Frontend wird auf Benutzergruppen der Tabelle fe_groups überprüft, im Backend auf Benutzergruppen der Tabelle be_groups.

4.3) adminUser (BE)

Überprüfen, ob der aktuelle Benutzer ein Admin ist:

[adminUser = 1]

Achtung: Diese Bedingung ist nur im Backend wirksam.

5) treeLevel (FE & BE)

Beispiel: Überprüfen, auf welcher Menüebene die Seite liegt

[treeLevel = 0,2]

0 (Null) ist die Root-Seite, 1 die erste Navigationsebene usw.

Hinweis: Bedingung funktioniert auch in Page- und User-TSConfig.

6) applicationContext (FE & BE)

Beispiel: Überprüfung des „Application Context“, z.B. „Development“ oder „Production“:

[applicationContext = Development]
[applicationContext = Development*]

7) compatVersion (FE & BE)

Überprüfen der TYPO3 Version.

Beispiel: Überprüfen, ob TYPO3 System mit Version 4.5.0 oder höher eingesetzt wird (also z.B. auch TYPO3 Version 6.2)

[compatVersion = 4.5]

Achtung: Bei compatVersion geht als Vergleichsoperator nur „=“.

8) browser / version / system / device / useragent / language / IP / hostname (FE & BE)

Achtung: In TYPO3 Version 8 wurden „browser“, „version“, „device“, „system“ und „useragent“ entfernt!

Überprüfen auf Browser,  Browserversion, Betriebssystem, Ausgabemedium, User Agent, Sprache, IP-Adresse, Host.

Beispiel: Alle Internet Explorer Version 6 und kleiner:

[browser = msie] && [version = <7]

Achtung: Den Vergleichsoperator „kleiner gleich“ bzw. „größer gleich“ gibt es nicht, nur „kleiner“, „größer“ und „gleich“.

Beispiel: Mobiles Endgerät

[useragent = *iPhone*] || [useragent = *iPod*] || [useragent = *iPad*] || [useragent = *Android*] || [useragent = *OperaMini*] || [useragent = *BlackBerry*]

Weiterführende Links: Browser Browserversion Betriebssystem Ausgabemedium User Agent Sprache IP-Adresse Host-Name

9) minute / hour / dayofweek / dayofmonth / month (FE & BE)

Beispiel: Überprüfen auf Uhrzeit ab 14 Uhr:

[hour = >= 14]

Überprüfen auf Minute, Stunde, Wochentag, Monatstag, Monat.

Weiterführender Link

Vor allem hier muss man gut auf das Caching achten (siehe „Grundsätzliches“, Punkt 1).

Achtung bei Verwendung von mehreren mit UND verknüpften Datumsangaben:

[month = >= 2] AND [dayofmonth = >= 12] AND [hour = >= 22] AND [minute = >= 30]

Achtung: Dieses Bedingung hier ist nicht gültig ab dem 12.2. 22:30 Uhr sondern ab 22 Uhr immer von 30 nach jeder Stunde bis zur vollen Stunde, nur nicht im Januar und nicht vom 1. bis 11. Tag im Monat oder anders ausgedrückt: Die Bedingung ist das erste mal gültig am 12.2. von 22:30 Uhr bis 22:59:59 Uhr, das nächste mal von 23:30 bis 23:59:59 Uhr, das nächste mal am 13.2. von 22:30 bis 22:59:59 Uhr usw. bis Ende Februar. Im März ist sie das erste mal gültig am 12.3. von 22:30 Uhr bis 22:59:59 Uhr usw.

10) Eigene Bedingung / Custom Conditions (FE & BE)

Ohne userFunc, ab TYPO3 7.0 möglich.

TS Setup

[MyNamespace\MyExt\Condition\MyCondition = myOptionalValue]

EXT:myExt/Classes/Condition/MyCondition.php

namespace MyNamespace\MyExt\Condition;
 
class MyCondition extends \TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractCondition {
  public function matchCondition(array $conditionParameters) {
    return TRUE;
  }
}

Offizielle Doku

Achtung: Wenn die Klasse nicht gefunden wird, kommt keine Fehlermeldung! Wenn die Condition nicht ausgeführt wird, hilft es, alle TYPO3 Caches zu leeren (auch „autoload information“ über das Install Tool).

10.1) Nützliche Custom Conditions

Ext. powermail: Prüfen, ob ein Plugin auf einer Seite eingesetzt wird: github.com/einpraegsam/powermail/commit/48513aff17a6e3f3c68624e8610a7c573b43f63b

11) userFunc (FE & BE)

11.1) Ab TYPO3 Version 6.2

In neueren Versionen ist die Verwendung von User-Funktionen einfacher und man hat weniger Einschränkungen als noch in TYPO3 4.5.

Mit Namespaces:

[userFunc = MyNamespace\MyExt\Classes\Utility\UserFuncUtility::myUserFunction('var1', 'var2')]

Mit Klassen:

[userFunc = Tx_MyExt_Utility_MyUserFunc->myUserFunction('var1', 'var2')]

Die Funktionen sollten natürlich als „static“ deklariert sein.

11.2) Ab TYPO3 Version 4.5

[userFunc = user_myUserFunction(var1, var2)]

Die Funktion „myUserFunction“ muss in Datei localconf.php oder (besser!) in Datei ext_localconf.php einer eigenen Extension liegen.

Wichtig ist, dass der Funktionsname mit „user_“ beginnt! Wichtig ist auch, dass vorher abgefragt wird, ob diese Funktion nicht bereits in die gecachte typo3conf/temp_CACHED_*_ext_localconf.php übernommen wurde. Diese Funktion kann z.B. so aussehen:

ext_localconf.php

if(!function_exists('user_myUserFunction')) {
  function user_myUserFunction($var1, $var2) {
    if($var1 == $var2) {
      return true;
    }
    return false;
  }
}

12) Bedingungen mit UND bzw. ODER verknüpfen

12.1) UND Verknüpfung

[globalVar = TSFE:id > 10] AND [globalVar = TSFE:id < 20] AND ...

bzw.

[globalVar = TSFE:id > 10] && [globalVar = TSFE:id < 20] && ...

12.2) ODER Verknüpfung

[globalVar = TSFE:id = 3] OR [globalVar = TSFE:id = 8] OR ...

bzw.

[globalVar = TSFE:id = 3] || [globalVar = TSFE:id = 8] || ...

oder

[globalVar = TSFE:id = 3, TSFE:id = 8, ...]

oder

[globalVar = TSFE:id = 3|8|...]

13) TypoScript Bedingungen aus Extensions

Verschiedene Extensions stellen neue, nützliche TypoScript Bedingungen zur Verfügung:

  • contexts Sehr viele Bedingungen (z.B. Domain, GET Parameter, IP Range), kann auch mit eigenen Bedingungen erweitert werden | Siehe Artikel
  • contexts_wurfl Bedingungen für Erkennung mobiler Endgeräte.
  • cwmobileredirect Bedingungen für Erkennung mobiler Endgeräte.

Lösungen für Probleme

1) Ich möchte eine Variable auf 0 (Null) überprüfen, die Bedingung ist aber immer „false“

Die Bedingung hat Probleme, wenn man auf 0 (Null) überprüft. So ist z.B. diese Bedingung immer „falsch“, auch wenn die Variable (hier eine TypoScript Konstante) als Wert „0“ enthält:

[globalVar = LIT:{$MEINE_KONSTANTE} = 0]

Lösung:

[globalVar = LIT:{$MEINE_KONSTANTE} < 1]

2) Ich nutze eine selbstgeschriebene PHP-Funktion (userFunc) zur Überprüfung und binde diese mit „includeLibs“ ein (TYPO3 < 6.0)

Das Einbinden des PHP-Skriptes mit der userFunc über includeLibs in TypoScript funktioniert nicht! Man muss die Funktion in localconf.php oder ext_localconf.php schreiben (siehe oben)

Weitere Infos

Weitere Übersichten und Anleitungen zu TypoScript Bedingungen:

Nach diesen beiden Quellen dürfte diese hier die dritt-umfangreichste sein :)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.