在AEM中使用Sling资源合并器 using-the-sling-resource-merger-in-aem

用途 purpose

Sling资源合并器提供访问和合并资源的服务。 它提供了以下两种情况的差异(差异)机制:

  • 使用​ 配置的搜索路径 ​进行的资源叠加

  • 使用资源类型层次结构(通过属性​)为启用了Touch的UI ()覆盖cq:dialog组件对话框sling:resourceSuperType

Sling资源合并器将叠加和覆盖资源(及其属性)与原始资源和属性相结合:

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

  • 根据需要,自定义项中定义的属性指示如何使用从原始内容合并的内容。

CAUTION
Sling资源合并器和相关方法只能与Granite一起使用。 此情况还意味着该覆盖仅适用于标准的触屏优化UI,尤其是以这种方式定义的覆盖仅适用于组件的触屏优化对话框。
要叠加或覆盖其他区域(包括触控式组件或经典UI的其他部分),请从原始节点复制相应的节点和结构。 将副本放置在定义自定义的位置。

AEM的目标 goals-for-aem

在AEM中使用Sling资源合并器的目标如下:

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

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

    在使用Sling资源合并器时,不建议从/libs中复制整个结构。 原因是它会导致自定义项中包含过多信息(通常为/apps)。 在系统升级时,不必要地复制信息会增加出现问题的机会。

NOTE
覆盖不依赖于搜索路径。 他们使用属性sling:resourceSuperType建立连接。
但是,覆盖通常在/apps下定义,因为AEM中的最佳实践是在/apps下定义自定义项。 原因是您不能更改/libs下的任何内容。
CAUTION
不要​更改/libs路径中的任何内容。
原因在于,下次升级实例时,/libs的内容会被覆盖。 并且,当您应用修补程序或功能包时,它可能会被覆盖。
建议用于配置和其他更改的方法是:
  1. /libs下重新创建所需项(即/apps中存在的项)

  2. /apps中进行任何更改

属性 properties

资源合并器提供以下属性:

  • sling:hidePropertiesStringString[]

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

    通配符*会隐藏所有。

  • sling:hideResource ( Boolean)

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

  • sling:hideChildrenStringString[]

    它包含要隐藏的子节点或子节点列表。 节点的属性将得到维护。

    通配符*会隐藏所有。

  • sling:orderBefore ( String)

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

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

创建结构 creating-the-structure

要创建覆盖或覆盖,您需要在目标(通常为/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
NOTE
在使用Sling资源合并器(即,处理标准的触屏UI时)时,不建议从/libs复制整个结构。 原因是这将导致过多信息保存在/apps中。 因此,它可能会导致系统升级时出现问题。

用例 use-cases

通过标准功能,这些用例可让您执行以下操作:

  • 添加属性

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

    1. /apps中创建对应的节点
    2. 在此节点上创建新属性»
  • 重新定义属性(不是自动创建的属性)

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

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

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

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

      • 支持更改属性类型。

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

    note note
    NOTE
    支持更改属性类型。
  • 重新定义自动创建的属性

    默认情况下,自动创建的属性(如jcr:primaryType)不受覆盖/覆盖的约束,以确保当前位于/libs下的节点类型得到遵守。 要强制覆盖/覆盖,您必须在/apps中重新创建节点,明确隐藏属性并重新定义它:

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

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

      此属性在/apps下定义,其优先级现在高于/libs下定义的属性

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

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

    1. 合并以下各项的操作:

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

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

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

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

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

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

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

    2. 创建属性sling:hideResource

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

    /libs中定义了节点、其属性及其子节点。 /apps覆盖/覆盖中需要节点及其属性,但在/apps覆盖/覆盖中不需要部分或全部子节点。

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

    2. 创建属性sling:hideChildren

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

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

  • 重新排序节点

    节点及其同级在/libs中定义。 要更改顺序,请在/apps覆盖或覆盖中重新创建节点。 通过引用/libs中的相应同级节点来定义其新位置。

    • 使用sling:orderBefore属性:

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

      2. 创建属性sling:orderBefore

        指定当前节点位于之前的节点(如/libs中所示):

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

从您的代码调用Sling资源合并器 invoking-the-sling-resource-merger-from-your-code

Sling资源合并器包含两个自定义资源提供程序 — 一个用于叠加,另一个用于覆盖。 可以在代码中使用挂载点调用每个ID:

NOTE
在访问资源时,建议使用适当的挂载点。
此方法将调用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>');

使用示例 example-of-usage

下面介绍一些示例:

recommendation-more-help
51c6a92d-a39d-46d7-8e3e-2db9a31c06a2