在AEM中使用Sling资源合并

用途

Sling Resource Merager提供访问和合并资源的服务。 它为以下两者提供差异(差异)机制:

  • 使 用配置的搜索路 径覆盖资源

  • 使 用资源类型层次结构(通cq:dialog过属性)覆盖触屏优化UI的组件对话框 sling:resourceSuperType

在Sling Resource Merabire中,叠加/覆盖资源和/或属性与原始资源/属性合并:

  • 自定义定义的内容具有比原始定义更高的优先级(即,它​叠加​或​覆盖​它)。

  • 在必要时,在自定义中定义属性,指示如何使用与原始内容合并的内容。

注意

Sling Resource Merage及相关方法只能与Granite一起使用。 这也意味着它仅适用于标准的触屏优化UI;尤其是,以这种方式定义的重写仅适用于组件的触屏启用对话框。

其他区域(包括触屏优化组件或经典UI的其他方面)的叠加/覆盖涉及将相应的节点和结构从原始节点复制到定义自定义的位置。

AEM的目标

在AEM中使用Sling Resource合并的目标是:

  • 确保未在/libs中进行自定义更改。

  • 减少从/libs复制的结构。

    使用Sling Resource Merage时,不建议从/libs复制整个结构,因为这会导致在自定义中保留过多信息(通常为/apps)。 在以任何方式升级系统时,重复信息会不必要地增加出现问题的可能性。

注意

覆盖不取决于搜索路径,它们使用属性sling:resourceSuperType建立连接。

但是,覆盖通常在/apps下定义,因为AEM的最佳实践是在/apps下定义自定义;这是因为您不得更改/libs下的任何内容。

注意

您​必须​不要更改/libs路径中的任何内容。

这是因为下次升级实例时,/libs的内容会被覆盖(当您应用修补程序或功能包时,很可能会被覆盖)。

建议的配置和其他更改方法是:

  1. /apps下重新创建所需项(即,它存在于/libs中)

  2. /apps中进行任何更改

属性

资源合并提供以下属性:

  • sling:hideProperties ( StringString[])

    指定要隐藏的属性或属性列表。

    通配符*将隐藏全部。

  • sling:hideResource ( Boolean)

    指示资源是否应完全隐藏,包括其子项。

  • sling:hideChildren ( StringString[])

    包含要隐藏的子节点或子节点的列表。 将保留节点的属性。

    通配符*将隐藏全部。

  • sling:orderBefore ( String)

    包含当前节点应位于的前面的同级节点的名称。

这些属性影响叠加/覆盖(通常在/apps中)使用相应/原始资源/属性(来自/libs)的方式。

创建结构

要创建叠加或覆盖,您需要在目标(通常为/apps)下重新创建具有等效结构的原始节点。 例如:

  • 叠加

    • 如边栏中所示,“站点”控制台的导航条目定义在以下位置:

      /libs/cq/core/content/nav/sites/jcr:title

    • 要覆盖此节点,请创建以下节点:

      /apps/cq/core/content/nav/sites

      然后根据需要更新属性jcr:title

  • 覆盖

    • 文本控制台的触屏启用对话框的定义在以下位置进行定义:

      /libs/foundation/components/text/cq:dialog

    • 要覆盖此节点,请创建以下节点——例如:

      /apps/the-project/components/text/cq:dialog

