如何解决检查数组中是否有任何值
我尝试获得这样的html结构
<h2>Next</h2>
<article> First Entry </article>
<article> Second Entry </article>
....
<h2>PrevIoUs</h2>
<article> First Entry </article>
<article> Second Entry </article>
...
所以我用...查看日期
{% for event in events %}
{%- if date(event.band_date) | date('Y-m-d') > 'Now' | date('Y-m-d') -%}
Next Stuff
{% endif %}
{% endfor %}
{% for event in events %}
{%- if date(event.band_date) | date('Y-m-d') < 'Now' | date('Y-m-d') -%}
PrevIoUs Stuff
{% endif %}
{% endfor %}
现在,我试图弄清楚如何在其中获取h2,而无需进入循环并自我复制,以及如果日期范围内没有条目完全不显示。
解决方法
一个丑陋的解决方案是使用变量来跟踪是否已输出标题:
{% 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模板是最清晰的,因此我个人将采用第二种解决方案。如果不可能,我将采用第三个解决方案。第一个解决方案太凌乱,我不会选择它。
,将<h2>
放置在循环的外部,它将仅作为标题显示一次。
<h2>Next</h2>
{% for event in events %}
{%- if date(event.band_date) | date('Y-m-d') > 'now' | date('Y-m-d') -%}
stuff
{% endif %}
{% endfor %}
<h2>Previous</h2>
{% for event in events %}
{%- if date(event.band_date) | date('Y-m-d') < 'now' | date('Y-m-d') -%}
stuff
{% endif %}
{% endfor %}
,
好的,我明白了! loop.first做到了!
{% 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 %}
...
{% endif %}
{% endfor %}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。