TypoScript技术问询:如何为每第4个元素添加分隔div?
在每第4个元素后添加分隔元素的最优方案
你的思路方向是对的,但用split结合自定义分隔符的方式可能会碰到一些边缘情况(比如元素总数不是4的倍数时的多余分隔),而且TypoScript里有更直接的方式——利用迭代计数器来实现这个需求,不需要额外插入分隔符再拆分,代码也更简洁易维护。
优化后的完整代码
直接在renderObj的stdWrap里配置迭代规则,就能精准控制每4个元素后添加分隔:
lib.unterseiten = CONTENT lib.unterseiten { table = pages select { pidInList.field = 10 orderBy = sorting } renderObj = COA renderObj { wrap = <div class='col-md-3'>|</div> # 核心:添加迭代计数器,控制每4个元素后插入分隔 stdWrap.iteration = 1 stdWrap.iteration { every = 4 # 这里替换成你需要的分隔元素,比如你的hr或者自定义div wrap = |<hr class="separatorline" /> # 可选:如果最后一个元素刚好是4的倍数,不想加分隔就打开下面这行 # last = 0 } # 以下是你原有的业务逻辑,完全保留不变 10 = TEXT 10.field = title 10.wrap = <h2>|</h2> 20 = CONTENT 20 { table = tt_content select { pidInList.field = uid orderBy = sorting } renderObj = COA renderObj { # Bild auslesen 30 = FILES 30 { maxItems = 1 references { table = tt_content uid.data = field:uid fieldName = image maxItems = 1 } renderObj = IMAGE renderObj.file.import.data = file:current:uid renderObj.file.treatIdAsReference = 1 renderObj.wrap = <div class="thumbnail bild">|</div> renderObj.stdWrap.maxItems = 1 } 40 = TEXT 40.value = Mehr Infos 40.typolink.ATagParams = class="btn btn-primary" 40.typolink.parameter.data = field:pid } } } } page.20.marks.kumulierterInhalt < lib.unterseiten
关键部分说明
stdWrap.iteration:这个TypoScript属性会自动为每个渲染的元素生成迭代元数据,包括当前元素的位置序号。every = 4:指定每第4、8、12……个元素触发一次分隔内容的插入。wrap配置:|代表当前元素的内容,后面跟着你要添加的分隔元素,比如<hr class="separatorline" />或者自定义的<div class="row-break"></div>。- 可选的
last = 0:如果你的元素总数刚好是4的倍数,默认会在最后一个元素后面也加分隔,要是不需要这个效果,把last = 0的注释去掉就行。
为什么你的原有方案不太理想
你原来的方式是给每个元素加###SEPARATOR###,再用split每3个元素后拼接分隔——这种方式存在几个问题:
- 当元素数量少于4个时,会错误地生成分隔符;
- 如果内容里意外出现
###SEPARATOR###字符串,会导致拆分逻辑混乱; - 代码的可读性和维护性不如直接用迭代计数器的方式,后续修改规则也更麻烦。
这样调整后就能精准实现你要的效果啦!
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

