在AEM中使用Sling Resource Merger using-the-sling-resource-merger-in-aem
用途 purpose
Sling Resource Merger提供存取及合併資源的服務。 它為兩者提供不同(差異)機制:
Sling Resource Merger將覆蓋和覆寫資源(及其屬性)與原始資源和屬性結合在一起:
-
自訂定義的內容優先順序高於原始定義。 也就是說,它 覆蓋 或覆寫。
-
必要時,自訂中定義的屬性會指示如何使用從原始內容合併的內容。
AEM的目標 goals-for-aem
在AEM中使用Sling Resource Merger的目標為:
-
請確定未在
/libs中進行自訂變更。 -
減少從
/libs復寫的結構。使用Sling Resource Merger時,不建議從
/libs複製整個結構。 原因是因為這會造成太多資訊保留在自訂中(通常是/apps)。 系統升級時,不必要地複製資訊會增加發生問題的機率。
sling:resourceSuperType來建立連線。/apps下,因為AEM的最佳實務是定義/apps下的自訂。 原因是因為您不得變更/libs下的任何專案。/libs路徑中的任何專案。/libs的內容會被覆寫。 此外,當您套用Hotfix或Feature Pack時,也可能會被覆寫。-
在
/libs下重新建立必要專案(亦即,它存在於/apps中) -
在
/apps中進行任何變更
屬性 properties
資源合併器提供下列屬性:
-
sling:hideProperties(String或String[])指定要隱藏的屬性或屬性清單。
萬用字元
*會隱藏所有。 -
sling:hideResource(Boolean)它指出資源是否完全隱藏,包括其子項。
-
sling:hideChildren(String或String[])它包含要隱藏的子節點或子節點清單。 會維護節點的屬性。
萬用字元
*會隱藏所有。 -
sling:orderBefore(String)它包含目前節點位於前面的同層級節點的名稱。
這些屬性會影響覆蓋/覆寫(通常在/libs中)使用對應/原始資源/屬性(來自/apps)的方式。
建立結構 creating-the-structure
若要建立覆蓋或覆寫,您需要在目的地(通常為/apps)下以同等結構重新建立原始節點。 例如:
-
覆蓋
-
Sites主控台之導覽專案的定義(如邊欄中所示)定義於:
/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
/libs複製整個結構。 原因是因為這會造成太多資訊保留在/apps中。 因此,在系統升級時可能會造成問題。使用案例 use-cases
透過標準功能,這些使用案例可讓您進行下列工作:
-
新增屬性
屬性不存在於
/libs定義中,但在/apps覆蓋/覆寫中是必要的。- 在
/apps中建立對應的節點 - 在此節點上建立新屬性»
- 在
-
重新定義屬性(不是自動建立的屬性)
屬性已在
/libs中定義,但在/apps覆蓋/覆寫中需要新值。-
在
/apps中建立對應的節點 -
在此節點上建立相符的屬性(在
apps下)-
根據Sling Resource Resolver設定,屬性的優先順序為。
-
支援變更屬性型別。
如果您使用的屬性型別與
/libs中使用的屬性型別不同,則會使用您定義的屬性型別。
-
note note NOTE 支援變更屬性型別。 -
-
重新定義自動建立的屬性
依預設,自動建立的屬性(例如
jcr:primaryType)不受覆蓋/覆寫約束,以確保目前在/libs之下的節點型別受到遵守。 若要強制覆蓋/覆寫,您必須在/apps中重新建立節點,明確隱藏屬性並重新定義它:-
使用所需的
/apps在jcr:primaryType下建立對應的節點 -
在該節點上建立屬性
sling:hideProperties,其值設為自動建立屬性的值;例如jcr:primaryType這個在
/apps下定義的屬性現在優先於/libs下定義的屬性
-
-
重新定義節點及其子系
節點及其子系已在
/libs中定義,但在/apps覆蓋/覆寫中需要新設定。-
結合下列動作:
- 隱藏節點的子系(保留節點的屬性)
- 重新定義屬性/屬性
-
-
隱藏屬性
屬性已在
/libs中定義,但在/apps覆蓋/覆寫中並非必要。-
在
/apps中建立對應的節點 -
建立型別
sling:hideProperties或String的屬性String[]。 用於指定要隱藏/忽略的屬性。 也可以使用萬用字元。 例如:*["*"]jcr:title["jcr:title", "jcr:description"]
-
-
隱藏節點及其子系
節點及其子系已在
/libs中定義,但在/apps覆蓋/覆寫中並非必要。-
在
/apps下建立對應的節點 -
建立屬性
sling:hideResource- 型別:
Boolean - 值:
true
- 型別:
-
-
隱藏節點的子系(同時保留節點的屬性)
在
/libs中定義節點、其屬性及其子系。/apps覆蓋/覆寫中需要節點及其屬性,但/apps覆蓋/覆寫中不需要部分或全部子節點。-
在
/apps下建立對應的節點 -
建立屬性
sling:hideChildren:- 型別:
String[] - 值:要隱藏/忽略的子節點清單(如
/libs中所定義)
萬用字元&;ast;可用來隱藏或忽略所有子節點。
- 型別:
-
-
重新排序節點
節點及其同層級已在
/libs中定義。 若要變更順序,請在/apps覆蓋或覆寫中重新建立節點。 參考/libs中適當的同層級節點,以定義其新位置。-
使用
sling:orderBefore屬性:-
在
/apps下建立對應的節點 -
建立屬性
sling:orderBefore:指定目前節點所在位置的節點(如
/libs所示):- 型別:
String - 值:
<before-SiblingName>
- 型別:
-
-
從您的程式碼叫用Sling Resource Merger invoking-the-sling-resource-merger-from-your-code
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>');
-
使用範例 example-of-usage
本文包含一些範例: