2012-03-03 32 views
20

Làm thế nào button_primary macro có thể gọi macro button trong công cụ Twig? Tôi đã thử giải pháp này, nhưng nó không hoạt động, nó nói rằng các "nút" chức năng không tồn tại:Gọi macro ở một macro khác trong Twig

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

Trả lời

48

Câu trả lời của Gremo không may, nhưng không phải là cách phù hợp.

Khi bạn xác định macro trong mẫu mà bạn định sử dụng, bạn có thể bị cám dỗ gọi macro trực tiếp qua _self.input() thay vì nhập; ngay cả khi có vẻ hoạt động, đây chỉ là một tác dụng phụ của việc triển khai hiện tại và nó sẽ không hoạt động nữa trong Twig 2.x.

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

cách đúng:

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

Điểm tốt. Tôi không thể nhớ thông báo đó tại thời điểm câu hỏi. Dù sao cũng cảm ơn... – gremo

3

trả lời cho bản thân mình: đó là một tính năng khá mới được thêm vào, xem this link. Dù sao giải pháp đang sử dụng _self:

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

Hãy xem câu trả lời của tôi cho đúng cách để làm điều đó. – WTPK