現在表示中:

注意:

コンテンツフラグメントの更新とコンテンツサービス - 機能パックリリースノートも参照してください。

この機能パックのセットは、コンテンツフラグメント、JSON エクスポーターおよびコアコンポーネントの更新を提供します。

これらにより、フラグメントの構造化コンテンツを定義できます。更新された JSON エクスポーターと共にこの構造化コンテンツを使用して、AEM コンテンツをコンテンツサービス経由で AEM ページ以外のチャネルに配信できます。

コンテンツフラグメントは、標準アセットを拡張します。

アーキテクチャ

コンテンツフラグメントの基本的な構成要素は次のとおりです。

  • コンテンツフラグメント
  • コンテンツフラグメントを構成する 1 つ以上のコンテンツ要素
  • (場合によっては)1 つ以上のコンテンツバリエーション
  • ここで、
    • バリエーションはグローバルに管理されます。つまり、すべての要素は、名前と説明は同じでコンテンツが異なる(可能性がある)バリエーションを同じ数だけ持っています。
    • コンテンツの MIME タイプは、実際のコンテンツに基づいて管理されます。つまり、要素およびバリエーションごとに異なる MIME タイプを持つことができます。

テンプレートも使用されます。

  • テンプレートは、コンテンツフラグメントの作成時にその構造を定義します。
  • コンテンツフラグメントの構造は使用されている間に変化する可能性があるので、テンプレートはフラグメントにコピーされ、以後はそれがフラグメントのモデルになります。
  • したがって、新しいバリエーションを追加するときなどは、このモデルを更新する必要があります。
  • コンテンツフラグメントテンプレートは、AEM エコシステム内の他のテンプレートメカニズム(ページテンプレートなど)とは異なる方法で機能します。そのため、分けて考える必要があります。

AEM Assets との統合

コンテンツフラグメント管理(CFM)は、次の理由から AEM Assets の一部と考えられます。

  • コンテンツフラグメントはアセットである。
  • 既存の AEM Assets 機能を使用する。
  • AEM Assets に完全に統合されている(管理コンソールなど)。

コンテンツフラグメントとアセットのマッピング

chlimage_1

コンテンツフラグメントは、メインアセットと(オプションの)サブアセットからなる複合体にマッピングされます。

  • フラグメントのコンテンツ以外の情報(タイトル、説明、メタデータ、モデルなど)はすべて、メインアセットでのみ管理されます。
  • フラグメントの最初の要素のコンテンツは、メインアセットのオリジナルレンディションにマッピングされます。
    • 最初の要素のバリエーション(存在する場合)は、メインアセットのその他のレンディションにマッピングされます。
  • 追加要素(存在する場合)は、メインアセットのサブアセットにマッピングされます。
    • これらの追加要素のメインコンテンツは、それぞれのサブアセットのオリジナルレンディションにマッピングされます。
    • すべての追加要素のその他のバリエーション(該当する場合)は、それぞれのサブアセットのその他のレンディションにマッピングされます。

アセットの場所

標準アセットの場合、コンテンツフラグメントは次の場所に保持されます。

/content/dam

機能の統合

  • コンテンツフラグメント管理(CFM)機能は、Assets のコアを基盤として構築されていますが、できる限り独立させる必要があります。
  • CFM は、カード/列/リスト表示の項目に独自の実装を提供します。つまり、それらの項目が、既存のアセットコンテンツのレンダリング実装に挿入されます。
  • コンテンツフラグメントに対応するために、いくつかのアセットコンポーネントが拡張されています。

ページでのコンテンツフラグメントの使用

