0

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

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

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

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

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

4

2 回答 2

0

您可以使用Sling 装饰器来包装您的资源,以便它们始终由公共脚本处理,然后再处理其他任何事情。这样,您可以强加模板并包含实际资源以填充实际值/块/自定义脚本。

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

于 2018-07-30T11:06:53.593 回答
0

我最终使用了以下方法:

  1. 添加新的资源类型page
  2. page为资源类型( )创建一个 Sightly/HTL 模板文件/apps/page/html.html;这是“主”页面模板
  3. 在该模板中包含通用元素
  4. 在该模板中,view通过以下 HTL 元素添加选择器来调用“子”模板:<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:resourceSuperTypepage

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

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

于 2018-08-24T14:21:42.320 回答