如何在Twig中仅当数组内日期变化时切换循环样式?
解决Twig中相邻条目同日期共用Class的问题
先修正你代码里的两个小问题:
% set endDate = entry.end|date_time %}少了开头的{%,应该写成{% set endDate = entry.end|date_time %}- 模板里的
endDatum是笔误,应该改成你定义的endDate
接下来实现同日期条目共用相同class的逻辑:核心是在循环外记录上一个条目的日期,每次循环时和当前条目日期对比,相同就沿用当前class,不同则切换class。
完整代码示例:
{% set prevStartDate = null %} {% set classIndex = 0 %} {% set rowClasses = ['odd', 'even'] %} {% for entry in entries %} {% set startDate = entry.begin|date_time %} {% set endDate = entry.end|date_time %} {# 对比当前日期和上一个,不同则切换class索引 #} {% if prevStartDate is not null and startDate != prevStartDate %} {% set classIndex = 1 - classIndex %} {% endif %} <tr class="{{ rowClasses[classIndex] }}"> <td class="text-nowrap"> {% block date_begin %}{{ entry.begin|date_time }}{% endblock %} {% if entry.end %} {% block date_end %}{{ endDate }}{% endblock %} {% endif %} </td> {# 补充其他列内容 #} </tr> {# 更新上一个日期为当前日期,供下一次循环对比 #} {% set prevStartDate = startDate %} {% endfor %}
逻辑说明:
- 循环前初始化
prevStartDate存储上一个条目的日期,classIndex控制当前使用的class下标,rowClasses是你定义的class列表 - 每次循环先计算当前条目的
startDate,如果上一个日期存在且和当前日期不同,就切换classIndex(0和1互转) - 渲染
<tr>时通过rowClasses[classIndex]获取对应的class - 循环末尾更新
prevStartDate为当前日期,确保下一次循环能正确对比
这样就能实现:相邻条目日期相同时使用同一个class,日期不同时自动切换class。
内容的提问来源于stack exchange,提问作者Empx
相关产品推荐
相关产品推荐

