在Twig中调用另一个宏内的宏

时间:2012-03-03 18:16:09

标签: twig

button_primary宏如何在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 %}

3 个答案:

答案 0 :(得分:60)

不幸的是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 %}

答案 1 :(得分:4)

回答自己:这是一个非常新的功能,请参阅this link。无论如何,解决方案是使用_self

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

答案 2 :(得分:1)

Gremo 的答案是在 Twig 3.x 中执行此操作的正确方法。

https://twig.symfony.com/doc/3.x/tags/macro.html

<块引用>

当宏用法和定义在同一个模板中时,您不 需要导入宏,因为它们在下自动可用 特殊的 _self 变量。