10

假设您有一个包含(解析)页眉、正文、页脚模板的标准模板。

在正文模板中定义了一个像 $subject 这样的变量,并且您希望它也显示在标题模板中。

在其他一些模板语言中,例如 HTML::Mason(perl based),您将首先评估 body 模板以获取 $subject 变量,但将其输出临时存储在变量中,以便您的最终输出以正确的顺序结束(标题,正文,页脚)

在速度方面,它看起来像

设置 ($body=#parse("body.vm"))

解析(“header.vm”)

${正文}

解析(“footer.vm”)

然而,这似乎不起作用,关于如何做到这一点的任何想法?

4

3 回答 3

10

上述两种解决方案中的任何一种都可以。VelocityLayoutServlet 解决方案需要一个名为 Velocity Tools 的额外包(也来自 Velocity)。我自己偏爱这种方法(和变体)。

第三种方法是简单地将#parse 放在引号内:

set ($body="#parse('body.vm')")

在#set 中,对双引号中的任何内容进行评估。单引号内的字符串按字面意思传递。

于 2008-10-31T02:47:25.040 回答
3

您可以使用VelocityLayoutServlet来做到这一点,它是VelocityTools的一部分。

这允许您为您的应用程序定义一个布局——我们称之为布局application.vm——您可以在其中解析页眉、页脚等,并使用声明声明主体内容的放置位置screen_content,例如:

<html>
  <head>
    <title>$subject</title>
  </head>
  <body>
  #parse("header.vm") 
  $screen_content
  #parse("footer.vm") 
  </body>
</html>

VelocityLayoutServlet将在渲染之前评估模板(以及变量),这允许您$subject在正文模板中设置变量,例如:

#set($subject = "My Subject")
<div id="content">
</div>

更多详细信息可以在 Velocity 文档中找到。

于 2008-10-28T13:20:00.927 回答
0

如果我理解正确,您希望将一个名为 Velocity 的变量$subject插入到header.vm模板body.vm中。现在,该变量是在body.vm模板中定义的,因此您不能在之前的模板中引用它header.vm

为什么不将 $subject 的定义抽象到它自己的模板片段中,称为globals.vmsay,然后将其包含在顶级模板中。所以你会有:

#parse("globals.vm")
#parse("header.vm")
#parse("body.vm")
#parse("footer.vm")
于 2008-10-30T05:31:31.247 回答