【问题标题】:How can I access template variable in TWIG macro?如何访问 TWIG 宏中的模板变量?
【发布时间】:2021-07-23 00:35:34
【问题描述】:

我无法访问 TWIG 宏中的模板变量。

这是一个简化的例子:

{% set myname = "Ligio" %}
{{ _self.pagedurl(1) }}

{% macro pagedurl(page) %}
    Hi {{ _self.myname }}! This is Page Num {{ page }}
{% endmacro %}

如何在不将变量 myname 传递给宏的情况下访问它?

【问题讨论】:

  • 你试过简单的{{ myname }}吗?
  • with {{ myname }} 我不在变量的范围内...它不起作用!

标签: variables macros twig


【解决方案1】:

你不能。

如文档中所述:

作为 PHP 函数,宏无法访问当前模板 变量。

您唯一的解决方案是将参数传递给macro

{% import _self as flow %}
{{ flow.pagedurl(1, "Ligio") }}

{% macro pagedurl(page, myname) %}
    Hi {{ myname }}! This is Page Num {{ page }}
{% endmacro %}

重要提示:

您可能已经注意到,在我的示例中,我调用了{% import _self as flow %}
这是您必须做的事情:

当您在要使用它的模板中定义宏时, 您可能很想通过 _self.input() 直接调用宏 而不是导入它;即使看起来有效,这只是一个 当前实现的副作用,它将不再适用 树枝 2.x。

http://twig.sensiolabs.org/doc/tags/macro.html

【讨论】:

  • 一种可以“破解”“全局变量”的解决方案是构建一个 twig var(或使用 _context)作为重要变量的数组,然后将这个单个 twig var 作为最后一个参数传递给任何你使用的宏。 --------- 当在您的宏范围内时,您可以通过 varargs 属性访问这个最终参数。例如: {% set MyGlobals = varargs[0] %}
  • 似乎在 Twig 3.x 中我们不需要导入 _self 而你不应该这样做。
  • 文档的理由似乎很荒谬。 PHP 函数可以访问全局变量,PHP 方法可以访问类成员。他们可以按设计保留它,而不是试图将其归咎于 PHP。
【解决方案2】:

如果您需要将多个全局变量传递给宏,您可能会发现_context 变量很有用:

{% macro mymacro(globalvars) %}
    Value of the global variable pi is {{ globalvars.pi }}
{% endmacro %}

{% set pi = 3.14159 %}
{{ _self.mymacro(_context) }}

参考:thisthis 答案。

【讨论】:

    【解决方案3】:

    您可以设置一个全局变量并在模板中的任何位置访问它

    $loader = new \Twig_Loader_Filesystem('path/to/templates');
    $twig = new \Twig_Environment($loader);
    $twig->addGlobal('V_Name', 'V_Value');
    

    【讨论】:

    • 谢谢,这确实是使用 Timber/Twig/WordPress 时的最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2017-09-08
    相关资源
    最近更新 更多