TYPO3 9原生URL重写场景下,如何通过TypoScript判断扩展查询参数
在TYPO3 9原生URL重写中基于扩展参数设置TypoScript条件的解决方案
这个问题我之前也碰到过!TYPO3 9引入的原生Site Handling路由机制,会把友好URL里的参数解析到**路由属性(route attributes)**里,而不是原来的GET查询参数或者GP全局变量里,这就是为什么你之前的两种写法都失效了。
正确的条件写法
直接从请求的路由参数里获取tx_news_pi1的参数即可,示例代码如下:
# 当新闻ID参数存在且大于0时触发条件 [request.getAttributes()['route']['arguments']['tx_news_pi1']['news'] > 0] # 这里写你的条件逻辑,比如自定义页面标题、加载特定模板片段 page.title = 新闻详情页:{request.getAttributes()['route']['arguments']['tx_news_pi1']['news']} page.includeCSS.newsDetail = EXT:my_ext/Resources/Public/Css/NewsDetail.css [global]
为什么之前的写法失效?
- 旧的
[globalVar = GP:tx_news_pi1|news > 0]:TYPO3 9+的原生路由会把友好URL的参数从GET查询中移除,解析到路由属性里,所以GP全局变量拿不到这些参数了。 request.getQueryParams():同样的道理,友好URL的参数已经被路由组件处理,不在查询参数集合里了,所以直接取queryParams是空的。
调试小技巧
如果你不确定参数的具体结构,可以在TypoScript里加一段调试代码,把路由参数输出到页面上:
page.debugRouteArgs = TEXT page.debugRouteArgs.value = 路由参数:{request.getAttributes()['route']['arguments']} page.debugRouteArgs.insertData = 1 page.debugRouteArgs.wrap = <pre>|</pre>
访问页面后就能看到完整的参数结构,确认tx_news_pi1[news]对应的路径是否正确。
特殊情况说明
如果你的友好URL是类似/news/detail/8这种简化格式(没有tx_news_pi1前缀),那参数可能直接在路由参数的顶层,比如request.getAttributes()['route']['arguments']['news'],这时候需要根据你在Site Handling里配置的路由规则调整路径。
内容的提问来源于stack exchange,提问作者hendrikg




