TYPO3 9.x中用f:variable创建数组/对象的可行性及语法差异咨询
在TYPO3 9.x Fluid中用f:variable创建数组/对象的问题解析
这是个很典型的Fluid语法误区,我来给你拆解清楚:
核心结论:完全可以用f:variable创建数组/对象
只是要注意语法的差异,这正是你遇到两种写法效果不同的原因。
为什么标签体写法会被识别成字符串?
当你这么写的时候:
<f:variable name="person">{firstname:'Max', lastname:'Mustermann'}</f:variable>
Fluid对标签体的默认处理逻辑是纯文本字符串——哪怕你写了{},它也会把整个{firstname:'Max', lastname:'Mustermann'}当成一个带大括号的字符串内容,而不会解析成数组。
只有当标签体里是单个变量引用(比如{existingVariable}),或者嵌套了专门处理表达式的标签(比如f:alias)时,Fluid才会去解析里面的内容,直接写数组字面量是不会触发解析的。
为什么value属性写法能正常工作?
而用value属性的写法:
<f:variable name="person" value="{firstname:'Max', lastname:'Mustermann'}" />
Fluid对标签属性的处理逻辑不一样——属性里的{}会被优先解析为Fluid表达式,这里的{firstname:'Max', lastname:'Mustermann'}会被正确识别成关联数组(PHP层面会转成stdClass对象或数组,用法上没区别)。
简单说就是:属性里的大括号是“表达式开关”,标签体里的大括号只是普通文本。
用f:variable构建复杂数组的正确姿势
如果你想创建像f:render参数里那种包含多个对象的数组,直接把相同的表达式写到value属性里就行,完全兼容:
<f:variable name="imageGallery" value="{ 0: {imageurl:'https://www.placehold.it/640x480', imagealt:'First Image'}, 1: {imageurl:'https://www.placehold.it/640x480', imagealt:'Second Alt'} }" />
之后直接把这个变量传给partial就好:
<f:render partial="Components/ImageGallery" section="ImageGallery" arguments="{imageGallery: imageGallery}" />
要是你非要用标签体的方式(真心不推荐,太冗余),可以嵌套f:alias来触发解析,比如:
<f:variable name="person"> <f:alias map="{person: {firstname:'Max', lastname:'Mustermann'}}">{person}</f:alias> </f:variable>
但显然不如直接用value属性来得简洁直观。
内容的提问来源于stack exchange,提问作者kimomat
相关产品推荐
相关产品推荐