コンテンツフラグメントは、その他のアセットタイプと同様に、AEM ページを参照してください。AEM は、コンテンツフラグメントコンポーネントを提供しています。これは、コンテンツフラグメントをページ上に含めることができる、汎用的な既製コンポーネントです。このコンテンツフラグメントコンポーネントを拡張することもできます。

  • このコンポーネントは、fileReference プロパティを使用して、実際のコンテンツフラグメントを参照します。fileReference プロパティは、その他のアセットタイプの類似プロパティと同じ方法で処理されます。例えば、コンテンツフラグメントが別の場所に移動された場合などです。
  • このコンポーネントを使用して、表示するバリエーションを選択できます。
  • さらに、一定範囲の段落を選択して、出力を制限できます。例えば、複数列の出力に利用できます。
  • このコンポーネントは、中間コンテンツを許可します。
    • ここで、このコンポーネントを使用して、他のアセット(画像など)を参照されているフラグメントの段落の中間に配置できます。
    • 中間コンテンツの場合は、次のことを実行する必要があります。
      • 参照が不安定になる可能性に注意します。中間コンテンツ(ページのオーサリング時に追加)とその横にある段落の関係は、固定されていません。(コンテンツフラグメントエディター内で)中間コンテンツの位置の前に新しい段落を挿入すると、相対的な位置が失われることがあります。
      • 参照されているコンテンツフラグメントをサイト検索の結果に含め、許容可能なパフォーマンスレベルを保証します。
      • 検索結果における偽陽性を回避するために、パラメーター(類似バリエーションや段落フィルターなど)の追加を検討します。

その他のフレームワークとの統合

コンテンツフラグメントは、次のフレームワークと統合できます。

  • 翻訳

    コンテンツフラグメントは、AEM の翻訳ワークフローと完全に統合されています。つまり、アーキテクチャレベルでは以下を意味します。

    • コンテンツフラグメントの個々の翻訳は、実際には別々のフラグメントです。
      • 翻訳は、異なる言語のルート(/content/dam/path/en/to/fragment/content/dam/path/de/to/fragment など)の下に配置されます。
      • しかし、言語ルートの下では、まったく同じ相対パスを共有します(/content/dam/path/en/to/fragment/content/dam/path/de/to/fragment など)。
    • ルールベースのパスを除き、コンテンツフラグメントのさまざまな言語バージョンの間にそれ以上のつながりはありません。UI には言語バリアント間を移動する手段が用意されていますが、それらは 2 つの別々のフラグメントとして扱われます。
    • モデル(タイトル、説明など言語固有のテキストも含む)はテンプレートからコピーされるので、翻訳プロセスにも含めることができます。
  • メタデータのスキーマ

    • コンテンツフラグメントは、メタデータのスキーマを(再)利用します。メタデータのスキーマは、標準アセットを使用して定義できます。
    • CFM は、独自の固有スキーマ(/libs/dam/content/schemaeditors/forms/contentfragment)を提供します。このスキーマは、必要に応じて拡張できます。
    • 各スキーマフォームは、フラグメントエディターと統合されています。

コンテンツフラグメント管理 API - サーバー側

サーバー側 API を使用して、コンテンツフラグメントにアクセスできます。以下を参照してください。

com.adobe.cq.dam.cfm

警告:

コンテンツ構造に直接アクセスする代わりに、サーバー側 API を使用することを強くお勧めします。

主要インターフェイス

