【问题标题】:How do I make a Freemarker function in the global scope?如何在全局范围内创建 Freemarker 函数?
【发布时间】:2012-07-05 02:13:45
【问题描述】:

如何创建全局可用的函数?

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

  • 每个种类请求的不同模板(例如,一本书、作者或出版商的不同模板),例如:
  • 这些模板中的每一个都使用 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]

所以,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]

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

如果没有自己的命名空间,我将如何处理?

【问题讨论】:

    标签: scope freemarker


    【解决方案1】:

    只是为了确保清楚:#include-d 模板与包含模板共享名称空间,所以如果你想这样做,就不要使用#import#import 的要点正是模板不共享名称空间。如果您想要这些单独的名称空间,但又想共享一些宏/函数,那么模板仍然可以#import 彼此。

    如果你真的想让一些函数/宏成为全局的,那么在你定义它们之后,你可以像这样将它们复制到全局命名空间中:

    [#macro myMacro]
       ...
    [/#macro]
    [#global myMacro = myMacro]
    

    在此之后,您可以在任何地方发出[@myMacro /]

    【讨论】:

    • 哦,太棒了,没有意识到函数和宏是可以这样使用的对象。
    猜你喜欢
    • 2013-12-12
    • 2018-10-29
    • 2022-09-23
    • 1970-01-01
    • 2017-01-20
    • 2012-09-08
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多