{% macro %}

October CMS Documentation Docs

{% macro %}

The {% macro %} tag allows you to define custom functions in your templates, similar to regular programming languages.

{% macro input() %}
    ...
{% endmacro %}

Alternatively you can include the name of the macro after the end tag for better readability:

{% macro input() %}
    ...
{% endmacro input %}

The following example defines a function called input() that takes 4 arguments, the associated values are accessed as variables within the markup inside.

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

Note: Macro arguments don't specify default values and are always considered optional.

# Calling macros

Before a macro can be used it needs to be "imported" first using the {% import %} tag. If the macro is defined in the same template, the special _self variable can be used.

{% import _self as form %}

Here the macro functions are assigned to the form variable, available to be called like any other function.

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

Macros can be defined in a theme partial and imported by name. To import the macros from a partial called macros/form.htm, simply pass the name after the import tag quoted as a string.

{% import 'macros/form' as form %}

Alternatively you may import macros from a system view file and these will be accepted. To import from plugins/acme/blog/views/macros.htm simply pass the path hint instead.

{% import 'acme.blog::macros' as form %}

# Nested macros

When you want to use a macro inside another macro from the same template, you need to import it locally.

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

    <div class="field">
        {{ form.input(name, value, type, size) }}
    </div>
{% endmacro %}

# Context variable

Macros don't have access to the current page variables.

<!-- October CMS -->
{{ site_name }}

{% macro myFunction() %}
    <!-- NULL -->
    {{ site_name }}
{% endmacro %}

You may pass the variables to the function using the special _context variable.

{% macro myFunction(vars) %}
    {{ vars.site_name }}
{% endmacro %}

{% import _self as form %}

<!-- October CMS -->
{{ form.myFunction(_context) }}