次の 3 つのインターフェイスが、入口の役割を果たします。

  • コンテンツフラグメントマネージャーContentFragmentManager

    このインターフェイスは、テンプレートリソースから新しいフラグメントを作成する仕組みを提供します。実際のコレクションコンテンツへのコレクション参照を解決することによって、関連コンテンツへの拡張アクセスも可能です。

    注意:

    パブリッシュインスタンス上(カスタマイズされたコンポーネント内など)の関連コンテンツにアクセスする場合、この API は使用できません。代わりに、匿名ユーザー読み取りアクセス権を持つ場所に必要な情報(参照など)をコピーしてから公開する必要があります。

  • コンテンツフラグメントContentFragment

    このインターフェイスでは、コンテンツフラグメントを抽象化して使用できます。 

    警告:

    このインターフェイスを使用してフラグメントにアクセスすることを強く推奨します。コンテンツ構造を直接変更しないでください。

    このインターフェイスでは、次のことを実行できます。

    • 基本データを管理する(名前の取得、タイトルまたは説明の取得/設定など)
    • メタデータにアクセスする
    • 要素にアクセスする
      • 要素を一覧表示する
      • 要素を名前で取得する
      • 新しい要素を作成する(注意事項を参照)
      • 要素データにアクセスする(ContentElement を参照)
    • そのフラグメントに対して定義されているバリエーションを一覧表示する
    • 新しいバリエーションをグローバルに作成する
    • 関連コンテンツを管理する
      • コレクションを一覧表示する
      • コレクションを追加する
      • コレクションを削除する
    • フラグメントのデータモデルにアクセスする(FragmentTemplate を参照)

    フラグメントの主要要素を表すインターフェイスには、次のものがあります。

    • コンテンツ要素ContentElement
      • 基本データ(名前、タイトル、説明)を取得する
      • コンテンツを取得/設定する
      • 要素のバリエーションにアクセスする
        • バリエーションを一覧表示する
        • バリエーションを名前で取得する
        • 新しいバリエーションを作成する(注意事項を参照)
        • バリエーションを削除する(注意事項を参照)
        • バリエーションデータにアクセスする(ContentVariation を参照)
      • バリエーションを解決するためのショートカット(要素に指定されたバリエーションを使用できない場合は実装固有の追加のフォールバックロジックを適用)
    • コンテンツバリエーションContentVariation
      • 基本データ(名前、タイトル、説明)を取得する
      • コンテンツを取得/設定する
      • 最後に変更された情報に基づくシンプルな同期

    3 つのインターフェイス(ContentFragmentContentElementContentVariation)すべてによって Versionable インターフェイスを拡張し、コンテンツフラグメントに必要な次のバージョン管理機能を追加します。

    • 要素の新しいバージョンを作成する
    • 要素のバージョンを一覧表示する
    • バージョン管理されている要素の特定のバージョンのコンテンツを取得する
  • フラグメントテンプレートFragmentTemplate

    このインターフェイスは、コンテンツフラグメントの作成元となるテンプレートと、(作成された)そのフラグメントのデータモデルの両方を表します。

    • 基本データ(タイトル、説明)にアクセスする
    • フラグメントの要素のテンプレートにアクセスする
      • 要素テンプレートを一覧表示する
      • 指定された要素のモデルを取得する
      • 要素テンプレートにアクセスする(ElementTemplate を参照)
    • フラグメントのバリエーションのテンプレートにアクセスする
      • バリエーションテンプレートを一覧表示する
      • 指定されたバリエーションのモデルを取得する
      • バリエーションテンプレートにアクセスする(VariationTemplate を参照)
    • 初期関連コンテンツを取得する

    テンプレートの重要な要素を表すインターフェイスには次のものがあります。

    • ElementTemplate
      • 基本データ(名前、タイトル)を取得する
      • 初期要素コンテンツを取得する
    • VariationTemplate
      • 基本データ(名前、タイトル、説明)を取得する

適応 - adaptTo() の使用

次のものを適応させることができます。

  • ContentFragment は、次のものに適応させることができます。

    • Resource - 基になる Sling リソース。基になる Resource を直接更新するには、ContentFragment オブジェクトを再構築する必要があります。
    • Asset - コンテンツフラグメントを表す DAM アセットの抽象化。Asset を直接更新するには、ContentFragment オブジェクトを再構築する必要があります。
  • ContentElement は、次のものに適応させることができます。

    • ElementTemplate - 要素のデータモデルにアクセスするためのものです。
  • FragmentTemplate は、次のものに適応させることができます。

    • Resource - フラグメントのデータモデルの基になるリソース
      • Resource を使用した変更は、FragmentTemplate に自動的に反映されません。
  • Resource は、次のものに適応させることができます。

    • ContentFragment
    • FragmentTemplate

注意事項

次のことに注意してください。

  • API は、UI がサポートする機能を提供するために実装されています。
  • API 全体は、(API JavaDoc で特に記載がない限り)変更を自動では保持しないように設計されています。したがって、各リクエストのリソースリゾルバー(または実際に使用しているリゾルバー)を必ずコミットしなければなりません。
  • 次のタスクには、追加作業が必要な場合があります。
    • 新しい要素を作成または削除しても、データモデルは更新されません。
    • ContentElement から新しいバリエーションを作成してもデータモデルは更新されません(が、ContentFragment からグローバルに新しいバリエーションを作成すると更新されます)。
    • 既存のバリエーションを削除してもデータモデルは更新されません。

