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

Applying a master page template in Sling with HTL

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

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

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

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

我想我可以通过创建母版页资源(例如 "page"),然后在各个资源上设置 sling:resourceSuperType 来实现这一点,但由于这是后备,它'只有在 sling:resourceType 没有匹配的脚本时才会启动 - 并且会有这样的脚本。

您可以使用 Sling Decorator 来包装您的资源,以便它们总是先于其他所有内容由公共脚本处理。这样您就可以强加模板并包含实际资源以填充实际 values/blocks/custom 脚本。

另一种选择是强加一个(嵌套的)内容树,其中根指向模板脚本(例如使用 JCR 类型),而 children/content 指向自定义脚本(使用资源类型) .这几乎就是 AEM 对 cq:Page 及其 jcr:content.

所做的事情

我最终使用了以下方法:

  1. 添加新的资源类型page
  2. page 资源类型 (/apps/page/html.html) 创建一个 Sightly/HTL 模板文件;这是 'master' 页面模板
  3. 在该模板中包含通用元素
  4. 在该模板中,通过以下 HTL 元素添加 view 选择器来调用 'child' 模板:<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 , html.html)
  6. 在应使用主模板呈现的每个资源上,将 sling:resourceSuperType 设置为 page

例如,当请求进入 /content/example_type_instance.add.html 时,Sling 解析将因此尝试在 /apps/example_type/add.html 中查找脚本;没有,所以它退回到 apps/page/html.html 中的 resourceSuperType 脚本,后者又将使用 /apps/example_type/view/add.html.

中的脚本

这似乎暂时有效。 @Vlad 使用 Sling ResourceDecorator 的方法可能更优雅。