是否可以使用具有嵌套属性的液体“ where”阵列过滤器?

时间:2019-09-01 19:30:46

标签: shopify liquid shopify-template

我正在尝试使用块设置来过滤块数组。我可以使用以下语法按“类型”之类的属性进行过滤:

{% assign example = section.blocks | where: "type", "photos" %}

我需要做的是按块设置过滤,如下所示:

{% assign example = section.blocks | where: settings.collection, collection.handle %}

上面的示例无声地失败。

注意事项:目前,我正在使用带有for循环和if语句的捕获来完成我所需要的,然后使用split进行赋值-但代码是如此肿,并且要做所有这些对于简单的过滤器操作来说似乎很可笑。我发现自己一直感觉自己在与液体作斗争,我想我希望它可能比我认为的要优雅。

4 个答案:

答案 0 :(得分:2)

我对Ruby不太了解,但是您似乎can't将带有点标记的嵌套属性传递给where过滤器。但是,在seeing people使用map访问嵌套值之后,我测试了两者的混合,并且map filter在这种情况下似乎很好用。

我在块中有一个名为default的布尔设置,并且使用以下命令将最后一个块的设置对象设为default设置为true

{% assign obj = section.blocks | map: 'settings' | where: 'default' | last %}

当然,那么您不能在提取的设置对象之外获取数据。为此,我认为您确实需要遍历section.blocks并使用if标签手动查找过滤器。

答案 1 :(得分:0)

在我看来,这里的问题是,当您指示“ settings.collection”时,它并不引用“ photos”之类的值。

collection.handle应该是代码中类似于“ my-collection-handle”的字符串。同上,settings.collection应该用逗号书写。

也许您可以尝试类似的方法(未经测试):

{% assign example = section.blocks | where: 'settings.collection', 'handle-value' %}

答案 2 :(得分:0)

以前使用的 map 会丢失外部数据但发现字符串表示法适用于嵌套属性的 where

例如,使用 posts 集合,其中每个 .md 文件都具有前端内容:

header:
    isArchived: true

以下 liquid 片段通过 header.isArchived 过滤已归档的帖子:

{% assign archived = site.posts | where: "header.isArchived", true %}

答案 3 :(得分:-1)

您做错了。 where仅在根元素上起作用。在您的情况下,section.blocks是根元素,因此where可用于类似section.blocks.abcd_property的事物。

粗略示例: {% assign example = section.blocks | where: 'collection', collection.handle %}将加载所有具有 collection 属性的节块作为 collection.handle值

这将起作用

{% if settings.collection == collection.handle  %}
{% assign example = section.blocks %}
{% else %}
{% assign example = '' | split: '' %}
{% endif %}