コンテンツフラグメント管理 API - クライアント側

フラグメントエディターは、(多かれ少なかれ依存関係がある)コンポーネントセットをさまざまなビュー(編集関連コンテンツメタデータ)に合わせて組み合わせて使用します。

クライアント側の JavaScript API は、基本的にはコンポーネント間通信に使用されるイベントセットです。このイベントベースの API を使用して、コンテンツフラグメント機能を拡張できます。

コンテンツ構造

ルートパスは次のとおりです。

 /libs/dam/cfm/admin

この下で、コンテンツは次の 3 つのサブツリーに分けられます。

  • content - CFM 管理ページで使用されるコンテンツ定義
  • components - コンポーネント
  • clientlibs - クライアントライブラリ

警告:

/libs パス内の設定は一切変更しないでください。

コンポーネント

使用できるコンポーネントを以下に示します。

警告:

実際のコンポーネントはまだ変更される可能性があるので、拡張または変更は推奨されません。

  • 基本的なページコンポーネント - adminpage
    • すべての管理ページが使用する基本的なページコンポーネント。
  • オーサリング関連コンポーネント - authoring サブツリー
    • 要素またはバリエーションのコンテンツの編集に必要なコンポーネント。エディターコンポーネント自体と、テキストを処理するために提供されるツールの両方を含みます。
    • フラグメントまたは要素のバリエーションを管理するコンポーネント。
  • 関連付けられたコンテンツに関係するコンポーネント - associatedcolls サブツリー
    • 関連付けられたコレクションを管理するためのコンポーネント。
  • カード、リスト、列 - contentrenderer サブツリー
    • リスト表示、列表示、カード表示でコンテンツをレンダリングするためのコンポーネント。
  • メタデータコンポーネント - metadata サブツリー
    • コンテンツフラグメントのアセットメタデータを管理するために必要なコンポーネント。
  • ウィザードコンポーネント - wizards サブツリー
    • 新しいフラグメントを作成するためのウィザード。
  • 一般/共有コンポーネント - shared サブツリー
    • tagspicker や viewselect などの共有コンポーネント。
  • レンダリング条件 - rendercondition サブツリー
    • レンダリングの条件。
  • データソース - datasources サブツリー
    • データソースを管理するためのコンポーネント。

クライアントライブラリ

