如何在全局范围内创建Freemarker功能?

Ben*_*anc 2 scope freemarker

如何创建全局可用的功能?

目前,该应用程序的结构如下:

  • 一个明显的模板每个样的请求,例如,(例如,对于一本书,作者或出版商不同的模板):
  • 这些模板中的每一个都使用来自page.ftl中的宏的公共元素进行修饰,例如:
[#ftl]
[#macro decorate]
<html>
  <head>
  <!-- some stuff here -->
  </head>
  <body>
    <header><!-- more stuff here --></header>
    <div id="main-content">[#nested /]</div>
    <footer><!-- more stuff here --></footer>
  </body>
</html>
[/#macro]
Run Code Online (Sandbox Code Playgroud)

所以,book.ftl看起来像:

[#ftl]
[#include page.ftl p]
[@p.decorate]
<h1>Book: The Bible</h1>
<dl>
  <dt>Author:</dt>
  <dd>God</dd>
</dl>

[#-- HERE'S THE IMPORTANT BIT --]
[@myFunctionHere('The Bible') /]

[#-- I ALSO NEED TO BE ABLE TO CALL myFunction IN INCLUDED PAGES TOO --]
[#import "_partial.ftl" /]

[/@p.decorate]
Run Code Online (Sandbox Code Playgroud)

我想创建一个全局函数,该函数将被定义并包含一次并且可以在任何地方使用(在book.ftl和其他函数中,以及它导入/包含的任何模板).

我怎么会这样,最好没有它自己的命名空间?

dde*_*any 5

只是为了确保它是清楚的:#include-d templates与包含模板共享名称空间,所以如果你想要,只是不要使用#import.关键#import在于模板不共享名称空间.如果你想要那些单独的名称空间,但是你想要共享一些宏/函数,那么模板仍然可以#import相互进行.

如果您确实希望某些函数/宏变为全局,那么在定义它们之后,您可以将它们复制到全局名称空间中,如下所示:

[#macro myMacro]
   ...
[/#macro]
[#global myMacro = myMacro]
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以[@myMacro /]随处发出.