旧式宏和调用指令

Page Contents

Synopsis

<#macro name(argName1, argName2, ... argNameN)>
  ...
</#macro>

<#call name(argValue1, argValue2, ... argValueN)>

Where:

  • name:宏的名称(不是表达式)

  • argName1argName2,...等:local variables的名称存储参数值(不是表达式)

  • argValue1argValue2,...等:表达式,参数值

Description

Note:

这是 FreeMarker 2.1 宏和与宏相关的指令的文档。这些仍在工作,但已弃用。您可能需要阅读 FreeMarker 2.2 参考:macro, return用户定义的指令调用

宏是具有相关名称的模板片段。您可以在模板的多个位置上使用该命名的片段,因此它有助于执行重复的任务。宏可以具有影响使用宏时生成的输出的参数。

您可以使用macro指令定义宏,然后可以在整个模板中使用已定义的宏。 macro指令本身不向输出写入任何内容,它只是定义了宏。例如,这将定义一个名为warning的宏:

<#macro warning(message)>
  <div align=center>
  <table border=1 bgcolor=yellow width="80%"><tr><td align=center>
    <b>Warning!</b>
    <p>${message}
  </td></tr></table>
  </div>
</#macro>

每当您将call指令与宏名称一起使用时,将处理宏定义主体(宏开始标记和结束标记之间的部分)。例如,这将调用名为warning的宏:

<#call warning("Unplug the machine before opening the cover!")>

并将其写入输出:

<div align=center>
  <table border=1 bgcolor=yellow width="80%"><tr><td align=center>
    <b>Warning!</b>
    <p>Unplug the machine before opening the cover!
  </td></tr></table>
  </div>

作为参数传递给call指令的参数将在宏定义主体中以local variables的形式访问。

调用宏时,必须指定与宏定义中指定数量相同的参数。例如,如果这是宏定义:

<#macro test(a, b, c)>Nothing...</#macro>

那么这些是有效的宏调用:

<#call test(1, 2, 3)>
<#call test("one", 2 + x, [1234, 2341, 3412, 4123])>

如果宏没有参数,则可以省略括号:

<#macro test>mooo</#macro>
<#call test>

定义宏时,该宏将在仅定义宏的模板中可用。但是可能您想在更多模板中使用相同的宏。在这种情况下,您可以将宏定义存储在一个通用文件中,然后将该文件包含在需要这些宏的所有模板中。

可以调用在模板中进一步定义的宏(因为宏是在解析时定义的,而不是在处理时定义的)。但是,如果宏定义是通过include指令插入的,则在 FreeMarker 执行include指令之前它们将不可用。

您可以使用return指令将宏定义主体保留在</#macro>标记之前。