如何在Liquid中定义全局变量?

12

目前看来,我创建的变量无法在不同的文件之间进行通信。

4个回答

6
对于 Liquid,您可以在 include 中传递一个变量。
{%- assign global_var = "VALUE" -%}
{%- include 'YOUR_FILE' global_var: global_var  -%}

对于Shopify的liquid,您可以执行以下操作:

有一个解决方法,您可以将全局变量设置为主题设置中的选项config/settings_schema.json

  {
    "type": "text",
    "id": "global_variable",
    "label": "global variable",
    "default": "Variable value"
  },

你可以通过以下方式在Liquid文件中访问此内容:

settings.global_variable

但是这个值取决于您在主题设置中输入的内容。

如果您需要更加动态的方式,您可以通过Ajax设置购物车属性,例如:

    $.ajax({
      type: 'POST',
      url: '/cart/update.js',
      data: { attributes: {'global_variable': "MY_VALUE"} },
      dataType: 'json',
      success: function(cart) {
        location.reload();
      }
    });

然后通过 cart.attributes.global_variable 访问它,并且你需要在购物车为空时更新它。


5

似乎模板在主题之前加载,因此在布局/主题文件中设置的变量不会出现在模板中。令人沮丧。但是,您可以通过片段设置它们,并在模板、布局等中包含此片段。


我喜欢这个解决方案,因为我们只需要在需要变量的模板中包含这个片段。 - jer0dh

1
在Liquid中,如果您想确定语言并在多个场合重复使用此代码,则可以在render文件夹中创建一个文件。 而不是使用render调用它,使用include。然后返回分配的值。例如,创建“render/current_language.liquid”:
{%- liquid
    assign current_language = 'en'
    if request.path contains '/nl/'
        assign current_language = 'nl'
    endif
%}

在另一个文件中,您可以按以下方式使用:
{%- liquid 
  include 'get-language' 
  if current_language == 'en'
    
  else

  endif
%}

0
只要你使用了

标签

,这就是一个HTML代码片段。
{% assign variable = value %}

你应该能够在文件的任何地方获取该值,并且在它被分配后包含在其中的任何文件中。

我相信这是你能够获得的最接近全局变量的方式。


1
它在两年半前是准确的 - 自2016年底以来我就没有再使用过,所以现在可能不同了。 - Scott Flack
@dave4jr,那绝对是错误的,他们百分之百可以访问父上下文。但是,当包含它们以覆盖父上下文时,您可以为片段提供自定义变量值。 - Dan
1
@Dan,我不小心删掉了我的评论,但那不是真的。我刚刚再次测试了一下。也许只是在某些部分,但如果你在主题顶部创建一个带有赋值的变量,然后在其下方有一个部分,你将无法访问它。 - dave4jr
@dave4jr true - sections有点像具有特殊作用域规则的自包含模块 - 这是设计上的考虑 - 如果你试图将变量传递到sections中,那么你正在尝试一些错误的事情。我忘记了你评论的确切内容,但我当时在谈论代码片段。 - Dan
@Dan,是的,我的评论是说为了避免这种情况,你可以将父级上下文中的变量作为参数传递给该部分。我想我们只是用不同的方式表达了同样的意思。哈哈 - dave4jr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接