无法使用通配符或子上下文的 TypoScript applicationContext 条件

Jos*_*atz 1 typo3 typoscript typo3-9.x

由于 TYPO3 9.5 LTS 建议对 TypoScript 条件使用 Symfony 表达式语言。

我在迁移它们时遇到了一些麻烦:

旧语法:

// Matches any applicationContext with a rootContext of "Production", for example "Production/Live" or "Production/Staging":
[applicationContext = Development*]

// Matches any applicationContext starting with "Production/Dev"
[applicationContext = /^Production\/Dev/]
Run Code Online (Sandbox Code Playgroud)

到新的表达语言:

我尝试了以下但没有成功:

[applicationContext == "/^Development\/Docker/"]

[applicationContext == "Development*"]

[applicationContext == "Development/*"]
Run Code Online (Sandbox Code Playgroud)

我没有找到任何例子。我不确定条件测试是否已经基于表达式语言。( https://review.typo3.org/#/c/57787/ )

如果有人建议如何使用该功能像以前一样添加条件,那就太好了

Jos*_*atz 7

以下条件匹配任何以“ Production/Dev”开头的 applicationContext

[applicationContext matches '/^Production\\\\\\\\/Dev/']
Run Code Online (Sandbox Code Playgroud)

为什么有这么多反斜杠?在 Symfony 表达式语言中,反斜杠 ( \) 必须由\\\\字符串中的 4 个反斜杠 ( ) 和正则表达式中的 8 个反斜杠 ( ) 转义\\\\\\\\

(自 TYPO3 9 LTS 起, Symfony 表达式语言充当 TypoScript 条件的基础)


编辑 2020-02:使用不同的正则表达式分隔符可以使 TYPO3 中的 applicationContext 条件的可读性更好:

/我们可以使用正则#表达式分隔符来代替。

这里有些例子:

匹配“ Development”applicationContext

[applicationContext matches "#^Development#"]
Run Code Online (Sandbox Code Playgroud)

Production/Dev匹配以“ ”开头的applicationContext

[applicationContext matches "#^Production/Dev#"]
Run Code Online (Sandbox Code Playgroud)

Production/Dev匹配以“或Production/Staging”开头的applicationContext

[applicationContext matches "#^Production/(Dev|Staging)#"]
Run Code Online (Sandbox Code Playgroud)

匹配以“开头的applicationContextProduction/Live

[applicationContext matches "#^Production/Live#"]
Run Code Online (Sandbox Code Playgroud)

匹配以 " 开头的 applicationContextProduction/Live和活动的 TYPO3 后端用户会话

[applicationContext matches "#^Production/Live#" && getTSFE().isBackendUserLoggedIn()]
Run Code Online (Sandbox Code Playgroud)

匹配除以“ Production”开头的任何 applicationContext

[not (applicationContext matches "#Production#")]
Run Code Online (Sandbox Code Playgroud)

将 applicationContext 与值“ Production/Live/ClusterServer1”完全匹配

[applicationContext == "Production/Live/ClusterServer1"]
Run Code Online (Sandbox Code Playgroud)


Mat*_*ala 5

您需要使用Symfony 表达式语言的matches比较运算符。通过这种方式,您可以使用正则表达式进行部分匹配:

[applicationContext matches "/^Development/"]
Run Code Online (Sandbox Code Playgroud)

这将匹配任何Development上下文。