使用HTL在Sling中应用母版页模板

时间:2018-07-30 10:55:39

标签: sling sightly htl

是否有简单的方法将页面模板应用于多个Apache Sling脚本?

我正在寻找类似于JSP 2.0 Tag选项的东西。但是,我使用的是HTL,它不支持此类标签。

我当然可以使用HTL包含项,例如data-sly-include="${'header.html'},但是必须在我随后创建的每个页面中手动包含这些内容。

理想情况下,我希望能够拥有一个包含布局的母版页,然后该母版页将自动应用于指定资源类型的所有页面,并为每个资源的特定内容保留一个可自定义区域。然后,我可以将add.htmledit.htmlhtml.html(等)文件限制为仅包含页面内容部分的代码块,从而避免不必要的布局重复跨多个文件的代码。

我认为我可以通过创建一个母版页资源(例如“页面”),然后在各个资源上设置sling:resourceSuperType来实现此目的,但是由于这是一个后备功能,因此只能使用如果sling:resourceType没有匹配的脚本-将会有这样的脚本。

2 个答案:

答案 0 :(得分:0)

您可以使用Sling Decorator来包装您的资源,以使它们始终在其他所有内容之前由通用脚本处理。这样,您可以强加模板并包括实际资源以填写实际值/块/自定义脚本。

另一种选择是强加一个(嵌套的)内容树,该树的根指向模板脚本(例如,使用JCR类型),而子级/内容指向自定​​义脚本(使用资源类型)。这几乎是AEM对cq:Page及其jcr:content所做的事情。

答案 1 :(得分:0)

我最终使用以下方法:

  1. 添加新的资源类型page
  2. page资源类型(/apps/page/html.html)创建一个Sightly / HTL模板文件;这是“主”页面模板
  3. 在该模板中包括常见元素
  4. 在该模板中,通过以下HTL元素添加view选择器来调用“子”模板:<div data-sly-resource="${request.pathInfo @ selectors='view', addSelectors=request.requestPathInfo.selectors, requestAttributes=request.requestParameterMap}">
  5. 对于要呈现为页面的每个sling:resourceType,添加一个view子文件夹(/apps/example_type/view)并将其HTL模板放置在该文件夹中(例如add.html,{ {1}})
  6. 在应使用主模板呈现的每个资源上,将html.html设置为sling:resourceSuperType

例如,向page发送请求时,Sling解析将尝试在/content/example_type_instance.add.html中查找脚本;没有,因此它会退回到/apps/example_type/add.html中的resourceSuperType脚本,而该脚本将依次使用apps/page/html.html中的脚本。

这似乎暂时有效。 @Vlad使用Sling /apps/example_type/view/add.html的方法可能更优雅。