Shopify-从架构中循环数据

时间:2019-04-02 13:12:38

标签: shopify liquid

围绕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是一个字符串,而实际上却不是它。

WDYT?

1 个答案:

答案 0 :(得分:1)

替代方法:使用节块

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

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

您可以在https://help.shopify.com/en/themes/development/sections

上了解有关在Shopify中设置板块的更多信息。

现在,您使用的方法没有错,但是上面的代码中有一些错误。可以更正这些错误,以获取用于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的警告:请记住,所有空格也被捕获,这通常与产品句柄或设置名称之类的简单变量无关。

希望这会有所帮助!