2013-02-27 117 views
8

我無法訪問TWIG宏中的模板變量。如何在TWIG宏中訪問模板變量?

下面是一個簡單的例子:

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

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

我怎樣才能訪問變量MYNAME沒有它傳遞給宏?

+0

你試過簡單的'{{myname}}'嗎? – Maerlyn 2013-02-27 15:41:28

+1

與{{myname}}我不在變量的範圍內... 它不工作! – Ligio 2013-02-27 16:27:55

回答

16

你不能。

如文檔中表示:

由於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 %}
這是你MUST做:

當你在模板中定義一個宏,你要使用它, 你可能會直接通過_self.input調用宏() 而不是導入它;即使似乎工作,這只是當前實現的 副作用,它不會在 Twig 2.x中工作。

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

+1

可以「破解」你的「全局變量」的一個解決方案是構建一個樹枝var(或使用_context)作爲重要變量的數組,然後將這個單個樹枝var作爲最後一個參數傳遞給你使用的任何宏。 ---------當你的宏的範圍內,你可以通過varargs屬性訪問這個最後的參數。例如:{%set MyGlobals = varargs [0]%} – 2017-11-21 13:00:42

5

如果你需要不止一個全局變量傳遞到宏觀,你可能會發現_context變量有用:

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

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

編號:thisthis答案。