这些行打印所有类别和产品。但如果该类别没有产品,则仍会打印类别标题。
{% 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 %}
如何对此进行优化,以便仅在类别包含产品时打印类别标题?
答案 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 %}