Twig for 循环 - 如果 children 存在,则只输出 parent

Twig for loop - output only parent if any children exists

这些行打印所有类别和其中的产品。但是,如果类别没有产品,类别标题仍会打印。

{% 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 %}

如何优化它以便仅当类别包含产品时才打印类别标题?

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

为了在没有 children 的情况下跳过类别,这将需要第二个循环和标志变量来确定是否跳过类别。由于 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 %}

一个简单的解决方案是在你的树枝循环中添加一个 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 %}