Shopify - 循环架构中的数据

Nic*_*ine 4 liquid shopify

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

\n\n

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

\n\n

架构是:

\n\n
{\n  "type": "product",\n  "id": "popular_product_1",\n  "label": "Product N\xc2\xb01"\n},\n{\n  "type": "product",\n  "id": "popular_product_2",\n  "label": "Product N\xc2\xb02"\n},\n{\n  "type": "product",\n  "id": "popular_product_3",\n  "label": "Product N\xc2\xb03"\n},\n{\n  "type": "product",\n  "id": "popular_product_4",\n  "label": "Product N\xc2\xb04"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
{{ all_products[section.settings.popular_product_1].url }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
{{ all_products[section.settings.popular_product_i].url }}\n{{ all_products[section.settings.popular_product_{{i}}].url }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

不工作。

\n\n

我也尝试过

\n\n
{% assign i = 1 %}\n{% capture popular_product %}section.settings.popular_product_{{i}}{% endcapture %}\n{{ all_products[popular_product].url }}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Dav*_*e B 6

替代方法:使用剖面块

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

{% for block in section.blocks %} 
   {% assign popular_product = all_products[block.settings.product] %}
   <!-- Cool stuff with your popular product -->
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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


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

{{ all_products[section.settings.popular_product_{{i}}].url }}
Run Code Online (Sandbox Code Playgroud)

是不正确的:我们从不将 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 %}
Run Code Online (Sandbox Code Playgroud)

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

{% capture popular_product %}section.settings.popular_product_{{i}}{% endcapture %}
Run Code Online (Sandbox Code Playgroud)

捕获的内容将首先替换 的值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 -->
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


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

希望这可以帮助!