Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

模板脚本绘制输出。通常这种输出是HTML。脚本用如FreeMarker或JSP这样的模板语言编写。脚本指导绘制者将内容放到页面的什么位置,并为类似标题和图片的内容提供占位符。模板脚本绘制输出,通常这种输出是HTML。脚本用如FreeMarker或JSP这样的模板语言编写。脚本指导绘制者将内容放到页面的什么位置,并为类似标题和图片的内容提供占位符。

Table of Contents

脚本语言和绘制器

...

在Magnolia里,我们更倾向于使用FreeMarker,因其灵活性,较清晰的语法,更好的错误报告机制,也因为它不依赖于文件系统。模板不需要导出到文件系统,这意味着您可以将它们存储在内容库中,并像其他资源一样获得,随意添加版本控制,以及添加定制的属性和元数据。

样例:绘制页面标题,如果没有标题则绘制名字。示例:绘制页面标题,如果没有标题则绘制名字。

Code Block
<h3>${content.title!content.@name}</h3>

...

  • 它是一种通用的模板语言,不束缚于Java环境。
  • 提供基本的指令,如[if][else]和[list]
  • 有一大套built-ins内建函数
  • 可以调用任何Java对象和返回对象的公共方法。
  • 不需要在请求/回复环境中绘制。
  • 提供直接获取节点对象(beans)的方法。
  • 可直接迭代任何扩展一个Java列表的内容集合。
  • 严格的null值处理导致稳定的模板。
  • 需要的话允许使用JSP标签库。

...

JSP代表JavaServer Pages,是Java Servlet技术的一个延伸,用于综合Java服务器端的程序和HTML。

样例:绘制页面标题,如果没有标题则绘制名字。示例:绘制页面标题,如果没有标题则绘制名字。

Code Block
<h3>
<c:choose>
    <c:when test="${not empty content.title}">${content.title}</c:when>
    <c:otherwise>${content['@name']}</c:otherwise>
</c:choose>
</h3>

...

定制Magnolia指令

Magnolia CMS提供一下定制指令:

  • cms:init:嵌入编辑页面所必需的JavaScript和CSS。
  • cms:area绘制区域
  • cms:component绘制组件

对FreeMarker来说,这些指令都是由Directives类来完成的。此类可在Configuration应用的modules/rendering/renderers/freemarker/contextAttributes/cms/componentClass里配置。

...

cms:area指令AreaDirective)绘制一个area区域以及里面的任何组件。编辑者可在区域内添加组件。可用的组件在区域定义里配置。

...

Code Block
[#list components as component ]
   [@cms.component content=component /]
[/#list]

常用指令属性

下列属性可用任何指令传递,它们定义指令创建的元件应该工作在什么内容上。The following attributes can be passed with any directive. They define which content the element created by the directive should work on.下列属性(attributes)可用任何指令传递,它们定义指令创建的元件应该工作在什么内容上。

属性(Attribute)描述缺省值
content一个节点或是内容地图。 
workspace指定路径时用到的工作区。与当前内容相同
path工作区中的路径。 

...

Code Block
<div id="wrapper-3">
    [@cms.area name="platform"/]
    [@cms.area name="main" content=content/]
    [@cms.area name="extras"/]
</div>

mainArea 区域脚本里,我们再次传递相同的信息给intro区域:“你应该在当前内容节点上执行,它(仍然)是一个页面。”区域脚本里,我们再次传递相同的信息给intro区域:“你应该在当前内容节点上执行,它(仍然)是一个页面。”

Code Block
<div id="main" role="main">
    [@cms.area name="breadcrumb" content=content/]
    [@cms.area name="intro" content=content/]
    [@cms.area name="opener"/]
    [@cms.area name="content"/]
</div><!-- end main -->

现在由intro区域编辑页面内容。尽管intro区域在页面上位于main区域的DIV元件里,标题和摘要实际上属于页面,它们是页面的属性,而不是区域的。所以将这些属性存放在内容结构里的页面节点下是有道理的。

workspace属性

workspace属性告知指令内容在属性(attribute)告知指令内容在magnolia JCR库的哪个工作区。这几乎一直是website工作区,如果当前内容在website工作区里,则自动默认指向website。

...

DamTemplatingFunctions提供到Assets的直接权限以及定义有用的方法。这些方法表现为damfn。参考DAM templatingDAM模板以获得更多信息。例如:

Code Block
[#assign asset = damfn.getAssetForId(content.link)][#assign assetMap = damfn.getAssetMapForAssetId(content.link)]

...

Code Block
[#assign text = stkfn.abbreviateString(text, 80)]

每个绘制器的模板功能类在The templating functions classes are configured for each renderer in the 每个绘制器的模板功能类在Configuration应用的/<module>/rendering/renderers/<renderer>/contextAttributes/<tag library>下配置。注意<tag library>内容节点和name数据节点的值与脚本里呈现给方法的句法相匹配。

...