Shopify Liquid中forloop.last针对特定区块类型失效问题求助
解决Shopify Section中同类型Block的HR分隔问题
你遇到的核心问题是forloop.last的判断对象错误:当前代码遍历的是所有Section Blocks,再通过if筛选特定类型,此时forloop.last指的是整个循环的最后一个Block,而非当前类型的最后一个Block。比如当全局最后一个Block不是accordion_description类型时,即使已经遍历完所有description类型的Block,forloop.last仍为false,导致最后一个description Block后面还是会输出<hr>。
解决方案
用Shopify的where过滤器先把对应类型的Block单独筛选出来,存入变量后再遍历这个过滤后的数组。此时forloop.last会针对当前类型的Block列表生效,精准判断是否为该类型的最后一个元素。
修改后的完整代码
{% if section.settings.productaccordion_active %} <ul class="product-accordion product-accordion-small"> {% if section.settings.accordion_description_active %} <li id="product-accordion-1"> <div class="product-accordion-title">Description</div> <div class="product-accordion-content"> {%- assign desc_blocks = section.blocks | where: "type", "accordion_description" -%} {%- for block in desc_blocks -%} {% if block.settings.accordion_description_title %} <h5>{{ block.settings.accordion_description_title }}</h5> {{ block.settings.accordion_description_content }} {% endif %} {% unless forloop.last %} <hr> {% endunless %} {%- endfor -%} </div> </li> {% endif %} {% if section.settings.accordion_ingredients_active %} <li id="product-accordion-2"> <div class="product-accordion-title">Ingredients</div> <div class="product-accordion-content"> {%- assign ing_blocks = section.blocks | where: "type", "accordion_ingredients" -%} {%- for block in ing_blocks -%} {% if block.settings.accordion_ingredients_title %} <h5>{{ block.settings.accordion_ingredients_title }}</h5> {{ block.settings.accordion_ingredients_content }} <br><span class="product-popup-link" data-popupid="popup_ingredient_A_breakdown">See breakdown</span> <br><span class="product-popup-link" data-popupid="popup_ingredient_A_full">See full list</span> {% endif %} {% unless forloop.last %} <hr> {% endunless %} {%- endfor -%} </div> </li> {% endif %} </ul> {% endif %}
关键修改说明
- 用
{% assign desc_blocks = section.blocks | where: "type", "accordion_description" %}筛选出所有accordion_description类型的Block,存入desc_blocks变量 - 遍历
desc_blocks而非整个section.blocks,此时forloop.last仅针对当前类型的Block列表判断 - 配料部分做同样处理,筛选出
accordion_ingredients类型的Block存入ing_blocks后遍历
这样就能保证同类型的最后一个Block后面不会输出<hr>,不受全局Block顺序的影响。
内容的提问来源于stack exchange,提问作者Blair McDonald
相关产品推荐
相关产品推荐

