Spec-Zone.ru › Twig 1

macro

Новое в версии 1.12: Возможность определения значений по умолчанию для аргументов в сигнатуре макроса была добавлена в Twig 1.12.

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

Макросы определяются в обычных шаблонах.

Представьте, что у вас есть универсальный вспомогательный шаблон, который определяет, как отображать HTML-формы с помощью макросов (называемые forms.html):

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

{% macro textarea(name, value, rows = 10, cols = 40) %}
    <textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols }}">{{ value|e }}</textarea>
{% endmacro %}

Каждый аргумент макроса может иметь значение по умолчанию (здесь text является значением по умолчанию для type, если оно не указано при вызове).

Примечание

Перед Twig 1.12 определение значений аргументов по умолчанию выполнялось с помощью фильтра default в теле макроса:

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

Макросы отличаются от встроенных PHP-функций несколькими способами:

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

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

Подсказка

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

Импорт

Существует два способа импорта макросов. Вы можете импортировать весь шаблон, содержащий макросы, в локальную переменную (с помощью тега import) или только конкретные макросы из шаблона (с помощью тега from).

Для импорта всех макросов из шаблона в локальную переменную используйте тег %%%CODE_BLOCK_10%%:

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

Вышеупомянутый import вызов импортирует файл forms.html (который может содержать только макросы или шаблон и некоторые макросы) и импортирует макросы как элементы локальной переменной %%%CODE_BLOCK_14%%.

Затем макросы можно вызывать по желанию в текущем шаблоне:

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

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

{% 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 %}

В качестве альтернативы вы можете импортировать имена из шаблона в текущее пространство имен с помощью тега from:

{% from 'forms.html' import input as input_field, textarea %}

<p>{{ input_field('password', '', 'password') }}</p>
<p>{{ textarea('comment') }}</p>

Примечание

Импорт макросов с помощью import или from является локальным для текущего файла. Импортированные макросы недоступны во включенных шаблонах или дочерних шаблонах; вам нужно явно повторно импортировать макросы в каждом файле.

Подсказка

Чтобы импортировать макросы из текущего файла, используйте специальную переменную _self:

{% import _self as forms %}

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

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

Имена макросов закрывающих тегов

Twig позволяет вам указывать имя макроса после закрывающего тега для лучшей читаемости (имя после слова endmacro должно совпадать с именем макроса):

{% macro input() %}
    ...
{% endmacro input %}
« include | sandbox »

© 2009–2018 by the Twig Team
Licensed under the three clause BSD license.
The Twig logo is © 2010–2020 Symfony
https://twig.symfony.com/doc/1.x/tags/macro.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API