2

我试图在我的部分文件中使用一个变量,但它似乎不是从它的父模板继承的。

例如:

指数.液体

{% assign foo = "bar" %}
{% section 'example' %}

部分/example.liquid

<h1>{{ foo }}</h1>

{% schema %}
{
    "name": "Example",
    "settings": [
       ...
    ]
}
{% endschema %}

它不会输出 的值{{ foo }},而我只是得到:<h1></h1>好像从未定义过该变量。

我认为部分会像片段一样工作,其中父模板中定义的任何内容都将在包含的片段的范围内:

指数.液体

{% assign foo = "bar" %}
{% include 'example' %}

片段/example.liquid

<h1>{{ foo }}</h1>

<h1>bar</h1>渲染时我会得到的地方。

  • 这是一个错误,还是预期的行为?
  • 有没有办法可以包含一个部分并使用某种形式的外部范围的变量?

谢谢!

4

2 回答 2

7

如果这是预期的行为,我设法找到解决方法,并认为我会发布我的不完美但可行的解决方案:

部分/example.liquid

<h1><!-- foo --></h1>

您可以使用捕获,将部分的内容作为字符串获取,并在捕获的标记上使用字符串过滤器:

指数.液体

{% assign foo = "bar" %}
{% capture section %}{% section 'example' %}{% endcapture %}
{{ section | replace: '<!-- foo -->', foo }}

您当然可以用您的变量替换任何字符串。但我发现 HTML 注释运行良好,因为如果您忘记运行替换,或者不需要 - 不会呈现任何内容。

如果你想做一些更复杂的事情,比如从部分中删除一些标记,你可以:

部分/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 %}
于 2018-06-15T10:16:30.970 回答
2

我会在一个片段中分配你所有的变量,并在你需要在其中使用变量的任何范围内包含这个相同的片段。

这是一种相当干燥的方法。

此外,config/settings_schema.json 中定义的任何内容都具有全局范围,但最终用户可以在主题设置中为其赋予新值。

于 2019-08-01T20:28:08.497 回答