エクスペリエンスフラグメント experience-fragments
基本知識 the-basics
エクスペリエンスフラグメントは、ページ内で参照できるコンテンツおよびレイアウトを含む 1 つ以上のコンポーネントのグループです。
プライマリまたはバリアントのエクスペリエンスフラグメント(またはその両方)では、次の要素が使用されます。
sling:resourceType:/libs/cq/experience-fragments/components/xfpage
/libs/cq/experience-fragments/components/xfpage/xfpage.htmlがないので、次の状態に戻ります。
sling:resourceSuperType:wcm/foundation/components/page
プレーンなHTML レンディション the-plain-html-rendition
URL で .plain. セレクターを使用すると、プレーン HTML レンディションにアクセスできます。
この機能は、ブラウザーから利用できます。 ただし、その主な目的は、他のアプリケーション(例えば、サードパーティ web アプリ、カスタムモバイル実装など)が、URL のみを使用して、エクスペリエンスフラグメントのコンテンツに直接アクセスできるようにすることです。
プレーン HTML レンディションは、次のようなパスにプロトコル、ホストおよびコンテキストパスを追加します。
-
タイプが
src、href、actionのいずれか -
または、
-srcか-hrefで終わる
次に例を示します。
.../brooklyn-coat/master.plain.html
プレーンレンディションセレクターは、追加のスクリプトではなくトランスフォーマを使用します。Sling Rewriterはトランスフォーマとして使用され、次のように設定されます。
/libs/experience-fragments/config/rewriter/experiencefragments
HTML レンディション生成の設定 configuring-html-rendition-generation
HTML レンディションは、Sling Rewriter パイプラインを使用して生成されます。 パイプラインは、/libs/experience-fragments/config/rewriter/experiencefragments で定義されます。 HTML 変換サービスでは、次のオプションをサポートしています。
-
allowedCssClasses- 最終レンディションに残す CSS クラスに一致する正規表現。
- 顧客が特定のCSS クラスを削除したい場合に便利です
-
allowedTags- 最終的なレンディションで許可される HTML タグのリスト。
- デフォルトでは、html、head、title、body、img、p、span、ul、li、a、b、i、em、strong、h1、h2、h3、h4、h5、h6、br、
noscript、div、link、scriptの設定なしで次のタグを使用できます。
オーバーレイを使用してリライターを設定することをお勧めします。 オーバーレイを参照してください
ソーシャルバリエーション social-variations
ソーシャルバリエーションをソーシャルメディア(テキストおよび画像)に投稿できます。 Adobe Experience Manager(AEM)では、これらのソーシャルバリエーションに、テキストコンポーネントや画像コンポーネントなどのコンポーネントを含めることができます。
ソーシャル投稿の画像とテキストは、任意の画像またはテキストリソースタイプから、任意の深さで取得できます。 リソースは、ビルディングブロックまたはレイアウトコンテナのいずれかから取得できます。
ソーシャルバリエーションを使用すると、ビルディングブロックを作成し、(パブリッシュ環境で)ソーシャルアクションを行う際にそれらを考慮に入れることもできます。
的確なテキストと画像をソーシャルメディアネットワークに投稿するには、カスタマイズした独自のコンポーネントを開発する場合、いくつかの規則に従う必要があります。
次のプロパティを使用する必要があります。
-
画像を抽出するには,
fileReferencefileName
-
テキストを抽出するには,
text
この規則を使用するコンポーネントのみが考慮されます。
エクスペリエンスフラグメントのテンプレート templates-for-experience-fragments
エクスペリエンスフラグメントの新しいテンプレートを開発する際は、編集可能なテンプレートの標準的な手法に従うことができます。
エクスペリエンスフラグメントの作成 ウィザードで検出されるエクスペリエンスフラグメントテンプレートを作成するには、次のいずれかのルールセットに従う必要があります。
-
次の両方:
-
テンプレート(初期ノード)のリソースタイプは、次のものから継承する必要があります。
cq/experience-fragments/components/xfpage -
テンプレートの名前は次の文字列で始まる必要があります。
experience-fragments
このフォルダーのcq:allowedTemplatesプロパティには、experience-fragmentで始まる名前を持つすべてのテンプレートが含まれているため、ユーザーは/content/experience-fragmentsでエクスペリエンスフラグメントを作成できます。 ユーザーは、このプロパティを更新して、独自の命名方式やテンプレート場所を取り入れることができます。
-
-
使用可能なテンプレートはエクスペリエンスフラグメントコンソールで設定できます。
エクスペリエンスフラグメントのコンポーネント components-for-experience-fragments
エクスペリエンスフラグメントで使用するコンポーネントの開発は、標準的な方法に従って行います。
唯一の追加設定は、コンポーネントをテンプレートで確実に使用できるようにするだけです。 この機能は、 コンテンツポリシーで実現されます。
エクスペリエンスフラグメントの Link Rewriter Provider - HTML the-experience-fragment-link-rewriter-provider-html
AEM では、エクスペリエンスフラグメントを作成できます。 エクスペリエンスフラグメントは、
- コンポーネントグループとレイアウトで構成されます。
- AEM ページとは独立して存在できます。
このようなグループのユースケースの 1 つは、Adobe Target などのサードパーティのタッチポイントにコンテンツを埋め込む場合です。
デフォルトのリンク書き換え default-link-rewriting
Target にエクスポート機能を使用すると、次の操作が可能です。
- エクスペリエンスフラグメントを作成する
- エクスペリエンスフラグメントにコンポーネントを追加する
- エクスペリエンスフラグメントを HTML 形式または JSON 形式で Adobe Target オファーとして書き出す
この機能は、AEM のオーサーインスタンスで有効にすることができます。 有効な Adobe Target 設定と、Link Externalizer の設定が必要です。
Link Externalizer は、Target オファーの HTML バージョンを作成する際に必要な正しい URL を決定するために使用します。オファーは、その後 Adobe Target に送信されます。 Adobe Targetでは、Target HTML オファーのすべてのリンクに対するパブリックアクセスが必要です。 エクスペリエンスフラグメントと、リンクが参照するリソースを使用する前に公開します。
デフォルトでは、Target HTML オファーを作成すると、AEM のカスタム Sling セレクターにリクエストが送信されます。 このセレクターの名前は .nocloudconfigs.html です。 これはエクスペリエンスフラグメントのプレーン HTML レンダリングを作成しますが、その名前が示すとおり、クラウド設定を含んでいません(クラウド設定は余分な情報です)。
HTML ページを生成した後、Sling Rewriter パイプラインは出力に変更を加えます。
-
html、head、bodyの各要素がdiv要素に置き換わります。meta、noscriptおよびtitle要素は削除されます(これらは元のhead要素の子要素であり、div要素に置き換えられたときに考慮されません)。このような処理が行われるのは、HTML Target オファーを Target アクティビティに確実に含めることができるようにするためです。
-
AEM では、HTML に存在するすべての内部リンクを変更して、公開されたリソースを指すようにします。
変更するリンクを決定するために、AEM では HTML 要素の次の属性パターンに従います。
src属性href属性*-src属性(data-src、custom-src など)*-href属性(data-href、custom-href、img-hrefなど)
note note NOTE 通常、HTML 内の内部リンクは相対リンクですが、カスタムコンポーネントの HTML で完全な URL が指定されている場合もあります。 デフォルトでは、AEM はこれらの完全な URL を無視し、変更しません。 これらの属性のリンクは、公開されたインスタンス上にあるかのように、公開されたインスタンス上にあるかのようにURLを再作成するために、AEM Link Externalizer
publishLink()を通過します。
すぐに使用できる実装を使用する場合、上記のプロセスは、エクスペリエンスフラグメントからTarget オファーを生成し、それをAdobe Targetに書き出すのに十分です。 ただし、このプロセスで考慮されていないユースケースには、次のようなものがあります。
- Sling マッピングは、公開インスタンスでのみ使用できます。
- Dispatcher リダイレクト。
これらのユースケースのために、AEM には Link Rewriter Provider インターフェイスが用意されています。
リンク書き換えプロバイダーインターフェイス link-rewriter-provider-interface
(デフォルトのリンク書き換えでは対応していない)より複雑な場合のために、AEM では Link Rewriter Provider フェイスを提供しています。 このワークフローは、バンドルにサービスとして実装できるConsumerType インターフェイスです。 このインターフェイスは、エクスペリエンスフラグメントからレンダリングされる HTML オファーの内部リンクに対して AEM で実行される変更をバイパスします。 このインターフェイスを使用すると、内部 HTML リンクの書き換えプロセスをビジネスニーズに合わせてカスタマイズできます。
このインターフェイスをサービスとして実装する使用例としては、例えば次のものがあります。
- Sling マッピングは、パブリッシュインスタンスでは有効になっていますが、オーサーインスタンスでは有効になっていません。
- Dispatcherなどのテクノロジーを使用して、URLを社内でリダイレクトします。
- リソースに対するメカニズムが
sling:alias個あります。
Link Rewriter Provider インターフェイス(ExperienceFragmentLinkRewriterProvider)は次のとおりです。
public interface ExperienceFragmentLinkRewriterProvider {
String rewriteLink(String link, String tag, String attribute);
boolean shouldRewrite(ExperienceFragmentVariation experienceFragment);
int getPriority();
}
Link Rewriter プロバイダーインターフェイスの使用方法 how-to-use-the-link-rewriter-provider-interface
このインターフェイスを使用するには、まず、リンク書き換えプロバイダーインターフェイスを実装する新しいサービスコンポーネントを含むバンドルを作成する必要があります。
このサービスは、様々なリンクにアクセスできるように、エクスペリエンスフラグメントの「Target に書き出し」機能でのリンク書き換えにプラグインするために使用します。
例えば、ComponentService の場合は次のようになります。
import com.adobe.cq.xf.ExperienceFragmentLinkRewriterProvider;
import com.adobe.cq.xf.ExperienceFragmentVariation;
import org.osgi.service.component.annotations.Service;
import org.osgi.service.component.annotations.Component;
@Component
@Service
public class GeneralLinkRewriter implements ExperienceFragmentLinkRewriterProvider {
@Override
public String rewriteLink(String link, String tag, String attribute) {
return null;
}
@Override
public boolean shouldRewrite(ExperienceFragmentVariation experienceFragment) {
return false;
}
@Override
public int getPriority() {
return 0;
}
}
このサービスが機能するには、次の 3 つのメソッドをサービス内に実装する必要があります。
-
[shouldRewrite](#shouldrewrite) -
[rewriteLink](#rewritelink)rewriteLinkExample2
-
[getPriority](#priorities-getpriority)
shouldRewrite shouldrewrite
エクスペリエンスフラグメントの特定のバリエーションに対して「Adobe Target に書き出し」機能が呼び出された場合に、リンクを書き換える必要があるかどうかをシステムに指定する必要があります。 この 実装 は、次のメソッドを使用して実行できます。
shouldRewrite(ExperienceFragmentVariation experienceFragment);
例:
@Override
public boolean shouldRewrite(ExperienceFragmentVariation experienceFragment) {
return experienceFragment.getPath().equals("/content/experience-fragment/master");
}
このメソッドは、現在「Adobe Target に書き出し」システムによる書き換えの対象となっているエクスペリエンスフラグメントバリエーションをパラメーターとして受け取ります。
上記の例では、次のように書き換えます。
-
srcに指定されているリンク -
href属性のみ -
特定のエクスペリエンスフラグメントの場合:
/content/experience-fragment/master
「ターゲットに書き出し」システムは、そのシステムを通過する他のエクスペリエンスフラグメントを無視し、このサービスはそれらを影響しません。
rewriteLink rewritelink
書き換えプロセスの影響を受けるエクスペリエンスフラグメントのバリエーションでは、サービスにリンクの書き換えを処理させます。 内部 HTML でリンクが検出されるたびに、次のメソッドが呼び出されます。
rewriteLink(String link, String tag, String attribute)
このメソッドは入力として次のパラメーターを受け取ります。
-
link:
処理中のリンクのString表現です。 通常、オーサーインスタンス内のリソースを指す相対URL。 -
tag:
処理中の HTML 要素の名前です。 -
attribute
正確な属性名です。
例えば、Target システムに書き出しがこの要素を処理している場合は、CSSInclude を次のように定義できます。
<link rel="stylesheet" href="/etc.clientlibs/foundation/clientlibs/main.css" type="text/css">
rewriteLink() メソッドの呼び出しは、次のパラメーターを使用して行います。
rewriteLink(link="/etc.clientlibs/foundation/clientlibs/main.css", tag="link", attribute="href" )
サービスを作成する際は、指定された入力に基づいて判断し、それに応じてリンクを書き換えることができます。
例えば、URLの/etc.clientlibs部分を削除し、適切な外部ドメインを追加します。 話を簡単にするために、rewriteLinkExample2 に示すように、サービスのリソースリゾルバーにアクセスできるとします。
private ResourceResolver resolver;
private Externalizer externalizer;
@Override
public String rewriteLink(String link, String tag, String attribute) {
// get the externalizer service
externalizer = resolver.adaptTo(Externalizer.class);
if(externalizer == null) {
// if there was an error, then we do not modify the link
return null;
}
// remove leading /etc.clientlibs from resource link before externalizing
link = link.replaceAll("/etc.clientlibs", "");
// considering that we configured our publish domain, we directly apply the publishLink() method
link = externalizer.publishLink(resolver, link);
return link;
}
null を返した場合、Target システムに書き出しは、リンクをそのままの状態(リソースへの相対リンク)にしておきます。優先度 - getPriority priorities-getpriority
さまざまなタイプのエクスペリエンスフラグメントをサポートするには、いくつかのサービスが必要になる場合があります。 また、汎用サービスを使用して、すべてのエクスペリエンスフラグメントを外部化し、マッピングすることもできます。 このような場合、使用するサービスに関するの競合が発生する可能性があるので、AEM では、様々なサービスの 優先度 を定義できるようになっています。 優先度は、次のメソッドを使用して指定します。
getPriority()
このメソッドを使用すると、複数のサービスを使用しても、同じエクスペリエンスフラグメントについては shouldRewrite() メソッドが true を返すようにすることができます。 getPriority() メソッドから最高の優先度が返されるサービスが、対象となっているエクスペリエンスフラグメントバリエーションを処理するサービスになります。
例えば、エクスペリエンスフラグメントのすべてのバリエーションについて shouldRewrite() メソッドが true を返す場合にすべてのエクスペリエンスフラグメントの基本マッピングを処理する GenericLinkRewriterProvider を用意することができます。 一部の特定のエクスペリエンスフラグメントについては、特別な処理が必要になる場合があります。その場合は、一部のエクスペリエンスフラグメントバリエーションについてのみ shouldRewrite() メソッドが true を返すような SpecificLinkRewriterProvider を用意することができます。 それらのエクスペリエンスフラグメントバリエーションを処理するために SpecificLinkRewriterProvider が必ず選択されるようにするには、そのプロバイダーの getPriority() メソッドで返される優先度が GenericLinkRewriterProvider. の場合より高くなるようにする必要があります。