2013-02-27 6 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

+1

と{{myname}}私は変数のスコープにいません... これは機能しません! – Ligio

答えて

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

"グローバル変数"を "ハック"できる1つの解決策は、重要な変数の配列としてtwig var(または_context)を構築し、このマクロを使用するマクロの最後の引数として渡します。 ---------マクロのスコープ内で、varargsプロパティを使用してこの最終引数にアクセスできます。例:{%set MyGlobals = varargs [0]%} –

5

あなたがマクロに複数のグローバル変数を渡す必要がある場合は、_context変数便利かもしれません:

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

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

参考:thisまたはthis答えを。

関連する問題