Подтвердить что ты не робот

Вызов макроса внутри другого макроса в Twig

Как макрос button_primary может вызвать макрос button в движке Twig? я пробовал  это решение, но оно не работает, он говорит, что функция "button" не существует:

{% macro button(label, type, size) %}
    {% set type = type|default('default') %}
    {% set size = size|default('large') %}
    {% set cls = ['btn'] %}

    <a href="#" class="{{ cls|join(' ') }}">{{ label }}</a>
{% endmacro %}

{% macro button_primary(label, size) %}
    {{ button(label, 'primary', size) }}
{% endmacro %}
4b9b3361

Ответ 1

Несчастливый ответ Gremo работает, но это не правильный способ сделать это.

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

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

Правильный способ:

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

Ответ 2

Ответьте мне: это добавленная новая функция, см. эту ссылку. В любом случае решение использует _self:

{% macro button_primary(label, size) %}
    {{ _self.button(label, 'primary', size) }}
{% endmacro %}