Prev |  | Next

### `metal:use-macro`

This attribute calls a macro and includes its result in the current template.

                <span tal:comment="main_menu template requires 'mdate' variable" tal:define="mdate page/last_modified" metal:use-macro="main_menu" />

You can refer to external macros defined in other templates by specifying the template source file.

                <span metal:use-macro="site_macros.xhtml/main_menu"/>

It is interesting to note that you can also use the PHPTAL inline replacement feature inside the `use-macro` attribute value:

                <span metal:use-macro="${design}/site_macros.xhtml/main_menu"/>

Macro can call itself. This way you can output arrays recursively:

                <ul metal:define-macro="show-list"><li tal:repeat="item list"><tal:block tal:condition="php:is_array(item)" tal:define="list item" metal:use-macro="show-list" /><tal:block tal:condition="php:!is_array(item)" tal:content="item" /></li></ul>

#### Callbacks

Since you can use variables in macro names, you can create macros that call back other macros. This is useful in cases where slots are not enough.

                  <!-- this code uses "macroname" variable as name of macro to call back -->
                  <ul metal:define-macro="macro-with-callback">
                    <li tal:repeat="item list">
                      <tal:block metal:use-macro="${macroname}"/>
                    </li>
                  </ul>
                  <!-- define callback -->
                  <div metal:define-macro="my-callback">    this will be called every time
    </div>
                  <!-- use it with the first macro --><div tal:define="macroname 'my-callback'" metal:use-macro="macro-with-callback"/>

Prev | Up | Next
`metal:define-macro` | Home | `metal:define-slot`