一个丑陋的解决方案是使用一个变量来跟踪是否已经输出了一个标题:
{% set heading_outputted = false %}
{% for event in events %}
{% if date(event.band_date)|date('Y-m-d') > 'now'|date('Y-m-d') %}
{% if not heading_outputted %}
<h2>Next</h2>
{% set heading_outputted = true %}
{% endif %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endif %}
{% endfor %}
{% set heading_outputted = false %}
{% for event in events %}
{% if date(event.band_date)|date('Y-m-d') < 'now'|date('Y-m-d') %}
{% if not heading_outputted %}
<h2>Previous</h2>
{% set heading_outputted = true %}
{% endif %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endif %}
{% endfor %}
示例:https://twigfiddle.com/0kdp0u
更好的解决方案是在 PHP 中使用逻辑,例如在控制器中,或者在您的项目中最合适的位置。如果将变量next_events 和previous_events 传递给Twig,视图会更清晰:
{% if next_events is not empty %}
<h2>Next</h2>
{% for event in next_events %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endfor %}
{% endif %}
{% if previous_events is not empty %}
<h2>Previous</h2>
{% for event in previous_events %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endfor %}
{% endif %}
示例:https://twigfiddle.com/cvka3g
使用filter filter 和loop variable 的另一种解决方案:
{% for event in events|filter(event => date(event.band_date)|date('Y-m-d') > 'now'|date('Y-m-d')) %}
{% if loop.first %}
<h2>Next</h2>
{% endif %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endfor %}
{% for event in events|filter(event => date(event.band_date)|date('Y-m-d') < 'now'|date('Y-m-d')) %}
{% if loop.first %}
<h2>Previous</h2>
{% endif %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endfor %}
(这个解决方案的灵感来自@Seba 的回答。)
出于安全原因,Twigfiddle 已禁用 filter 过滤器,因此此解决方案没有可运行的示例。
请注意,以下语法在 Twig 3 中不起作用:
{% for event in events if date(event.band_date)|date('Y-m-d') > 'now'|date('Y-m-d') %}
{% if loop.first %}
<h2>Next</h2>
{% endif %}
<article>
{{ event.band }} - {{ event.band_date|date('Y-m-d') }}
</article>
{% endfor %}
它在 Twig 2 中有效(例如:https://twigfiddle.com/zau2sf),但您会收到以下弃用通知:
自 Twig 2.10.0 起,不推荐在第 1 行的“main.twig”中的“for”标签上使用“if”条件,而是在“for”正文中使用“filter”过滤器或“if”条件(如果您的条件取决于循环内更新的变量)。
我个人会选择第二种解决方案,因为 Twig 模板是最清晰的。如果那不可能,我会选择第三种解决方案。第一个解决方案太乱了,我不会选择它。