在AEM中使用Sling Resource Merger

用途

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

  • 使 用已設定的搜尋路徑 覆蓋資源

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

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

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

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

注意

Sling Resource Merger及相關方法僅能與Granite搭配使用。 這也表示它僅適用於標準的觸控式使用者介面;尤其是,以此方式定義的覆蓋僅適用於元件的觸控式對話框。

其他區域的覆蓋/覆寫(包括可觸控元件或傳統UI的其他方面)包括將適當的節點和結構從原始節點複製到定義自訂的位置。

AEM的目標

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

  • 請確定未在/libs中進行自訂變更。

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

    使用Sling Resource Mergare時,不建議從/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)下,以等同結構重新建立原始節點。 例如:

  • 覆蓋

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

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

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

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

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

  • 覆寫

    • 「文本」(Texts)控制台的「啟用觸控」(touch-enabled)對話框的定義定義如下:

      /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 Resource Resolver組態有優先順序。

      • 支援變更屬性類型。

        如果您使用與/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>');

使用範例

其中包含一些範例:

本頁內容