2013-02-27 22 views
8

Nie mogę uzyskać dostępu do zmiennej szablonu w makrze TWIG.Jak mogę uzyskać dostęp do zmiennej szablonu w makrze TWIG?

Oto uproszczony przykład:

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

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

Jak mogę uzyskać dostęp do zmiennej myname bez przekazaniem go do makro?

+0

Czy wypróbowałeś prosty '{{myname}}'? – Maerlyn

+1

z {{myname}} Nie jestem w zakresie zmiennej ... To nie działa! – Ligio

Odpowiedz

16

Nie możesz.

Jak podano w dokumentacji:

jako funkcje PHP, makra nie mają dostępu do aktualnego szablonu zmiennych.

Twoim jedynym rozwiązaniem jest przekazać parametr do macro:

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

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

UWAGA:

Pewnie zauważyłeś w moim przykładzie, wzywam {% import _self as flow %}.
To jest coś, czego MUST zrobić:

Po zdefiniowaniu makra w szablonie gdzie masz zamiar go używać, może ulec pokusie, aby wywołać makro bezpośrednio poprzez _self.input() zamiast importować; nawet jeśli wydaje się działać, jest to po prostu efekt uboczny obecnej implementacji i nie będzie już działać w Twig 2.x.

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

+1

Jednym z rozwiązań, które mogą "zhakować" twoje "globale", jest zbudowanie gałązki var (lub użycie _context) jako tablicy ważnych zmiennych, a następnie przekazanie tej pojedynczej gałązki var jako ostatniego argumentu do dowolnego używanego makra. --------- W ramach twojego makra możesz uzyskać dostęp do tego ostatecznego argumentu za pośrednictwem właściwości varargs. na przykład: {% set MyGlobals = varargs [0]%} –

5

Jeśli trzeba przejść więcej niż jedną zmienną globalną w makro, można znaleźć _context zmienna przydatne:

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

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

Ref: this lub this odpowiedź.

Powiązane problemy