クライアントライブラリは、次のモジュール単位で提供されます。

  • ページ処理/一般
    • adminpagedam.cfm.adminpage) - すべてのビューが共有する一般的なスクリプトとスタイル。特に次のスクリプトが重要です。
      • editsession.js - CFM に必要な自動保存とトランザクション単位の複数ページ編集を処理します。
      • page.js - ページの初期化、サイズ変更処理、コンテンツ要素(存在する場合)や表示のスイッチャーなどのグローバル UI 要素の処理
    • shared/tagspickerdam.cfm.shared.tagspicker) - パッチが適用された CQ のデフォルトのタグピッカーのスクリプトとスタイル
  • テキストオーサリング/エディターの実装
    • authoringdam.cfm.authoring) - 現時点では、バリエーション UI(バリエーションの追加/削除)を管理するために必要なスタイルとスクリプトが含まれています。
    • authoring/rte/coredam.cfm.authoring.rte.core) - RTE コア(リッチテキストコンテンツに使用)。/etc/clientlibs/granite/coralui2/optional/rte/js から必要なファイルを参照します。
    • authoring/rte/impldam.cfm.authoring.rte) - CFM のリッチテキスト編集に必要な UI 実装です(UI 要素、ツールバー、ラッパーウィジェット)。
    • authoring/contenteditordam.cfm.authoring.contenteditor) - コンテンツエディターのツールを実装します。特に次のスクリプトが重要です。
      • activevar.js - 現在編集されているバリエーションの表示および更新に必要なスクリプト。
      • switcher.js - 対応するドロップダウンを使用して MIME タイプの変更を処理するために必要なスクリプト。このスクリプトは、ドロップダウンを関連付けるだけで、実際のタイプ変更は authoring/editor.js に実装されることに注意してください。
      • textstatistics.js - テキスト統計の表示および更新を処理するスクリプト(authoring/contenteditor/textstats を参照)。
      • editor.js - エディター実装(authoring/contenteditor/editors を参照)をオーサリングビューに関連付けます。要素またはバリエーションの保存と読み込みを処理します。現在のテキスト用のエディター(テキストの MIME タイプで判断)を有効化または無効化して、要素またはバリエーションの MIME タイプを変更したり、既存のテキストを新しいフォーマットに変換したりします。また、イベント API を通じて各機能を公開します。
    • authoring/contenteditor/editorsdam.cfm.authoring.editors) - このクライアントライブラリは、各 MIME タイプ用のエディターの実装(現時点では MarkdownEditor.jsStyledTextEditor.jsPlainTextEditor.js)を提供します。MIME タイプと、そのタイプのテキストの編集に使用するエディターは、EditorRegistry.js によってマッピングされます。スタイル設定されたコンテンツ(HTML や Markdown など)を HTMLExtractor.jsMarkdownEditor.js を使用してプレーンテキストに変換できます。この処理は、テキスト統計の計算に必要です。
    • authoring/contenteditor/textstatsdam.cfm.authoring.textstats) - テキスト統計の計算に使用されるライブラリです。
  • 表示関連:
    • 関連コンテンツ
      • assoccontentdam.cfm.assoccontent) - 関連付けられたコンテンツに関係するスクリプトです。
    • メタデータエディター
      • metadatadam.cfm.metadata) - アセット用の標準メタデータエディターとコンテンツフラグメント管理(metadata.js)を統合します。いくつかのオリジナルのアセットスクリプト(form.jsmetadataeditor.js)に必要なオーバーライドも含まれます。最後に、コンテンツフラグメントのサムネールのアップロードを実装します。
    • その他のビュー
      • adminpage/wizard(dam.cfm.adminpage.wizard) - フラグメントを作成ウィザード内で「タイトルから名前」の会話とフィールドの検証を処理するスクリプトです。
  • ライブラリフラグメント
    • admindam.gui.actions.coral) - アセットコンソールの「作成」ボタンからフラグメントを作成ウィザードを開始するために必要なスクリプトを追加します。

追加情報

