ビジュアルコンテンツフラグメント – テンプレート visual-content-fragments-templates
Adobe Experience Manager(AEM)as a Cloud Serviceでは、HTML テンプレートを使用してコンテンツフラグメントを視覚化し、HTML形式で配信できます。
HTML テンプレートを使用すると、コンテンツフラグメントの表示方法を制御できます。 任意のコードエディターでHTML テンプレートを作成し、AEMのコンテンツフラグメントモデルにアップロードして割り当てることができます。 Handlebars.jsを使用したコンテンツプレースホルダーを使用すると、テンプレートをコンテンツフラグメントモデルのデータタイプにマッピングできます。 モデルに割り当てられたテンプレートは、モデルに基づいて任意のコンテンツフラグメントと共に使用して、フラグメントを視覚化したり、HTML形式のモジュラーエクスペリエンスとしてweb、電子メール、モバイルアプリケーションなどの任意のチャネルに配信したりできます。
この記事では、ビジュアルコンテンツフラグメントをレンダリングするためのHandlebars構文を使用したカスタム HTML テンプレートの作成方法について説明します。
テンプレートを作成すると、次のことが可能になります。
-
ビジュアルコンテンツフラグメントの公開URLを使用
学習すること what-you-will-learn
(非常に迅速な)概要を提供した後:
- AEMでのテンプレートの使用方法
- 公開URLの使用
このページでは、次の項目について説明します(詳細)。
- Handlebars – 構文の必要な基本
- コンテンツフラグメントデータへのアクセス方法
- ネストされたコンテンツフラグメントの操作
- 複数値フィールドの処理
- ループと条件付きロジックの作成
- コンテンツフラグメントのテンプレートデザインのベストプラクティス
前提条件 prerequisites
ここで取り上げるテクノロジーについて理解し、使用するには、次の操作を行う必要があります。
- HTMLの基本
- AEM コンテンツフラグメントとコンテンツフラグメントモデルの概要
- コンテンツフラグメントモデルについて
コンテンツフラグメント HTML テンプレートの使用 using-a-content-fragment-html-template
AEMでのコンテンツフラグメント HTML テンプレートの使用 using-a-content-fragment-html-template-in-aem
AEMでのテンプレートの使用方法について詳しくは、次を参照してください。
ビジュアルコンテンツフラグメントの公開URLの使用 using-the-visual-content-fragment-publish-url
テンプレートを使用してビジュアルコンテンツフラグメントを作成したら、ビジュアルコンテンツフラグメントの公開URLを使用できます。
Handlebars - (非常に)基本 handlebars-the-very-basics
Handlebarsは、動的コンテンツをHTMLに挿入するために、二重中括弧(括弧) {{ }}を使用するシンプルなテンプレート言語です。
基本的な構文 basic-syntax
基本的なHandlebars構文の例:
主な概念 key-concepts
Handlebarsの主な概念:
{{ }}{{{ }}}{{! }}{{{ }}})を使用します。テンプレートのコンテキスト参照 template-context-reference
テンプレートがレンダリングされると、コンテンツフラグメントに関するすべてのデータを含むコンテキストオブジェクトが受け取られます。 主な内容:
-
選択したフラグメントは
-
選択したフラグメントから参照されているすべてのフラグメント
note NOTE フラグメントは次のように参照できます。 - uiの場合:最大の深さ5
- apiを使用する場合:深度は設定可能で、最大深度は10です
メインコンテンツフラグメント main-content-fragment
(選択した)コンテンツフラグメントのコンテキストオブジェクトの構造:
fieldsallFields{name, value}の配列hasFieldstrueプロパティ構造(メインフラグメントと参照フラグメント) properties-structure-main-and-referenced-fragments
properties オブジェクトは、選択したフラグメントと、参照されている各フラグメントに対して同じ構造を持ちます。
idtitledescriptionpath/content/dam/...hasDescriptiontruecreatedDatemodifiedDatepublishedDatestatusDRAFTmodelid、path、name、technicalName、descriptionvalidationStatus{property, message}様のエントリpreviewReplicationStatustagsid、title、titlePath、name、path、descriptionfieldTagstagsと同じ構造です。例:テンプレートへのアクセス
(選択した)コンテンツフラグメントの場合:
参照コンテンツフラグメント referenced-content-fragments
参照されているフラグメントのコンテキストオブジェクトの構造:
hasReferencedFragmentstruereferencedFragmentsreferencesErrortruereferencesErrorMessagereferencesErrorがtrueの場合のエラーメッセージ参照フラグメント構造 referenced-fragment-structure
referencedFragmentsの各項目には次が含まれます。
anchorIdpropertieshasFieldsfieldsallFields{name, value}の配列例:最初に参照されたコンテンツフラグメントのテンプレートアクセス(0 インデックス付きリストの最初の項目):
フィールドマップから:
コンテンツフラグメントのメタデータ構造 content-fragment-metadata-structure
フラグメントのメタデータ (メタデータ スキーマに裏付けられたメタデータ/フィールドブロック)は、metadataの下に表示されます。 構造値(title、description、path、tags、dates、status)を保持するpropertiesとは異なります。
metadatametadata式はエラーの代わりに空になりますmetadata.schemaIddefaultmetadata.valuesmetadata.fieldsname、type (文字列、整数、数値、ブール値、配列、オブジェクト)、valueおよびtitle (スキーマから人間が読み取れるラベル)が含まれていますmetadata.valuesはJSON型を保持するため、そこから読み取られた数値またはブール値は、文字列として事前にレンダリングされたテンプレートに到達するスカラーのフィールドとは異なり、比較ヘルパーとブール値ヘルパーで直接動作します。 比較とブーリアンロジックヘルパーも参照してください。アセットフィールド構造 asset-field-structure
参照アセットは最上位のコレクションではありません。referencedAssetsはありません。 参照されたフラグメント内のアセットに対して、アセットを保持するフィールド、fields.<assetField>またはfields.<ref>.fields.<assetField>を通じてアセットにアクセスします。
アセットフィールドの値は二重属性です。 未加工で印刷されたアセットは、事前にレンダリングされたHTMLです。にドリルダウンすると、アセットのメタデータがpropertiesの下に表示されます。
<img>)。3つの中括弧が必要です:
{{{fields.heroImage}}}properties複数値のアセットフィールドはリストです。 HTMLには{{{this}}}、メタデータには{{this.properties.assetId}}を使用して、{{#each fields.gallery}}で繰り返します。
ローカル DAM アセットのプロパティ properties-of-a-local-dam-asset
これらのキーは、コンテンツフラグメント応答によって運ばれ、常に使用できます。
assetIdurn:aaid:aem:1fb05fe4-...path/content/dam/wknd/ian_provo.jpgnameian_provo.jpgtitledescriptiontypeassetassetfieldNameprofilePicturestatusNEW, DRAFT, PUBLISHED, MODIFIED, UNPUBLISHEDDRAFTpreviewReplicationStatusPUBLISHED、UNPUBLISHED、MODIFIED、NEVER_PUBLISHEDcreated, modified, publishedat (ISO-8601)、by、fullName、firstName、lastNamedc:formatimage/jpegrepo:size251434tiff:ImageWidth1152tiff:ImageHeight1152yournamespace:persistentIDなどのカスタム名前空間を含め、アセットが保持するその他すべてのプロパティ。 オンデマンドでアセットから取得しましたコロンを含むプロパティ名には、括弧の構文が必要です。
Dynamic Media アセットのプロパティ properties-of-a-dynamic-media-asset
ダイナミックメディア(リモート)アセットにはDAM パスがありません。 インラインのキーは2つだけです。
repositorydelivery-p12345-e67890.adobeaemcloud.comassetIdurn:aaid:aem:1fb05fe4-...これらを組み合わせると、埋め込み画像を使用する代わりに、Dynamic Media配信URLを構築するのに十分です。 その他のすべてのプロパティは、アセットの独自の配信ホストから取得されます。 そこで提供されるのは承認済み(公開された)アセットのみなので、未承認のDynamic Media アセットでは、これら2つのキー以外は解決されません。
properties.<key>ではなくthis.properties.<key>と書きます。 キーがtitle、description、path、statusなどのコンテンツフラグメントプロパティでもあるベアパスは、アセットではなくフラグメントに対して解決されます。基本的なフィールドアクセス basic-field-access
必要に応じて、すべてのフィールドを繰り返し使用できる、直接フィールドアクセスをお勧めします。
ダイレクトフィールドアクセス(推奨) direct-field-access-recommended
フィールドマップを使用して、名前でフィールドに直接アクセスします。
重要な点:
- フィールド値に事前にレンダリングされたHTML(リッチテキスト)が含まれている場合は、3つの括弧
{{{ }}}を使用します - フィールド名(タイトル、サブタイトル、説明、primaryImage) mustは、コンテンツフラグメントモデル に正確に一致します
- 見つからないフィールドはレンダリングされません。エラーはスローされず、レンダリングされたHTML フラグメントにHandlebars構文が存在し(表示されたままになります)
すべてのフィールドに対して繰り返し実行する iterate-through-all-fields
フィールド名が事前にわからない場合は、allFieldsを使用します。
重要な点:
{{name}}は二重中括弧(プレーンテキストのラベル)を使用します{{{value}}}は3つの中括弧を使用します(事前にレンダリングされたHTML値)
ネストされたコンテンツフラグメント nested-content-fragments
コンテンツフラグメントフィールドが別のコンテンツフラグメントを参照している場合、ドット表記法を使用して、参照されているフラグメントのフィールドに直接アクセスできます。
単一レベルのネスト single-level-nesting
単一レベルのネストの例:
パターン:fields.referenceFieldName.nestedFieldName
マルチレベルネスト multi-level-nesting
このシステムは、ネスト深度を無制限にサポートします。
パターン:fields.level1.level2.level3.fieldName (深さが制限されています。デフォルトは5で、APIを使用する場合は10に拡張できます)
API パラメーター要件:ハイドレーション api-parameter-requirements
ネストされたコンテンツフラグメントへのアクセスを有効にするには、API呼び出しにhydration クエリパラメーターを含める必要があります。
ハイドレーションを有効にするには:
# Enable hydration with depth=2 for 2 levels of nesting
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A2%7D
maxDepth123+複数値フィールド multi-valued-fields
複数値フィールドにはいくつかの種類があります。
複数値テキストフィールド multi-valued-text-fields
テキスト、number、日付、およびその他の単純なフィールドは、複数値の場合に配列になります。
Handlebarsのインデックスで配列項目にアクセスする場合は、次の点に注意してください。
- 使用方法:
.[0](角括弧の前のドット)
- なし:
[0]
複数値フィールド multi-valued-number-fields
数値は、レンダリング用に文字列に変換されます。
複数値のコンテンツフラグメント参照 multi-valued-content-fragment-references
フィールドが複数のコンテンツフラグメントを参照する場合:
複数値のアセット参照 multi-valued-asset-references
アセット(画像やドキュメントなど)であるコンテンツタイプ用に設定された コンテンツ参照 フィールドは、HTMLとして事前にレンダリングされます。 複数値のアセットは配列になります。
ネストされた複数値参照 nested-multi-valued-references
複数値の参照には、任意の深さで複数値の参照を含めることができます。
ループと反復 loops-and-iteration
Handlebarsは、配列とオブジェクトを反復処理するための{{#each}} ヘルパーを提供します。
配列の繰り返し iterating-over-arrays
配列を繰り返す例:
ループ内の特殊変数 special-variables-in-loops
{{#each}} ブロック内では、Handlebarsは特殊な変数を提供します。
参照されたフラグメントの繰り返し iterating-over-referenced-fragments
参照されたフラグメントに対する反復の例:
ネストされたループ nested-loops
ネストされたループの例:
条件付きレンダリング conditional-rendering
条件を使用して、データの可用性にもとづいてコンテンツを表示または非表示にします。
基本If/Else basic-if-else
基本的なif-else構文の例:
(負の条件)を除く unless-negative-conditional
unless ヘルパー:
hideAuthorが実際のブール値(例:metadata.values.*)である場合、これは正しく読み取られます。 ただし、1つの値のブール値フィールドは、文字列"true"または"false"として事前にレンダリングされ、"false"は空でない(真の)文字列であるため、{{#unless fields.hideAuthor}}はフィールドがfalseの場合でも作成者を非表示にします。 代わりに、スカラーのフィールドを明示的に比較します(例:{{#if (eq fields.hideAuthor "true")}})。 比較とブーリアンロジックヘルパーも参照してください。ネストされた条件 nested-conditials
ネストされた条件の例:
比較とブーリアンロジックヘルパー comparison-and-boolean-logic-helpers
ストック {{#if}}および{{#unless}} ヘルパーに加えて、テンプレートがフィールド値に対して条件付きでレンダリングできるように、サービスは比較ヘルパーとブール論理ヘルパーを登録します。 比較ヘルパーとブーリアンロジックヘルパーの両方は、ブロックおよびインラインサブ式として機能します。
単一値フィールドの数値比較 numeric-comparison-on-single-valued-fields
1つの値のフィールドは文字列(7ではなくfields.quantity is "7")として事前にレンダリングされますが、ヘルパーは比較時に数値文字列を強制するので、{{#gte fields.quantity 5}}と{{#eq fields.quantity 0}}は数値として比較し、{{#gte metadata.values.quantity 5}}と一緒に値が既に入力されています。 順序(gt/gte/lt/lte)は常に数値的に比較されます。 意図を持つ等質強制:文字列フィールドは、他のオペランドが正規番号(数値リテラル ({{#eq fields.qty 0}})またはmetadata.values.*などの入力フィールド)である場合にのみ、数値として比較されます。 2つの文字列フィールドまたは引用符で囲まれたリテラル ({{#eq fields.version "1.0"}})を比較すると、文字列の等価が正確に維持されるため、バージョン、zip コード、およびテキストとしてモデル化されたidは折りたたまれません("007"が"7"と等しくありません)。 日付はISO-8601文字列としてワイヤを渡るので、eq/neqは正確な文字列等価で比較し、順序付けヘルパーは非数値として拒否します。 空白または数値以外のオペランドが見つからない場合は、「条件が満たされていない」として扱われ、エラーではなくelse ブランチがレンダリングされます。
ブーリアンヘルパーはプレーンな真実を使用します(強制は行いません) boolean-helpers-use-plain-truthiness-no-coercion
ブール型ヘルパーand/or/notは強制しません。空でない文字列が真である場合は、ストック Handlebarsの真正性を適用します(偽の値はfalse、null、undefined、0、""、[])。 単一の値のブール値フィールドが文字列"true"または"false"として届き、"false"は空でない文字列であるため、{{#not fields.flag}}は真の値を見つけ、フィールドがfalseを読み取ってもelse ブランチを取得します。 スカラーのブール値フィールドをand/or/notにフィードするのではなく、明示的に({{#eq fields.flag "true"}})比較します。metadata.values.*から読み取られたブール値は既に入力されており、ブール値ヘルパーで直接動作します。
ヘルパーにちなんで名前が付けられたフィールド fields-named-after-a-helper
これらのヘルパーを登録すると、グローバルに名前が要求されますが、引数なしで読み取られた場合、名前の付いたフィールドは引き続き独自の値をレンダリングします。{{#with fields}}内の{{eq}}は、比較結果ではなくeq フィールドのテキストを出力します。 ヘルパーは、ビジュアライゼーションテンプレートと、コンテンツフラグメントフィールド値に埋め込まれたハンドルバー内の両方で使用できます。
組み込みのHandlebars ヘルパー built-in-handlebars-helpers
Handlebarsには、{{#if}}と{{#each}}を超える複数の組み込みヘルパーが含まれています。
{{#if condition}}false、undefined、null、0、""、[]{{#unless condition}}#ifの逆){{#each array}}{{else}}をサポートします{{#with object}}{{lookup this "key"}}ヘルパーを使用 with-helper
ネストされたオブジェクトの新しいスコープを作成して、繰り返しパスの接頭辞を減らします。
高度なパターン advanced-patterns
高度なパターンの例がいくつかあります。
ネストされたループでの親コンテキストへのアクセス accessing-parent-context-in-nested-loops
ネストされたループ内から親スコープにアクセスするには、../を使用します。
動的なCSS クラス dynamic-css-classes
動的なCSS クラスの例:
完全な例 complete-examples
いくつかの完全な例が参照のために提供されています。
作成者のブログ投稿
著者の詳細を記載したブログ記事:
必要なAPI呼び出し:
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A1%7D
汎用テーブルビュー(フィールドに関する事前知識なし) generic-table-view-no-prior-knowledge-of-fields
フィールドに関する固有の知識がない汎用的なテーブルビュー。 は、汎用テンプレートと似ています。
ベストプラクティス best-practices
ベストプラクティスには、次のようなものがあります。
-
HTMLのマークアップコンテンツを含むフィールド値には、必ず3つの中括弧を使用してください。
-
フィールド値は、事前にレンダリングされたHTMLです。
note NOTE ダブルブレースでは、生のHTML タグがプレーンテキストとして表示されます。
code language-handlebars <!-- CORRECT --> {{{fields.description}}} <!-- WRONG - displays HTML tags as text --> {{fields.description}} -
-
ネストされたフィールドにアクセスする前に、存在を確認します。
code language-handlebars <!-- GOOD: check before accessing nested fields --> {{#if fields.author}} <p>By {{{fields.author.name}}}</p> {{/if}} <!-- RISKY: may render empty if author is not set --> <p>By {{{fields.author.name}}}</p> -
可能な限り直接的なフィールドアクセスを確保する。
allFieldsを繰り返して名前で照合するよりも、読みやすく、維持しやすくなります。
-
セクションコメント付きの構造テンプレート。
code language-handlebars {{! ===== HEADER SECTION ===== }} <header> <h1>{{properties.title}}</h1> </header> {{! ===== MAIN CONTENT ===== }} <main> {{#if hasFields}} <!-- fields rendering --> {{/if}} </main> {{! ===== REFERENCES ===== }} {{#if hasReferencedFragments}} <!-- references rendering --> {{/if}} -
フォールバックにより、欠けているデータを適切に処理。
code language-handlebars {{#if fields.title}} <h1>{{{fields.title}}}</h1> {{snippet-not-found:else}} <h1>Untitled</h1> {{/if}} -
常に適切なHTML文書構造を使用してください。
code language-handlebars <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{properties.title}}</title> </head> <body> <!-- your content here --> </body> </html> -
様々なコンテンツシナリオでテストします。
- すべてのフィールドに情報が入力されました
- オプションフィールドがありません
- 空の複数値フィールド
- ディープネスティング(複数レベル)
- 読み込みに失敗する参照
-
セマンティック HTML要素を使用します。
- アクセシビリティを向上させるには、
<article>、<header>、<main>、<footer>、<time>、<address>などを使用します。
- アクセシビリティを向上させるには、
-
CSSでスタイルを保持します。
<style>個のタグまたは外部スタイルシートを使用します。- インラインスタイルは可能な限り避けます。
-
ドキュメントの複雑なロジック:
- Handlebars コメント
({{! }})を使用します。 - レンダリングされた出力に表示されるHTML コメントは使用しないでください。
- Handlebars コメント
トラブルシューティング troubleshooting
トラブルシューティングのヒントには、次のようなものがあります。
<p>Hello World</p>は文字通り表示されます{{{fields.description}}}{{{fields.author.name}}}は空白ですmaxDepthが十分に深いことを確認してください{{#each fields.tags}}を使用してすべての項目を繰り返します{{{fields.tags[0]}}}は空のレンダリングです{{{fields.tags.[0]}}}hasReferencedFragmentsは常にfalseです?hydration=%7B%22enabled%22%3Atrue%7D;も{{#if referencesError}}を確認します{{#if}}または{{#each}} ブロックを確認してください。診断出力を追加してください:<pre>hasFields: {{hasFields}} | title: {{properties.title}}</pre><!-- comment -->の代わりにHandlebars コメント {{! comment }}を使用{{#if fields.enabled}}は常に真実です"false"はHandlebarsで正しく表示されます。 実際のfalse、null、undefined、0、""および[]のみが偽装されています。<、&の代わりに<、&が表示されます{{{fields.content}}}#eachの変数が定義されていません../を使用:{{{../name}}}、祖父母に../../を使用{{#each}}内で{{else}}を使用:{{#each fields.tags}}...{{else}}<p>No tags</p>{{/each}}アセットの操作 working-with-assets
コンテンツフラグメントから参照されるAssetsは、AEMによってHTMLとして事前にレンダリングされます。 したがって、すべてのアセット参照には3つの中括弧が必須です。
<img src="..." alt="..."><video>要素<a href="..."> リンク重要な点:
- アセットフィールドには常に3つの中括弧を使用します。
二重中括弧を使用すると、生成されたHTML タグはエスケープされ、画像、ビデオ、リンクをレンダリングするのではなく、生のテキストとして表示されます。
アセットフィールドの使用状況 asset-field-usage
アセットフィールドの使用例:
カスタムテンプレートヘルパー customer-template-helpers
このシステムは、カスタム HTML属性を持つHTML要素を生成するためのカスタムハンドルバーのヘルパーを提供します。 これらのヘルパーは、生成されたマークアップを制御すると同時に、事前にレンダリングされたコンテンツからソース URLを抽出する複雑さを処理します。
使用可能なヘルパー:
asset- カスタム属性を持つ<img>タグを生成しますtext- カスタム属性を持つテキストコンテンツをラップする<span>タグを生成します
asset ヘルパー asset-helper
構文:
重要な点:
- アセットヘルパーには、ダブルブレースではなく、トリプルブレース
{{{ }}}を使用します。
4つの基本的な例 four-basic-examples
基本的な例は次の4つです。
サポートされる属性 supported-attributes
有効なHTML属性を追加できます。
classclass="my-class another-class"idid="unique-id"altalt="Custom alt text" (overrides existing alt)data-*data-index="1" data-type="hero"aria-*aria-label="Description" aria-hidden="true"widthwidth="300"heightheight="200"loadingloading="lazy"stylestyle="border-radius: 8px;"代替テキストを上書き override-alt-text
元の画像のalt属性を上書きできます:
複雑な例 complex-example
複雑な例としては、次のようなものがあります。
ループでの使用 using-with-loops
ループのアセットヘルパー:
text ヘルパー text-helper
テキストヘルパーは、カスタム CSS クラスとHTML属性を含むテキストコンテンツをラッピングする<span> タグを生成します。 個々のテキストフィールドのスタイル設定に便利です。
構文:
重要な点:
- テキストヘルパーには、ダブルブレースではなく、トリプルブレース
{{{ }}}を使用します。
3つの基本的な例 three-basic-examples
基本的な例は次の3つです。
一般的なユースケース common-use-cases
一般的なユースケースには、次のようなものがあります。
ループ付き with-loops
ループを使用する一般的なユースケースには、次のようなものがあります。
ヘルパー – 属性検証 helpers-attribute-validation
どちらのヘルパーも、属性名を出力に含める前に検証します。
有効な属性名:
-
文字(a ~ z、A ~ Z)で始める必要があります
-
文字、数字、ハイフン、アンダースコアのみを含めることができます。命名規則を参照してください。
-
大文字小文字を区別しない
-
次に例を示します。
- 有効:
class,id,data-value,aria-label,my_attr,dataIndex1
- 無効:
123-attr,-class,@special,$money
- 有効:
無効な属性名は、ログ内の警告でサイレントにスキップされます。
重要な点:
- サーバーのログで「ブロックされた無効な属性名形式」警告を確認します。
ヘルパーへの直接出力の比較 comparing-direct-output-to-helpers
直接出力{{{fields.xxx}}}をiseする場合:
- カスタムスタイルは必要ありません
- デフォルトの出力をそのまま使用する
- フィールドには、変更しない複雑なHTMLが含まれています
ヘルパーを使用する場合:
- スタイル設定のためにCSS クラスを追加する必要があります
- カスタム HTML属性(
data-*、aria-*など)を追加する必要があります - 必要なのは、一貫性のある制御されたHTMLの構造です
比較:
クイックリファレンス quick-reference
一部のクイックリファレンス情報は参照用に提供されています。
コンテキスト変数 context-variables
コンテキスト変数:
フィールドアクセス field-access
フィールドへのアクセス方法:
制御フロー control-flow
制御フロー:
ループ変数 loop-variables
ループ変数:
カスタムテンプレートヘルパー custom-template-helpers
カスタムテンプレートヘルパー:
その他のリソース additional-resources
次のその他のリソースを使用できます。