Shopify 部分中的变量范围
Variable scope in Shopify Sections
我试图在我的节文件中使用一个变量,但它似乎没有从它的父模板继承。
例如:
index.liquid
{% assign foo = "bar" %}
{% section 'example' %}
sections/example.liquid
<h1>{{ foo }}</h1>
{% schema %}
{
"name": "Example",
"settings": [
...
]
}
{% endschema %}
它不会输出 {{ foo }}
的值,而我只是得到:<h1></h1>
就好像变量从未定义过一样。
我认为部分会像代码片段一样工作,父模板中定义的任何内容都在包含的代码片段的范围内:
index.liquid
{% assign foo = "bar" %}
{% include 'example' %}
snippets/example.liquid
<h1>{{ foo }}</h1>
渲染时我会在哪里 <h1>bar</h1>
。
- 这是错误还是预期的行为?
- 有没有一种方法可以包含一个部分并使用来自某种形式的外部作用域的变量?
谢谢!
如果这是有意为之的行为,我设法找到了绕过它的方法,并认为我会 post 我的 不完美但可行的 解决方案:
sections/example.liquid
<h1><!-- foo --></h1>
您可以使用捕获来获取字符串形式的部分内容,并对捕获的标记使用字符串过滤器:
index.liquid
{% assign foo = "bar" %}
{% capture section %}{% section 'example' %}{% endcapture %}
{{ section | replace: '<!-- foo -->', foo }}
您当然可以用您的变量替换任何字符串。但我发现 HTML 评论效果很好,因为如果你忘记 运行 替换,或者不需要 - 什么都不会呈现。
如果您想做一些更复杂的事情,例如从该部分删除一些标记,您可以:
sections/example.liquid
<div>
<!-- REMOVE_TITLE? -->
<h1>{{ section.settings.title }}</h1>
<!-- REMOVE_TITLE? -->
<ul>
{% for block in section.blocks %}
<li>{{ block.settings.image | img_url: '300x' | img_tag }}</li>
{% endfor %}
</ul>
</div>
然后你可以这样做:
{% capture section %}{% section 'example' %}{% endcapture %}
{% assign parts = section | split: '<!-- REMOVE_TITLE? -->' %}
{% for part in parts %}
{% assign mod = forloop.index | modulo: 2 %}
{% if mod > 0 %}{{ part }}{% endif %}
{% endfor %}
我会在一个片段中分配你所有的变量,并在你需要使用变量的任何范围内继续包含这个相同的片段....
这是一个相当枯燥的方法。
config/settings_schema.json 中定义的任何内容都具有全局范围,但最终用户可以在主题设置中为其赋予新值。
我试图在我的节文件中使用一个变量,但它似乎没有从它的父模板继承。
例如:
index.liquid
{% assign foo = "bar" %}
{% section 'example' %}
sections/example.liquid
<h1>{{ foo }}</h1>
{% schema %}
{
"name": "Example",
"settings": [
...
]
}
{% endschema %}
它不会输出 {{ foo }}
的值,而我只是得到:<h1></h1>
就好像变量从未定义过一样。
我认为部分会像代码片段一样工作,父模板中定义的任何内容都在包含的代码片段的范围内:
index.liquid
{% assign foo = "bar" %}
{% include 'example' %}
snippets/example.liquid
<h1>{{ foo }}</h1>
渲染时我会在哪里 <h1>bar</h1>
。
- 这是错误还是预期的行为?
- 有没有一种方法可以包含一个部分并使用来自某种形式的外部作用域的变量?
谢谢!
如果这是有意为之的行为,我设法找到了绕过它的方法,并认为我会 post 我的 不完美但可行的 解决方案:
sections/example.liquid
<h1><!-- foo --></h1>
您可以使用捕获来获取字符串形式的部分内容,并对捕获的标记使用字符串过滤器:
index.liquid
{% assign foo = "bar" %}
{% capture section %}{% section 'example' %}{% endcapture %}
{{ section | replace: '<!-- foo -->', foo }}
您当然可以用您的变量替换任何字符串。但我发现 HTML 评论效果很好,因为如果你忘记 运行 替换,或者不需要 - 什么都不会呈现。
如果您想做一些更复杂的事情,例如从该部分删除一些标记,您可以:
sections/example.liquid
<div>
<!-- REMOVE_TITLE? -->
<h1>{{ section.settings.title }}</h1>
<!-- REMOVE_TITLE? -->
<ul>
{% for block in section.blocks %}
<li>{{ block.settings.image | img_url: '300x' | img_tag }}</li>
{% endfor %}
</ul>
</div>
然后你可以这样做:
{% capture section %}{% section 'example' %}{% endcapture %}
{% assign parts = section | split: '<!-- REMOVE_TITLE? -->' %}
{% for part in parts %}
{% assign mod = forloop.index | modulo: 2 %}
{% if mod > 0 %}{{ part }}{% endif %}
{% endfor %}
我会在一个片段中分配你所有的变量,并在你需要使用变量的任何范围内继续包含这个相同的片段....
这是一个相当枯燥的方法。
config/settings_schema.json 中定义的任何内容都具有全局范围,但最终用户可以在主题设置中为其赋予新值。