在 AEM as a Cloud Service 中使用 Sling Resource Merger

用途

Sling Resource Merger提供存取和合併資源的服務。 它為以下兩者提供差異(差異)機制:

  • 🔗 使用搜尋路徑覆 蓋資源

  • ​使用資源類型階層(透過屬性)覆寫觸控式UI(cq:dialog)的元件對話 sling:resourceSuperType方塊。

透過Sling Resource Merger,覆蓋/覆寫資源和/或屬性會與原始資源/屬性合併:

  • 自訂定義的內容具有比原始定義更高的優先順序(即​覆蓋​或​覆蓋)。

  • 如有必要,在自訂中定義的屬性會指出如何使用從原始合併的內容。

注意

Sling Resource Merger及相關方法只能搭配觸控式UI使用(這是AEM as a Cloud Service唯一可用的UI)。

AEM的目標

在AEM中使用Sling Resource Merger的目標為:

  • 確保未在/libs中進行自定義更改。

  • 減少從/libs複製的結構。

    使用Sling Resource Merger時,不建議從/libs複製整個結構,因為這會導致自訂中保留太多資訊(通常為/apps)。 以任何方式升級系統時,重複資訊會不必要地增加出現問題的機會。

注意

您​必須​不要變更/libs路徑中的任何項目。

這是因為每當將升級應用到您的實例時,/libs的內容都可能被覆蓋。

  • 覆蓋圖取決於搜尋路徑

  • 覆蓋不依賴於搜索路徑,它們使用屬性sling:resourceSuperType建立連接。

不過,覆寫通常定義在/apps下,因為在AEM as aCloud Service中,最佳作法是在/apps下定義自訂;這是因為您不得變更/libs下的任何項目。

屬性

資源合併提供以下屬性:

  • sling:hideProperties ( StringString[])

    指定要隱藏的屬性或屬性清單。

    萬用字元*會隱藏全部。

  • sling:hideResource ( Boolean)

    指出是否應完全隱藏資源,包括其子項。

  • sling:hideChildren ( StringString[])

    包含要隱藏的子節點或子節點清單。 節點的屬性將會保留。

    萬用字元*會隱藏全部。

  • sling:orderBefore ( String)

    包含當前節點應位於前面的同級節點的名稱。

這些屬性會影響覆蓋/覆寫(通常在/apps中)使用對應/原始資源/屬性的方式(來自/libs)。

建立結構

若要建立覆蓋或覆寫,您必須在目的地(通常為/apps)下,以等同的結構重新建立原始節點。 例如:

  • 覆蓋

    • 如邊欄中所示,Sites主控台的導覽項目定義如下:

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

    • 若要覆蓋,請建立下列節點:

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

      然後視需要更新屬性jcr:title

  • 覆寫

    • Texts控制台的觸控式對話方塊的定義,定義於:

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

    • 若要覆寫此值,請建立下列節點,例如:

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

要建立其中任一項,您只需重新建立骨架結構。 為了簡化結構的重建,所有中間節點都可以是nt:unstructured類型(它們不必反映原始節點類型;例如,在/libs中。

因此,在上述覆蓋範例中,需要下列節點:

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

使用Sling Resource Merger時(即處理標準的觸控式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
      • 值: 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 Resource Merger

Sling Resource Merger包含兩個自訂資源提供者:一個用於覆蓋,另一個用於覆寫。 您可以使用裝載點在您的代碼中叫用其中的每一項:

注意

訪問資源時,建議使用適當的裝載點。

這可確保叫用Sling Resource Merger並傳回完全合併的資源(減少需要從/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>');

本頁內容