检查数组中是否有任何值

问题描述

我尝试获得这样的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_eventsprevious_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 filterloop 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 %}