次のファイルを参照してください。

  • filter.xml

    コンテンツフラグメント管理のための filter.xml は、アセットのコアコンテンツパッケージと重複しないように設定されています。

  • ビューの設定

    ビューは次の場所で設定します。

    /libs/dam/content/schemaeditors/forms/contentfragment

    警告:

    /libs パス内の設定は一切変更しないでください。

    各ビューは、nt:unstructured 子ノードで表され、次のプロパティを使用して設定されます。

    • text - ビューセレクターに表示されるテキスト(例:編集
    • type - ビューの初期名(例:authoring
    • value - ビューをホスティングするページの URL(例:${granite:url("/mnt/overlay/dam/cfm/admin/content/fragment-editor.html")}${requestPathInfo.suffix}

編集セッション

ユーザーがいずれかのエディターページでコンテンツフラグメントを開き、テキストの入力やバリエーションの削除などを始めると、編集セッションが開始されます。ユーザーが保存(チェックマーク)またはキャンセル(X)を選択してエディターから移動すると、編集セッションは終了します。

要件

編集セッションの制御には、次の要件があります。

  • 複数のビュー(= HTML ページ)にまたがる可能性があるコンテンツフラグメントを編集するときは、原子性を保証する必要があります。
  • さらに、編集はトランザクション単位でおこなう必要があります。すなわち、編集セッションの終了時には、変更をコミット(保存)するか、ロールバック(キャンセル)します。
  • エッジケースを適切に処理する必要があります。例としては、ユーザーが手動で URL を入力したりグローバルナビゲーションを使用したりしてページから移動する場合などが考えられます。
  • データが失われないよう、定期的な自動保存(x 分ごと)をおこなう必要があります。
  • 2 人のユーザーが同時に 1 つのコンテンツフラグメントを編集する場合に、互いの変更を上書きしてはなりません。

プロセス

次のプロセスが含まれます。

  • セッションの開始
    • コンテンツフラグメントの新しいバージョンが作成されます。
    • 自動保存が開始されます。
    • cookie が設定されます。この cookie により、現在編集しているフラグメントと、編集セッションがオープンしていることが記録されます。
  • セッションの終了
    • 自動保存が停止されます。
    • コミットする場合:
      • 最後に変更した情報が反映されます。
      • cookie が削除されます。
    • ロールバックする場合:
      • 編集セッションの開始時に作成されたコンテンツフラグメントのバージョンが復元されます。
      • cookie が削除されます。
  • 編集
    • すべての変更(自動保存を含む)は、分離され、保護された領域ではなく、アクティブなコンテンツフラグメントに対して実行されます。
    • したがって、このような変更は、各コンテンツフラグメントを参照する AEM ページに即座に反映されます。

アクション

使用可能なアクションには次のものがあります。

  • ページの入力
    • 対応する cookie を確認して、編集セッションが既に存在するかどうかを確認します。
      • 存在する場合は、編集セッションが現在編集中のコンテンツフラグメント用に開始されたことを確認します。
        • 現在のフラグメント用の場合は、セッションを再確立します。
        • それ以外の場合は、前に編集したコンテンツフラグメント用の編集のキャンセルと、cookie の削除をおこないます(以後、編集セッションは存在しなくなります)。
      • 編集セッションが存在しない場合は、ユーザーが最初の変更をおこなうまで待機します(下記を参照)。
    • コンテンツフラグメントが既にページ上で参照されているかどうかを確認し、参照されている場合は適切な情報を表示します。
  • コンテンツ変更
    • ユーザーがコンテンツを変更し、編集セッションが存在しない場合は必ず、新しい編集セッションが作成されます(セッションの開始を参照)。
  • ページからの移動
    • 編集セッションが存在していて、変更が保持されていない場合は、コンテンツが失われる可能性があることをユーザーに通知し、ページに留まるかどうかを尋ねるモーダル確認ダイアログが表示されます。このモーダルダイアログは、手動でブロックすることもできます(cfm:block イベントを参照してください)。

 

例:既存のコンテンツフラグメントへのアクセス

既存のコンテンツフラグメントにアクセスするには、API を表すリソースを以下に適応させます。

com.adobe.cq.dam.cfm.ContentFragment

次に例を示します。

// first, get the resource
Resource fragmentResource = resourceResolver.getResource("/content/dam/fragments/my-fragment");
// then adapt it
if (fragmentResource != null) {
    ContentFragment fragment = fragmentResource.adaptTo(ContentFragment.class);
    // the resource is now accessible through the API
} 

例:新しいコンテンツフラグメントの作成

新しいコンテンツフラグメントをプログラムによって作成するには、以下を使用する必要があります。

com.adobe.cq.dam.cfm.ContentFragmentManager#create

次に例を示します。

@Reference
private ContentFragmentManager fragmentManager;

// ...

private void myCreateFun() {
    // Parameters for fragmentManager.create
    //     parent - the folder where the fragment should be created
    //     template - the template to use
    //     name
    //     title
    ContentFragment myFragment = fragmentManager.create(parent, template, "my-fragment", "My Fragment");
    // ... 
}

例:自動保存間隔の指定

自動保存間隔(秒単位)は、設定マネージャー(ConfMgr)を使用して定義できます。

  • ノード:<conf-root>/settings/dam/cfm/jcr:content
  • プロパティ名:autoSaveInterval
  • タイプ:Long
  • デフォルト:600(10 分)。/libs/settings/dam/cfm/jcr:content で定義されています

自動保存間隔を 5 分に設定する場合は、次のようにノードにプロパティを定義する必要があります。

  • ノード:/conf/global/settings/dam/cfm/jcr:content
  • プロパティ名:autoSaveInterval
  • タイプ:Long
  • 値:300(5 分は 300 秒です)

テンプレート

詳しくは、コンテンツフラグメントテンプレートを参照してください。

ページオーサリング用コンポーネント

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー