オーバーレイ

AEM(旧称 CQ)は、以前からオーバーレイという原理を利用して、開発者がコンソールおよびその他の機能(ページオーサリングなど)を拡張し、カスタマイズできるようにしてきました。

オーバーレイは様々なコンテキストで使用される用語です。このコンテキスト(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 以下の変更に対する堅牢性が高まります。
      • 実際に必要な項目のみを再定義できます。
  • Granite 以外によるオーバーレイおよび AEM 6.0 より前のバージョンでのオーバーレイ

    • メソッド

      • 内容を/libsから/appsにコピーします。

        プロパティを含め、サブブランチ全体をコピーする必要があります。

      • 変更は /apps 以下でおこないます。

    • デメリット

      • /libsの下で変更がおこなわれても、変更内容は失われませんが、/appsの下のオーバーレイで発生した特定の変更を再作成する必要がある場合があります。
注意

Sling Resource Merger および関連する手法は、Granite と併用する場合に限り使用できます。つまり、オーバーレイをスケルトン構造で作成する方法は、標準のタッチ操作対応 UI でのみ使用できます。

他の領域(クラシック UI など)でのオーバーレイには、該当するノードとサブ構造全体をコピーして、必要な変更を加えます。

オーバーレイは、コンソールの設定サイドパネル内にあるアセットブラウザーへの選択カテゴリの作成(ページのオーサリング時に使用)など、多くの変更において推奨される方法です。オーバーレイは、次の理由で必要になります。

  • ​は、/libsブランチ​**に変更を加えないでください。
    このブランチは、次の操作を行うたびに変更される可能性が高いので、おこなった変更はすべて失われる可能性があります。

    • インスタンス上のアップグレード
    • ホットフィックスの適用
    • 機能パックのインストール
  • オーバーレイにより、変更を 1 箇所に集中させることができます。そのため、必要に応じて変更の追跡、移行、バックアップ、デバッグを実行しやすくなります。

検索パスの設定

オーバーレイの場合、配信されるリソースは、取得されたリソースとプロパティの集合体で、定義可能な以下の検索パスに応じます。

  • OSGi 設定​で Apache Sling Resource Resolver Factory 用に定義された、リソースの Resolver Search Path

    • 検索パスの順序は、上から下の順で、それぞれの優先順位を示します。
    • 標準インストールでは、主なデフォルトは/apps/libsです。そのため、/appsのコンテンツの方が/libsのコンテンツよりも優先されます(つまり、オーバーレイ)。
  • 2人のサービスユーザーは、スクリプトが格納される場所へのJCR:READアクセス権が必要です。 次のようなユーザーがいます。components-search-service(com.day.cq.wcm.coreto access/cacheコンポーネントで使用)およびsling-scripting(org.apache.sling.servlets.resolverでサーブレットを検索するために使用)。

  • 次の設定も、スクリプトを配置する場所に応じて設定する必要があります(この例では、/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/"]
    
  • 最後に、サーブレットリゾルバーも設定する必要があります(この例では/etcも追加します)。

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

使用例

以下のページで、一部の例が紹介されています。

このページ