DevGang
Авторизоваться

Twig

Русскоязычная документация по Twig - PHP шаблонизатору. Руководство по Твиг на русском языке

Макросы сопоставимы с функциями в регулярных языках программирования. Они используются, чтобы положить часто используемые HTML идиомы в многократно используемые элементы с целью избежать постоянных повторений. Вот небольшой пример макроса, который делает элемент form.

{% macro input(name, value, type, size) %}
    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

Макросы отличается от родных функций PHP в нескольких направлениях.

  • Аргумент значения, установленный по умолчанию, определяется с помощью фильтра по умолчанию в теле макроса.
  • Аргументы и макросы всегда являются опциональными.

Но, как и PHP-функции, макросы не имеют доступа к глобальным переменным шаблона.

Вы можете передать весь контекст в качестве аргумента, используя специальную переменную _context.

Макрос может быть определен в любой шаблон, и должен быть "импортирован" перед использованием (см. документацию для тега import для получения дополнительной информации).

{% import "forms.html" as forms %}

Вызов import импортирует файл "forms.html", который может содержать только макросы или шаблон и некоторые макросы, и может импортировать функици как переменные form.
Макрос можно вызывать по желанию:

<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>

Если макросы определяются и используются в том же шаблоне, то можно использовать специальную переменную _self , чтобы импортировать их:

{% import _self as forms %}

<p>{{ forms.input('username') }}</p>

При определении макроса в шаблоне, где его планируют использовать, можно попытаться вызвать макрос непосредственно через _self.input ( ) вместо его импорта; даже если это работает сейчас - это всего лишь побочный эффект текущей реализации, и больше не будет работать в Twig 2.x.

Если макрос должен использоваться в другом макросе из того же файла, его нужно импортировать локально:

{% macro input(name, value, type, size) %}
    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

{% macro wrapped_input(name, value, type, size) %}
    {% import _self as forms %}

    <div class="field">
        {{ forms.input(name, value, type, size) }}
    </div>
{% endmacro %}
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться