我试图遍历一组产品所属的所有集合。这是我的代码:
<div class="container model-collection">
<h1>{{ collection.title }}</h1>
{% paginate collection.products by 12 %}
<div class="grid collection-products-container">
<ul>
{% for product in collection.products %}
{% for collection in product.collections %}
<li><a href="{{ collection.url }}">{{ collection.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</div>
{% if paginate.pages > 1 %}
{% include 'pagination' %}
{% endif %}
{% endpaginate %}
</div>
这很好用,但是,如果两个产品属于同一集合,它将两次列出该集合。因此,我需要限制仅显示每个集合一次的循环。 我试图这样做:
<div class="container model-collection">
<h1>{{ collection.title }}</h1>
{% assign model = collection.title %}
<div class="grid collection-products-container">
<ul>
{% for product in collection.products %}
{% assign seen_collections = "" %}
{% for collection in product.collections %}
{% unless seen_collections contains collection %}
{% assign seen_collections = seen_collections | append: "," | append: collection %}
<li><a href="{{ collection.url }}/{{ model }}">{{ collection.title }}</a></li>
{% endunless %}
{% endfor %}
{% endfor %}
</ul>
</div>
</div>
但是这只会返回其中一个集合两次,而不会返回其他任何一个。任何想法如何做到这一点?
答案 0 :(得分:0)
通过使用Liquid代码中的map
过滤器,您可以获取嵌套属性的汇总列表,而map
过滤器可让您高效地钻取嵌套对象。
因此,要获取集合中所有产品使用的所有唯一集合句柄的数组,我们可以按以下方式快速获取所需信息:
{% assign collection_handles = collection.products | map: 'collections' | map: 'handle' | uniq %}
这将创建一个集合中所有产品的所有集合句柄的数组,然后将它们简化为唯一的(使用uniq
过滤器)。注意:uniq
需要使用数字,字符串或其他简单字段-这就是为什么我们需要一个数组集合句柄,而不是数组集合对象。
所以现在您可以按以下方式进行循环了:
{% for handle in collection_handles %}
{% assign collection = collections[handle] %}
<!-- All your awesome stuff here -->
{% endfor %}
希望这会有所帮助!