覆蓋

AEM(在此之前,CQ)長期以來都採用覆蓋原則,可讓您擴充及自訂console和其他功能(例如頁面編寫)。

覆蓋是可在許多內容中使用的詞語。 在此內容中(擴充AEM),覆蓋表示需取用預先定義的功能,並將您自己的定義加以保留(以自訂標準功能)。

在標準例項中,預先定義的功能保存在/libs下,建議您在/apps分支下定義覆蓋(自訂)。 AEM使用搜尋路徑來尋找資源,先搜尋/apps分支,再搜尋/libs分支(搜尋路徑可以設定)。 此機制表示您的覆蓋(以及那裡定義的自訂)將具有優先順序。

自AEM 6.0起,已變更覆蓋的實作和使用方式:

  • AEM 6.0以上 — 適用於Granite相關覆蓋(即觸控式UI)

    • 方法

      • /apps下重建相應的/libs結構。

        這不需要1:1副本,Sling Resource Merger會用來交叉參考所需的原始定義。 Sling Resource Merger通過差異(差異)機制提供存取和合併資源的服務。

      • /apps下進行任何更改。

    • 優勢

      • /libs下的變更更穩健。
      • 只重新定義實際需要的。
  • AEM 6.0之前的非Granite覆蓋圖和覆蓋圖

    • 方法

      • 將內容從/libs複製到/apps

        您需要複製整個子分支,包括屬性。

      • /apps下進行任何更改。

    • 缺點

      • 雖然在/libs下有所變更時,您的變更不會遺失,但您可能必須重新建立在/apps下覆蓋中發生的特定變更。
注意

Sling Resource Merger及相關方法只能搭配Granite使用。 這表示以骨架結構建立覆蓋圖僅適用於標準觸控式UI。

其他區域(包括傳統UI)的覆蓋涉及複製適當的節點和整個子結構,然後進行必要的變更。

覆蓋是許多變更的建議方法,例如設定主控台在側面板的資產瀏覽器中建立您的選取類別(用於製作頁面)。 這些參數為:

  • 您​不得​在/libs分支​​中進行變更
    您所做的任何變更都可能會遺失,因為只要您符合以下條件,此分支就會發生變更:

    • 在您的執行個體上升級
    • 套用hotfix
    • 安裝功能套件
  • 他們將你的變更集中在一個位置;讓您更輕鬆地視需要追蹤、移轉、備份和/或除錯變更。

配置搜索路徑

對於覆蓋,傳送的資源是所擷取資源和屬性的匯總,視可定義的搜尋路徑而定:

  • Apache Sling Resource Resolver Factory​的OSGi設定中定義的資源​解析器搜尋路徑

    • 搜尋路徑的由上而下順序會指出其各自的優先順序。
    • 在標準安裝中,主預設值為/apps, /libs — 因此/apps的內容具有比/libs更高的優先順序(即​覆蓋)。
  • 兩個服務用戶需要JCR:讀取對指令碼儲存位置的訪問。 這些使用者包括:components-search-service(由com.day.cq.wcm.coreto存取/快取元件使用)和sling-scripting(由org.apache.sling.servlets.resolver用來尋找servlet)。

  • 還必鬚根據您放置指令碼的位置配置以下配置(在本示例中,位於/etc、/libs或/apps下)。

    PID = org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl
    resource.resolver.searchpath=["/etc","/apps","/libs"]
    resource.resolver.vanitypath.whitelist=["/etc/","/apps/","/libs/","/content/"]
    
  • 最後,還必須設定Servlet解析器(在此範例中,也需新增/etc)

    PID = org.apache.sling.servlets.resolver.SlingServletResolver
    servletresolver.paths=["/bin/","/libs/","/apps/","/etc/","/system/","/index.servlet","/login.servlet","/services/"]
    

使用範例

下列情形會提供一些範例:

本頁內容