Twig模板IF语句失效,如何实现每3个条目生成新row?
解决你的Twig IF语句失效问题
嘿,我看了你的代码,问题出在两个关键地方:变量递增的语法写错了,还有逻辑顺序搞反了,这才导致你的IF判断完全没按预期工作。
首先,修复变量递增的错误
Twig里没有=+这种赋值写法,你写的{% set x =+ 1 %}其实是把x重新设成了1(相当于每次循环都把x重置为1),这就导致x % 3 == 0这个条件永远不成立——或者如果你的实际需求是反过来的,那反而会每次都触发?不管怎样,正确的递增写法应该是:
{% set x = x + 1 %}
然后,调整逻辑顺序匹配你的需求
你想要每处理第三个条目时生成新的row div,但原代码的逻辑是先判断再递增x,然后输出条目,这不仅顺序错了,结构也不对。通常我们会把3个条目包裹在一个row里,这时候用Twig循环自带的loop变量会更省心,不需要自己维护x,避免出错。
推荐的修复代码
用loop.index0(从0开始计数)和loop.index(从1开始计数)来控制row的开闭:
{% extends "_layout" %} {% block content %} <div class="box"> {% for entry in craft.entries.section('news') %} {# 每3个条目开头创建新row(第1、4、7...个条目时触发) #} {% if loop.index0 % 3 == 0 %} <div class="row"> {% endif %} <div class="beitrag col l4 m12 s12"> <h3 class="beitrag_titel">{{ entry.title }}</h3> <p>{{ entry.textnews }}</p> </div> {# 每3个条目结尾关闭row,或者循环结束时关闭未闭合的row(处理条目数不是3的倍数的情况) #} {% if loop.index % 3 == 0 or loop.last %} </div> {% endif %} {% endfor %} </div> {% endblock %}
如果你坚持用自己的x变量
那修正后的代码应该是这样,注意递增的位置和判断条件:
{% extends "_layout" %} {% block content %} <div class="box"> {% set x = 1 %} {% for entry in craft.entries.section('news') %} {% if x % 3 == 1 %} {# 在第1、4...个条目时打开row #} <div class="row"> {% endif %} <div class="beitrag col l4 m12 s12"> <h3 class="beitrag_titel">{{ entry.title }}</h3> <p>{{ entry.textnews }}</p> </div> {% if x % 3 == 0 or loop.last %} {# 在第3、6...个条目或最后一个条目时关闭row #} </div> {% endif %} {% set x = x + 1 %} {# 正确的递增写法,放在条目输出之后 #} {% endfor %} </div> {% endblock %}
原代码失效的核心原因
=+是错误的赋值语法,导致x永远是1,你的IF条件要么永远不触发,要么(如果条件写反)每次都触发- 逻辑顺序错误:你在判断后才递增x,并且把row放在条目输出之前,这完全不符合“每3个条目一组”的结构,导致要么生成的row位置不对,要么完全不生成
内容的提问来源于stack exchange,提问作者regrettableclone0816
相关产品推荐
相关产品推荐

