使用 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.html
、edit.html
、html.html
(等) 文件只包含页面内容部分的代码块,防止不必要的布局重复跨多个文件的代码。
我想我可以通过创建母版页资源(例如 "page"),然后在各个资源上设置 sling:resourceSuperType
来实现这一点,但由于这是后备,它'只有在 sling:resourceType
没有匹配的脚本时才会启动 - 并且会有这样的脚本。
您可以使用 Sling Decorator 来包装您的资源,以便它们总是先于其他所有内容由公共脚本处理。这样您就可以强加模板并包含实际资源以填充实际 values/blocks/custom 脚本。
另一种选择是强加一个(嵌套的)内容树,其中根指向模板脚本(例如使用 JCR 类型),而 children/content 指向自定义脚本(使用资源类型) .这几乎就是 AEM 对 cq:Page
及其 jcr:content
.
所做的事情
我最终使用了以下方法:
- 添加新的资源类型
page
- 为
page
资源类型 (/apps/page/html.html
) 创建一个 Sightly/HTL 模板文件;这是 'master' 页面模板
- 在该模板中包含通用元素
- 在该模板中,通过以下 HTL 元素添加
view
选择器来调用 'child' 模板:<div data-sly-resource="${request.pathInfo @ selectors='view', addSelectors=request.requestPathInfo.selectors, requestAttributes=request.requestParameterMap}">
- 对于每个要呈现为页面的
sling:resourceType
,添加一个 view
子文件夹 (/apps/example_type/view
) 并将其 HTL 模板放在该文件夹中(例如 add.html
, html.html
)
- 在应使用主模板呈现的每个资源上,将
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
的方法可能更优雅。
是否有任何简单的方法可以将页面模板应用于多个 Apache Sling 脚本?
我正在寻找类似于 JSP 2.0 Tag 选项的内容。但是,我使用的是 HTL,它不支持此类标签。
当然,我可以使用 HTL 包含,例如 data-sly-include="${'header.html'}
,但是这些必须手动包含在我创建的每个页面中。
理想情况下,我希望能够有一个包含布局的母版页,然后自动将其应用于指定资源类型的所有页面,为每个资源的特定内容留下一个可自定义的区域。然后我就可以限制我的 add.html
、edit.html
、html.html
(等) 文件只包含页面内容部分的代码块,防止不必要的布局重复跨多个文件的代码。
我想我可以通过创建母版页资源(例如 "page"),然后在各个资源上设置 sling:resourceSuperType
来实现这一点,但由于这是后备,它'只有在 sling:resourceType
没有匹配的脚本时才会启动 - 并且会有这样的脚本。
您可以使用 Sling Decorator 来包装您的资源,以便它们总是先于其他所有内容由公共脚本处理。这样您就可以强加模板并包含实际资源以填充实际 values/blocks/custom 脚本。
另一种选择是强加一个(嵌套的)内容树,其中根指向模板脚本(例如使用 JCR 类型),而 children/content 指向自定义脚本(使用资源类型) .这几乎就是 AEM 对 cq:Page
及其 jcr:content
.
我最终使用了以下方法:
- 添加新的资源类型
page
- 为
page
资源类型 (/apps/page/html.html
) 创建一个 Sightly/HTL 模板文件;这是 'master' 页面模板 - 在该模板中包含通用元素
- 在该模板中,通过以下 HTL 元素添加
view
选择器来调用 'child' 模板:<div data-sly-resource="${request.pathInfo @ selectors='view', addSelectors=request.requestPathInfo.selectors, requestAttributes=request.requestParameterMap}">
- 对于每个要呈现为页面的
sling:resourceType
,添加一个view
子文件夹 (/apps/example_type/view
) 并将其 HTL 模板放在该文件夹中(例如add.html
,html.html
) - 在应使用主模板呈现的每个资源上,将
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
的方法可能更优雅。