Twig for loop - 如果存在任何子节点,则仅输出父节点

时间:2018-03-31 11:16:08

标签: loops twig grav

这些行打印所有类别和产品。但如果该类别没有产品,则仍会打印类别标题。

{% for category in categories %}
  <h1>{{ category.title }}</h1>
  {% for product in products if products.category|first == category.title|lower %}
    <h2>{{ product.title }}</h2>
  {% endfor %}
{% endfor %}

如何对此进行优化,以便仅在类别包含产品时打印类别标题?

2 个答案:

答案 0 :(得分:1)

有(imo)2解决方案。第一个是基于纯twig的,但是这两种方法中最差的。

为了跳过没有子节点的类别,这将需要第二个循环和标志变量来确定是否跳过该类别。由于twig无法摆脱循环,这意味着您需要foreach产品两次完全

{% for category in categories %}
  {% set flag = false %}
  {% for product in products if products.category|first == category.title|lower %}   
    {% set flag = true %}
  {% endfor %}
  {% if flag %}
      <h1>{{ category.title }}</h1>
      {% for product in products if products.category|first == category.title|lower %}
        <h2>{{ product.title }}</h2>
      {% endfor %}
  {% endif %}
{% endfor %}

第二个也是更好的解决方案就是为你的category模型添加一个额外的方法,并执行类似

的操作
{% for category in categories if category.hasProducts() %}
  <h1>{{ category.title }}</h1>
  {% for product in products if products.category|first == category.title|lower %}
    <h2>{{ product.title }}</h2>
  {% endfor %}
{% endfor %}

答案 1 :(得分:0)

一个简单的解决方案是在你的树枝循环中添加is defined条件。 例如:

{% for category in categories if categories is defined %}
  <h1>{{ category.title }}</h1>
  {% for product in products if products.category|first == category.title|lower %}
    <h2>{{ product.title }}</h2>
  {% endfor %}
{% endfor %}