要创建其中任何一个,您只需重新创建骨架结构。 为了简化结构的重建,所有中间节点可以是nt:unstructured类型(它们不必反映原始节点类型;例如,在/libs中。

因此,在上面的叠加示例中,需要以下节点:

/apps
  /cq
    /core
      /content
        /nav
          /sites
注意

使用Sling资源合并(即处理标准的触屏优化UI时)时,不建议从/libs复制整个结构,因为这会导致在/apps中保留过多信息。 这可能在系统以任何方式升级时导致问题。

用例

这些功能与标准功能相结合,使您能够:

  • 添加属性

    该属性在/libs定义中不存在,但在/apps叠加/覆盖中是必需的。

    1. /apps中创建相应的节点
    2. 在此节点“”上创建新属性
  • 重定义属性(非自动创建的属性)

    属性在/libs中定义,但在/apps叠加/覆盖中需要一个新值。

    1. /apps中创建相应的节点

    2. 在此节点上创建匹配属性(在/ apps下)

      • 该属性将基于Sling资源解析程序配置具有优先级。

      • 支持更改属性类型。

        如果使用的属性类型与/libs中使用的属性类型不同,则将使用您定义的属性类型。

    注意

    支持更改属性类型。

  • 重新定义自动创建的属性

    默认情况下,自动创建的属性(如jcr:primaryType)不受叠加/覆盖的约束,以确保当前位于/libs下的节点类型受到尊重。 要实施叠加/覆盖,您必须在/apps中重新创建节点,显式隐藏该属性并重新定义它:

    1. 使用所需的jcr:primaryType/apps下创建相应的节点

    2. 在该节点上创建属性sling:hideProperties,并将值设置为自动创建属性的属性;例如jcr:primaryType

      此属性(定义在/apps下)现在优先于在/libs下定义的属性

  • 重新定义节点及其子节点

    节点及其子项在/libs中定义,但在/apps叠加/覆盖中需要新配置。

    1. 组合下列操作:

      1. 隐藏节点的子项(保留节点的属性)
      2. 重定义属性/属性
  • 隐藏属性

    属性在/libs中定义,但在/apps叠加/覆盖中则不需要。

    1. /apps中创建相应的节点

    2. 创建StringString[]类型的sling:hideProperties属性。 使用它指定要隐藏/忽略的属性。 也可以使用通配符。 例如:

      • *
      • ["*"]
      • jcr:title
      • ["jcr:title", "jcr:description"]
  • 隐藏节点及其子节点

    节点及其子项在/libs中定义,但在/apps叠加/覆盖中则不是必需的。

    1. 在/apps下创建相应节点

    2. 创建属性sling:hideResource

      • 类型: Boolean
      • value: true
  • 隐藏节点的子项(同时保留节点的属性)

    节点、其属性及其子项在/libs中定义。 在/apps叠加/覆盖中,节点及其属性是必需的,但在/apps叠加/覆盖中,部分或所有子节点不是必需的。

    1. /apps下创建相应的节点

    2. 创建属性sling:hideChildren:

      • 类型: String[]
      • value:要隐藏/忽略的子节点列表(如/libs中定义)

      通配符*可用于隐藏/忽略所有子节点。

  • 对节点重新排序

    节点及其同级在/libs中定义。 需要新位置,因此在/apps叠加/覆盖中重新创建节点,其中新位置在引用/libs中的相应同级节点时定义。

    • 使用sling:orderBefore属性:

      1. /apps下创建相应的节点

      2. 创建属性sling:orderBefore:

        这指定了当前节点应该位于以下位置之前的节点(如/libs中所示):

        • 类型: String
        • value:<before-SiblingName>

从代码调用Sling资源合并

Sling Resource Merager包括两个自定义资源提供商——一个用于叠加,另一个用于覆盖。 可以通过使用装载点在代码中调用其中的每一个:

注意

访问资源时,建议使用相应的装载点。

这可确保调用Sling资源合并并返回完全合并的资源(减少需要从/libs复制的结构)。

  • 叠加:

    • 目的:根据资源的搜索路径合并资源

    • 装载点:/mnt/overlay

    • 用法:mount point + relative path

    • 示例:

      • getResource('/mnt/overlay' + '<relative-path-to-resource>');
  • 覆盖:

    • 目的:根据超类型合并资源

    • 装载点:/mnt/overide

    • 用法:mount point + absolute path

    • 示例:

      • getResource('/mnt/override' + '<absolute-path-to-resource>');

用法示例

介绍了一些示例:

On this page

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now