【问题标题】:Shopify - Loop over data from schemaShopify - 从架构中循环数据
【发布时间】:2019-04-02 13:12:38
【问题描述】:

在创建 Shopify 主题时,我在创建循环时遇到了问题。

我允许主题管理员从 1 到 4 个产品中选择在商店中展示。他可以从他的主题的自定义 UI 中选择它们。

架构是:

{
  "type": "product",
  "id": "popular_product_1",
  "label": "Product N°1"
},
{
  "type": "product",
  "id": "popular_product_2",
  "label": "Product N°2"
},
{
  "type": "product",
  "id": "popular_product_3",
  "label": "Product N°3"
},
{
  "type": "product",
  "id": "popular_product_4",
  "label": "Product N°4"
}

回到我的液体文件,作为测试,如果我想要我可以做的产品的 URL:

{{ all_products[section.settings.popular_product_1].url }}

它会起作用的。但当然,我必须重复相同的代码 4 次。所以我想创建一个循环遍历每个循环。

但是如何获取上面要插入的增量数呢? 当然

{{ all_products[section.settings.popular_product_i].url }}
{{ all_products[section.settings.popular_product_{{i}}].url }}

不工作。

我也试过

{% assign i = 1 %}
{% capture popular_product %}section.settings.popular_product_{{i}}{% endcapture %}
{{ all_products[popular_product].url }}

但它也不起作用......因为变量 Popular_product 似乎是一个字符串,但它不是应该的。

【问题讨论】:

    标签: shopify liquid


    【解决方案1】:

    替代方法:使用部分块

    您是否考虑过在基本设置中使用带有块的部分,而不仅仅是编号的产品字段?如果您创建一个“流行产品”部分并定义流行产品块,您可以添加任意数量的产品(或可以指定最大值),然后使用

    遍历它们
    {% for block in section.blocks %} 
       {% assign popular_product = all_products[block.settings.product] %}
       <!-- Cool stuff with your popular product -->
    {% endfor %}
    

    您可以在此处阅读有关在 Shopify 中设置部分和区块的更多信息:https://help.shopify.com/en/themes/development/sections


    现在,您使用的方法没有错,但是您上面的代码有一些错误。可以更正这些以获得正确的产品句柄以用于all_products 查找。第一:

    {{ all_products[section.settings.popular_product_{{i}}].url }}
    

    不正确:我们从不将 Liquid 花括号嵌套在 Liquid 花括号内。相反,这应该看起来像:

    {% for i in (1..4) %}
      {% assign setting_name = 'popular_product_' | append: i %}
      {% assign handle = section.settings[setting_name] %}
      {% assign popular_product = all_products[handle] %}
      <!-- Cool stuff with our popular_product object -->
    {% endfor %}
    

    接下来,capture 变量将评估标签之间的所有内容并将其存储在字符串中。使用时:

    {% capture popular_product %}section.settings.popular_product_{{i}}{% endcapture %}
    

    捕获的内容将首先替换i 的值,然后捕获结果字符串,这不是产品句柄!您真正想要的是 section.settings 对象中的特定值。

    您应该使用capture 来获取您需要的popular_product_x 变量并在section.settings 中访问它。例如:

    {% capture field_name %}popular_product_{{i}}{% endcapture %}
    {% assign popular_product = all_products[section.settings[field_name]] %}
    <!-- Cool stuff with your popular product -->
    

    希望这会有所帮助!


    注意:我个人更喜欢assign 用于像上面这样的简单变量,而capture 仅用于获取多行(如 HTML 块),但在这种情况下任何一个都可以。不过,capture 的警告:请记住,所有空格也会被捕获,这对于产品句柄或设置名称等简单变量通常是无意的。

    希望这会有所帮助!

    【讨论】:

    • 哇。非常感谢你。我很欣赏你的回答的完整性。我终于使用了阻止功能,它就像一个魅力。
    • 完美!很高兴我能帮上忙!
    • 谢谢你。它也适用于我的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多