Calling a macro inside another macro in Twig
Answer to myself: it's a quite new feature added, see this link. Anyway the solution is using _self
:
{% macro button_primary(label, size) %}
{{ _self.button(label, 'primary', size) }}
{% endmacro %}
EDIT: As per cr4zydeejay's answer Feb 7th 2021 the answer was updated to reflect the correct way in Twig 3.x
Twig 3.x
https://twig.symfony.com/doc/3.x/tags/macro.html
When macro usages and definitions are in the same template, you don't need to import the macros as they are automatically available under the special _self variable:
<p>{{ _self.input('password', '', 'password') }}</p>
{% macro input(name, value, type = "text", size = 20) %}
<input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}"/>
{% endmacro %}
Twig 2.x
Unfortunatly Gremo's answer works, but is not the right way to do it.
When you define a macro in the template where you are going to use it, you might be tempted to call the macro directly via _self.input() instead of importing it; even if seems to work, this is just a side-effect of the current implementation and it won't work anymore in Twig 2.x.
http://twig.sensiolabs.org/doc/tags/macro.html
Correct way:
{% 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 %}
Gremo's answer is correct way to do this in Twig 3.x.
https://twig.symfony.com/doc/3.x/tags/macro.html
When macro usages and definitions are in the same template, you don’t need to import the macros as they are automatically available under the special _self variable.