假设您有一个标准模板,其中包含(已解析的)标题,正文,页脚模板。
在body模板中定义了一个像$ subject这样的变量,你希望它也显示在标题模板中。
在其他一些模板语言中,例如HTML :: Mason(基于perl),你首先要评估body模板以获取$ subject变量,但是将它的输出临时存储在一个变量中,这样你的最终输出就会以正确的顺序结束(标题,正文,页脚)
在速度上,它看起来像
set($ body =#parse(“body.vm”))
解析( “header.vm”)
$ {体}
解析( “footer.vm”)
然而,这似乎不起作用,有关如何做到这一点的任何想法?
答案 0 :(得分:10)
上述两种解决方案中的任何一种都可行。 VelocityLayoutServlet解决方案需要一个名为Velocity Tools的额外软件包(也来自Velocity)。我自己偏爱这种方法(和变种)。
第三种方法只是将#parse放在引号内:
set ($body="#parse('body.vm')")
在#set中,评估双引号中的任何内容。单引号中的字符串按字面顺序传递。
答案 1 :(得分:3)
您可以使用VelocityLayoutServlet中的VelocityTools来完成此操作。
这允许您为应用程序定义一个布局 - 让我们称之为application.vm
- 您可以在其中解析页眉,页脚等,并使用{{1}声明主体内容的放置位置声明,例如:
screen_content
<html>
<head>
<title>$subject</title>
</head>
<body>
#parse("header.vm")
$screen_content
#parse("footer.vm")
</body>
</html>
将在渲染之前评估模板(以及变量),这允许您在体模板中设置VelocityLayoutServlet
变量,例如:
$subject
可以找到更详细的信息in the Velocity documentation。
答案 2 :(得分:0)
如果我理解正确,您希望在$subject
和header.vm
模板中插入名为body.vm
的Velocity变量。目前,该变量已在body.vm
模板中定义,因此您无法在早期模板header.vm
中引用该变量。
为什么不将$ subject的定义抽象为自己的模板片段,称为globals.vm
,然后将其包含在顶级模板中。所以你有:
#parse("globals.vm")
#parse("header.vm")
#parse("body.vm")
#parse("footer.vm")