删除 Liquid 中的最后一个尾随“,”
Removing last trailing ", " in Liquid
我已经为 Shopify 编写了这段代码,它创建了一个字符串,其中包含产品中所有明显的变体图像 src。然后它将此列表与整个 product.media
对象进行比较,并“过滤掉”与变体图像共享相同 URL 的图像,以便我得到一个仅包含 URL 的字符串s 用于与变体无关的图像。然后我可以将这个最终 string/array 与 for 循环一起使用,该循环仅输出未连接到变体的图像,例如与仅应包含产品“一般图像”的图库一起使用。
创建它的代码如下所示:
{% comment %}
Filter out images that is not variant images for gallery use
variant_image_srcs: String that contains all variant image srcs
gallery_images: String that created with a for loop and contains images that doesn't match it's src with any of the variant_image_srcs
gallery_images_array: String that's split and ready to be used with for loop using for example 'image | product_img_url: '1000x' filter
{% endcomment %}
{% capture variant_image_srcs %}
{% for variant in product.variants %}
{% if variant.featured_image.id != null %}
{{variant.featured_image.src }}{% if forloop.last != true %}, {% endif %}
{% endif %}
{% endfor %}
{% endcapture %}
{% capture gallery_images %}
{% for media in product.media %}
{% unless variant_image_srcs contains media.preview_image.src %}
{{media.preview_image.src }}{% if forloop.last != true %}, {% endif %}
{% endunless %}
{% endfor %}
{% endcapture %}
{% assign gallery_images_array = gallery_images | split: ", " %}
捕获的 gallery_images
使用了这条不太理想的行:{% if forloop.last != true %}, {% endif %}
将 ,
放在每个项目的末尾,以区分它们。问题是应添加到字符串中的最后一个 media.preview_image.src
并不总是 for 循环中的最后一项,导致捕获的字符串具有此尾随 ,
输出的图像不能被发现,因为没有 image.src
和字符串 ,
.
我想如果 variant.featured_image.id != null
会 return false
.
,那么第一个 for 循环也会出现同样的问题
有没有一种方法可以从 Liquid 中的字符串右侧删除一组确切的字符(在本例中为 ', '),或者我该怎么做才能不将 ', ' 添加到最后一个真实的项目?
希望您理解这个问题,我很乐意就如何使它更防水、更有效获得一些意见。
liquid 中有一个有趣的功能或错误,您可以在您的案例中使用。
当您根据特定的钩子拆分字符串时,如果该字符串之后没有任何内容,则该元素将从数组中排除。
例如:1,2,3,4,
如果我们用 ,
拆分它,我们期望顶部得到 [1,2,3,4,'']
,但实际上我们得到 [1,2,3,4]
,最后一项被自动删除,因为它是空的。
这仅在这是最后一个项目时有效,如果它是第一个或其他地方则无效。
在你的情况下,这可能不起作用,因为液体标签周围有太多空白。因此,不要只使用 {% %}
,而是使用 {%- -%}
,这将自动去除空格和新行。
所以你的标签应该变成这样:
{%- capture -%} / {%- if -%} / {%- for -%} / {%- endcapture -%} / {%- endif -%} / {%- ednfor -%}
除了上述答案之外,另一种可能的方法是使用 remove_first 字符串过滤器。但是为此,您必须先添加逗号,然后添加图像 src。你可以删除 if 条件。
{%- capture gallery_images -%}
{%- for media in product.media -%}
{%- unless variant_image_srcs contains media.preview_image.src -%}
{{media.preview_image.src | prepend: "," }}
{%- endunless %}
{%- endfor %}
{%- endcapture -%}
{%- assign gallery_images_array = gallery_images| remove_first: "," | split: "," -%}
我已经为 Shopify 编写了这段代码,它创建了一个字符串,其中包含产品中所有明显的变体图像 src。然后它将此列表与整个 product.media
对象进行比较,并“过滤掉”与变体图像共享相同 URL 的图像,以便我得到一个仅包含 URL 的字符串s 用于与变体无关的图像。然后我可以将这个最终 string/array 与 for 循环一起使用,该循环仅输出未连接到变体的图像,例如与仅应包含产品“一般图像”的图库一起使用。
创建它的代码如下所示:
{% comment %}
Filter out images that is not variant images for gallery use
variant_image_srcs: String that contains all variant image srcs
gallery_images: String that created with a for loop and contains images that doesn't match it's src with any of the variant_image_srcs
gallery_images_array: String that's split and ready to be used with for loop using for example 'image | product_img_url: '1000x' filter
{% endcomment %}
{% capture variant_image_srcs %}
{% for variant in product.variants %}
{% if variant.featured_image.id != null %}
{{variant.featured_image.src }}{% if forloop.last != true %}, {% endif %}
{% endif %}
{% endfor %}
{% endcapture %}
{% capture gallery_images %}
{% for media in product.media %}
{% unless variant_image_srcs contains media.preview_image.src %}
{{media.preview_image.src }}{% if forloop.last != true %}, {% endif %}
{% endunless %}
{% endfor %}
{% endcapture %}
{% assign gallery_images_array = gallery_images | split: ", " %}
捕获的 gallery_images
使用了这条不太理想的行:{% if forloop.last != true %}, {% endif %}
将 ,
放在每个项目的末尾,以区分它们。问题是应添加到字符串中的最后一个 media.preview_image.src
并不总是 for 循环中的最后一项,导致捕获的字符串具有此尾随 ,
输出的图像不能被发现,因为没有 image.src
和字符串 ,
.
我想如果 variant.featured_image.id != null
会 return false
.
有没有一种方法可以从 Liquid 中的字符串右侧删除一组确切的字符(在本例中为 ', '),或者我该怎么做才能不将 ', ' 添加到最后一个真实的项目?
希望您理解这个问题,我很乐意就如何使它更防水、更有效获得一些意见。
liquid 中有一个有趣的功能或错误,您可以在您的案例中使用。
当您根据特定的钩子拆分字符串时,如果该字符串之后没有任何内容,则该元素将从数组中排除。
例如:1,2,3,4,
如果我们用 ,
拆分它,我们期望顶部得到 [1,2,3,4,'']
,但实际上我们得到 [1,2,3,4]
,最后一项被自动删除,因为它是空的。
这仅在这是最后一个项目时有效,如果它是第一个或其他地方则无效。
在你的情况下,这可能不起作用,因为液体标签周围有太多空白。因此,不要只使用 {% %}
,而是使用 {%- -%}
,这将自动去除空格和新行。
所以你的标签应该变成这样:
{%- capture -%} / {%- if -%} / {%- for -%} / {%- endcapture -%} / {%- endif -%} / {%- ednfor -%}
除了上述答案之外,另一种可能的方法是使用 remove_first 字符串过滤器。但是为此,您必须先添加逗号,然后添加图像 src。你可以删除 if 条件。
{%- capture gallery_images -%}
{%- for media in product.media -%}
{%- unless variant_image_srcs contains media.preview_image.src -%}
{{media.preview_image.src | prepend: "," }}
{%- endunless %}
{%- endfor %}
{%- endcapture -%}
{%- assign gallery_images_array = gallery_images| remove_first: "," | split: "," -%}