TYPO3 CMS 9+ Symfony Expression Language Conditions und verschachtelte Schlüssel

Problemstellung: man braucht in einer TypoScript Condition (Frontend oder Backend) den Wert einer Request Variablen aus einem Array, also z.B.

…&defVals[tt_content][tx_gridelements_backend_layout]=50-50

Früher (vor TYPO3 CMS 9) konnte man das über folgende Condition Syntax lösen:

[globalVar = GP:defVals|tt_content|tx_gridelements_backend_layout = 50-50]
… do something
[global]

um über PageTS (Edit page > Resources > Page TSConfig) in den Seiteneigenschaften die Anzeige im Backend je nach gewähltem gridelements Layout zu verändern.

Nach Einführung von Symfony Expression Language für Conditions sieht das ganze nicht mehr ganz so elegant aus, ist aber trotzdem lösbar:

[((request.getQueryParams()['defVals'])['tt_content'])['tx_gridelements_backend_layout'] == '50-50']
# … do something
[global]

All das funktioniert natürlich auch in einem Frontend TypoScript Template, z.B. um zu ermitteln, ob eine News Detailseite aufgerufen wurde:

[(request.getQueryParams()['tx_news_pi1'])['news'] > 0]
# … do something
[global]

Der Schlüssel zur Lösung dieses Problems sind die Klammern um die einzelnen Ausdrücke.
Bei der Auswertung (für die Interessierten ist das im Sourcecode in `\Symfony\Component\ExpressionLanguage\Node\GetAttrNode::evaluate` zu finden) wird in einer Schleife jeder dieser Ausdrücke einzeln als Array ausgewertet.

 

Folgendes funktioniert somit definitiv nicht:

[request.getQueryParams()['tx_news_pi1']['news'] > 0]

2 Kommentare zu “TYPO3 CMS 9+ Symfony Expression Language Conditions und verschachtelte Schlüssel”

  1. Hallo,
    vielen Dank für den Vorschlag. Leider klappt es bei meinem Beispiel nicht. Ich möchte nicht auf ein Extension-Feld zugreifen, sondern einfach bei der Marginalspalte nur ein Überschriftenlayout zulassen. Das sollte TYPO3 9 dann so laufen, oder?

    [((request.getQueryParams()[‚defVals‘])[‚tt_content‘])[‚colPos‘] == ‚2‘]
    TCEFORM.tt_content.header_layout.removeItems = 0,2,3,4,5,6,7,8,9,10
    [global]

    Habe ich einen Fehler?
    Danke und Grüße
    Martin

  2. Ja, genau, das oben genannte Beispiel funktioniert (eingetragen in Edit Page > Resources > Page TSConfig).
    Hier habe ich noch ein anderes nach dem gleichen Schema, gerade erst wieder getestet:

    [((request.getQueryParams()[‚defVals‘])[‚tt_content‘])[‚CType‘] == ‚text‘]
    TCEFORM.tt_content.layout.removeItems = 1,2
    [global]

Comments are closed.