如何在TWIG宏中访问模板变量?

23

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

这是一个简化的示例:

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

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

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


你试过一个简单的 {{ myname }} 吗? - Maerlyn
2
使用 {{ myname }},我不在变量的范围内... 它没有起作用! - Ligio
3个回答

25

你不能这样做。

正如文档中所述:

作为 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()调用这个宏而不是导入它时,你可能会被诱惑;即使看起来可行,但这只是当前实现的副作用,在Twig 2.X中将不再起作用。

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


1
一个可以“突破”您的“全局变量”的解决方案是构建一个twig var(或使用_context)作为您重要变量的数组,然后将此单个twig var作为您使用的任何宏的最后一个参数传递。在宏的范围内,您可以通过varargs属性访问此最终参数。例如:{% set MyGlobals = varargs [0] %} - David Lundquist
似乎在Twig 3.x中,我们不需要导入_self,也不应该这样做。 - Loenix
2
文档的解释看起来有点荒谬。PHP函数可以访问全局变量,而PHP方法可以访问类成员。他们本可以说这是设计意图,而不是试图把责任归咎于PHP。 - Benoit Duffez
引用Symfony文档,关于Twig版本(https://twig.symfony.com/doc/2.x/tags/macro.html):“自动导入仅在Twig 2.11及以上版本中可用。对于旧版本,请使用特殊的_self变量导入宏以获取模板名称:” - Tomas Votruba

13

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

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

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

参考:这个或者这个答案。


2

您可以设置全局变量,并在模板中的任何地方访问它。

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

2
谢谢,这确实是在使用Timber/Twig/WordPress时最好的解决方案。 - thaikolja

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