为何TYPO3中TypoScript OR条件触发两次加载,单条件仅一次?
问题原因与解决方案
嗨,这个问题我之前在TYPO3项目里也碰到过,咱们一步步拆解清楚:
原因分析
你当前的条件写法不符合TYPO3 TypoScript的复合条件语法规范:
[RM\RmBase\TypoScript\BackendlayoutCondition = pagets__pagelayout_logoclaim_portal] || [RM\RmBase\TypoScript\BackendlayoutCondition = pagets__pagelayout_logoclaim_subpage]
TYPO3会把这种写法解析成两个独立的条件判断块,相当于你写了两段重复的条件配置:
[RM\RmBase\TypoScript\BackendlayoutCondition = pagets__pagelayout_logoclaim_portal] page.includeJSFooter.belayoutJavascript = EXT:rm_base/Resources/Public/JS/be_logoclaim.js [global] [RM\RmBase\TypoScript\BackendlayoutCondition = pagets__pagelayout_logoclaim_subpage] page.includeJSFooter.belayoutJavascript = EXT:rm_base/Resources/Public/JS/be_logoclaim.js [global]
虽然一个页面只会匹配一个后端布局,但TYPO3在处理这两个独立条件时,会分别触发两次条件评估。如果自定义条件实现存在逻辑漏洞,或者TYPO3在解析这种不规范写法时出现重复执行的情况,就会导致同一个JS文件被重复添加到页面中,最终触发两次加载。
解决方案
你需要把两个条件合并成一个复合条件表达式,放在同一个方括号内,有两种可行的写法:
写法1:利用自定义条件的多值匹配(推荐)
如果你的BackendlayoutCondition支持在条件值中用||分隔多个布局标识,直接写成:
[RM\RmBase\TypoScript\BackendlayoutCondition = pagets__pagelayout_logoclaim_portal || pagets__pagelayout_logoclaim_subpage] page.includeJSFooter.belayoutJavascript = EXT:rm_base/Resources/Public/JS/be_logoclaim.js [global]
写法2:使用TYPO3原生逻辑或运算符
如果自定义条件不支持多值匹配,改用TYPO3的原生逻辑或运算符连接两个完整的条件调用:
[RM\RmBase\TypoScript\BackendlayoutCondition('pagets__pagelayout_logoclaim_portal') || RM\RmBase\TypoScript\BackendlayoutCondition('pagets__pagelayout_logoclaim_subpage')] page.includeJSFooter.belayoutJavascript = EXT:rm_base/Resources/Public/JS/be_logoclaim.js [global]
这样修改后,TYPO3只会执行一次条件判断,满足任一布局时仅加载一次JS文件。
内容的提问来源于stack exchange,提问作者MonTea
相关产品推荐
相关产品推荐

