Sling Resource Merger提供存取和合併資源的服務。 它為兩者提供差異(差異)機制:
透過Sling Resource Merger,覆蓋/覆寫資源及/或屬性會與原始資源/屬性合併:
自訂定義的內容具有比原始定義更高的優先順序(即覆蓋或覆蓋)。
如有必要,在自訂中定義屬性,指出如何使用與原始內容合併的內容。
Sling Resource Merger和相關方法僅能與Granite搭配使用。 這也表示它僅適用於標準的觸控式使用者介面;尤其是,以此方式定義的覆蓋僅適用於元件的觸控式對話框。
其他區域的覆蓋/覆寫(包括可觸控元件或傳統UI的其他方面)包括將適當的節點和結構從原始節點複製到定義自訂的位置。
在AEM中使用Sling Resource Merger的目標為:
請確定未在/libs
中進行自訂變更。
減少從/libs
複製的結構。
使用Sling Resource Mergare時,不建議從/libs
複製整個結構,因為這會導致自訂中保留太多資訊(通常為/apps
)。 在以任何方式升級系統時,重複資訊會不必要地增加問題的可能性。
覆蓋不依賴於搜索路徑,它們使用屬性sling:resourceSuperType
建立連接。
不過,覆寫通常在/apps
下定義,因為AEM的最佳實務是在/apps
下定義自訂;這是因為您不得變更/libs
下的任何項目。
您必須不要變更/libs
路徑中的任何項目。
這是因為下次升級實例時會覆寫/libs
的內容(套用修補程式或功能套件時,很可能會覆寫)。
配置和其他更改的建議方法為:
在/apps
下重新建立所需項目(如/libs
中所存在)
在/apps
中進行任何更改
資源合併提供以下屬性:
sling:hideProperties
( String
或 String[]
)
指定要隱藏的屬性或屬性清單。
萬用字元*
會隱藏全部。
sling:hideResource
( Boolean
)
指出資源是否應完全隱藏,包括其子項。
sling:hideChildren
( String
或 String[]
)
包含要隱藏的子節點或子節點清單。 節點的屬性將被保留。
萬用字元*
會隱藏全部。
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
覆蓋/覆蓋中是必需的。
/apps
中建立相應的節點重新定義屬性(非自動建立的屬性)
屬性定義在/libs
中,但在/apps
覆蓋/覆寫中需要新值。
在/apps
中建立相應的節點
在此節點上建立匹配屬性(在/ apps
下)
屬性會根據Sling Resource Resolver組態有優先順序。
支援變更屬性類型。
如果您使用與/libs
中使用的屬性類型不同的屬性類型,則會使用您定義的屬性類型。
支援變更屬性類型。
重新定義自動建立的屬性
依預設,自動建立的屬性(例如jcr:primaryType
)不受覆蓋/覆寫的約束,以確保目前/libs
下的節點類型受到尊重。 若要套用覆蓋/覆寫,您必須在/apps
中重新建立節點,請明確隱藏屬性並重新定義它:
使用所需的jcr:primaryType
在/apps
下建立相應節點
在該節點上建立屬性sling:hideProperties
,其值設定為自動建立屬性的值;例如,jcr:primaryType
此屬性(定義在/apps
下)現在將優先於在/libs
下定義的屬性
重新定義節點及其子項
節點及其子項在/libs
中定義,但在/apps
覆蓋/覆蓋中需要新配置。
結合下列動作:
隱藏屬性
屬性定義在/libs
中,但在/apps
覆蓋/覆寫中不是必要的。
在/apps
中建立相應的節點
建立類型String
或String[]
的sling:hideProperties
屬性。 使用此選項可指定要隱藏/忽略的屬性。 也可使用萬用字元。 例如:
*
["*"]
jcr:title
["jcr:title", "jcr:description"]
隱藏節點及其子項
節點及其子項定義在/libs
中,但在/apps
覆蓋/覆蓋中不是必要項。
在/apps下建立對應的節點
建立屬性sling:hideResource
Boolean
true
隱藏節點的子代(同時保留節點的屬性)
節點、其屬性及其子項在/libs
中定義。 在/apps
覆蓋/覆蓋中需要節點及其屬性,但在/apps
覆蓋/覆蓋中不需要部分或全部子節點。
在/apps
下建立相應節點
建立屬性sling:hideChildren
:
String[]
/libs
中定義)通配符*可用於隱藏/忽略所有子節點。
重新排序節點
節點及其同級在/libs
中定義。 需要新位置,因此在/apps
覆蓋/覆蓋中重新建立節點,其中新位置在參考/libs
中的相應同級節點時定義。
使用sling:orderBefore
屬性:
在/apps
下建立相應節點
建立屬性sling:orderBefore
:
這指定了當前節點應放在以下位置之前的節點(如/libs
中):
String
<before-SiblingName>
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>');
其中包含一些範例: