1. その他の開発タスク

動的プレースホルダー

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

動的プレースホルダを使用すると、同じプレースホルダ名を複数回追加できます。これは複数のレンダリングで行うことができ、1回のレンダリングで同じプレースホルダを複数回使用することもできます。

ダイナミックプレースホルダーとは、次のことを意味します。

  • 一意のキーは、異なるレンダリング間および1つのレンダリング内で保証されます。

  • 同じレンダリング内で複数のプレースホルダを動的に生成する機能を構築できます。

動的プレースホルダーの使用

DynamicPlaceholder拡張メソッドは、Sitecore.Mvc.Helpers名前空間のSitecoreHelperクラスで使用できます。このメソッドには、いくつかのオーバーロードがあります。

  • DynamicPlaceholder(string placeholderName, int count = 1, int maxCount = 0, int seed = 0)

    placeholderName - プレースホルダーの名前。空でない文字列である必要があります。

    count - Sitecoreがレンダリングするプレースホルダーの数を指定します。負でない数値である必要があります .

    maxCount - 動的に生成されるプレースホルダーの数の上限。負でない数値である必要があります。

    seed - 生成されたプレースホルダー キー サフィックスの開始値を計算するために使用される数値。負でない数値である必要があります。

@Html.Sitecore().DynamicPlaceholder("content"/*, optional parameters*/)

  • DynamicPlaceholder(string placeholderName, TagBuilder chrome, int count = 1, int maxCount = 0, int seed = 0)

    chrome- 動的に生成されたすべてのプレースホルダの各countをラップするHTMLタグを指定するTagBuilderオブジェクト。

  • DynamicPlaceholder (string placeholderName, Func<DynamicPlaceholderRenderContext, TagBuilder> chromeResolver, int count = 1, int maxCount = 0, int seed = 0)

    chromeResolver - 特定の動的プレースホルダーのTagBuilderラッパーを個別に生成する関数。 DynamicPlaceholderRenderContext.

  • DynamicPlaceholder(string placeholderName, Func<HtmlString, HtmlString> outputModifier, int count = 1, int maxCount = 0, int seed = 0)

    outputModifier - 特定のプレースホルダーのHTML出力を受け取り、変更されたHTMLを返す関数。

  • DynamicPlaceholder(string placeholderName, Func<HtmlString, DynamicPlaceholderRenderContext, HtmlString> outputModifier, int count = 1, int maxCount = 0, int seed = 0)

    outputModifier - 特定のプレースホルダー DynamicPlaceholderRenderContextのHTML出力を受け取り、変更されたHTMLを返す関数。

  • DynamicPlaceholder(DynamicPlaceholderDefinition definition)

    definition - 動的プレースホルダーを定義するためのすべてのオプションを集約します

プレースホルダー名をプレースホルダー キーとして使用する通常のSitecoreプレースホルダーとは異なり、動的プレースホルダーは一意のキーを生成します。

メモ

この記事では、non-SXA動的プレースホルダーについて説明します。 SXAプレースホルダー キー は、異なる規則に従います。

動的プレースホルダーキーは次のようになります。

{placeholder key}-{rendering unique suffix}-{unique suffix within rendering}

どこ

  • rendering unique suffix - プレースホルダーを含むレンダリングのUID。これにより、異なるレンダリング間でプレースホルダーキーの一意性が保証されます。

  • unique suffix within rendering - 動的に生成されたプレースホルダーのインデックス番号。最初の数字はSeedと等しくなります。

UIDのレンダリング内で動的プレースホルダー contentが使用され、UID {7a943e27-b649-400c-986d-33d07f0f50ca}count2,seed5であると仮定します。Sitecoreは、次のプレースホルダー キーを生成します。

  • content-{7a943e27-b649-400c-986d-33d07f0f50ca}-5

  • content-{7a943e27-b649-400c-986d-33d07f0f50ca}-6

次に、DynamicPlaceholderDefinitionの使用例を示します。

<div style="width: 100%;"> <ol> @Html.Sitecore().DynamicPlaceholder(new DynamicPlaceholderDefinition("ListItem") { Count = 5, MaxCount = 10, Seed = 100, OutputModifier = (input, context) => new HtmlString("<li>" + input + "</li>"), }) </ol> </div>
        

このコードは、ListItemをキーとする5つの動的プレースホルダーを生成します。ユーザーは、レンダリング パラメーターを使用して合計10個のプレースホルダーを追加できます。各プレースホルダーは <li> </li> タグでラップされます。

適切なOutputModifierでユーザーエクスペリエンスを向上させ、次のようにラムダを使用できます。

OutputModifier = (input, context) => string.Format("<div data-index=\"{0}\" data-dynamicId=\"{1}\" style=\"display: inline-block; width: 100px;\">", context.Index, context.DynamicKey)
        

このコードは、動的にレンダリングされる2番目の プレースホルダーに次のHTMLを提供します。

<div index="1" dynamicId="GridCell-{rendering UID}-101" style="display: inline-block; width: 100px;">
        

レンダリングパラメータからの動的プレースホルダのカスタマイズ

動的プレースホルダーは、追加のレンダリング パラメーターを使用してカスタマイズできます。これにより、Sitecoreが動的に生成するプレースホルダーの量を指定できます。パラメータは、たとえばOutputModifierに渡すDynamicPlaceholderRenderContext.Parametersディクショナリから読み取ることができます。

たとえば、DynamicPlaceholderDefinition,Countパラメーターをオーバーライドして、コードを変更せずにContent EditorまたはExperience EditorCountパラメーターを更新できることを意味します。

パラメータ名の形式は次のとおりです。

  • ph_placeholderKey_paramName

    例:

    名前: ph_column_count; 値: 5. "column" 動的プレースホルダは5つのプレースホルダを生成します。

    名前: ph_column_width; 値: 30px

  • ph_placeholderKey_indexNumber_paramName

    例:

    名前: ph_column_2_width; value: 50px."width" パラメータは、インデックス2のプレースホルダーが出力修飾子によって処理される間のみ渡されます。

キー生成のカスタマイズ

Sitecoreが動的プレースホルダー キーを生成する方法は、mvc.getDynamicPlaceholderKeysパイプラインでカスタマイズできます。このパイプラインには、次の3つの既定のプロセッサがあります。

  • GetRenderingUniqueSuffix

    このプロセッサの目的は、プレースホルダー キーをページ全体で一意にすることです。生成されたプレースホルダーを含むレンダリングのUIDを返します。

  • GetUniqueKeysWithinRendering

    このプロセッサの目的は、プレースホルダー キーを具象レンダリング内で一意にすることです。親レンダリング内の動的プレースホルダのインデックス番号を返します。この値は、レンダリング プロセス中に毎回生成されます。最初の値はSeedから取得され、次にインクリメントされます。

  • AggregatePlaceholderKeys

    このプロセッサは、集計プレースホルダー キーを返し、一意のサフィックスとレンダリング内の一意のサフィックスを次の形式でレンダリングします: {placeholder key}-{rendering unique suffix}-{unique suffix within rendering}。たとえば、GridCell-{7a943e27-b649-400c-986d-33d07f0f50ca}-0) です。

mvc.getDynamicPlaceholderKeysパイプラインを変更する場合は、mvc.getDynamicPlaceholderInitialKeyパイプラインも更新する必要があります。このパイプラインは、指定された動的プレースホルダーキーによって初期プレースホルダーキーを取得する役割を担います。現在の実装はRegExp -{0-9A-F{8}-0-9A-F{4}-0-9A-F{4}-0-9A-F{4}-0-9A-F{12}}-0-9+$ に基づいており、一意のプレースホルダー キー サフィックスを切り取ろうとします。

既知の制限事項

動的プレースホルダには、注意しなければならないいくつかの制限があります。

  • デフォルトでは、プレースホルダ設定は最初の動的プレースホルダキーでのみ機能します。

    たとえば、動的プレースホルダー @Html.Sitecore().DynamicPlaceholder("column", 2) は次のようになります。

    @Html.Sitecore().Placeholder("column-{…}-0")

    @Html.Sitecore().Placeholder("column-{…}-1").

    ユーザーは、列プレースホルダーに対してのみプレースホルダー設定を定義できます。プレースホルダー設定は、content-{…}-0content-{…}-1の両方に適用できます。特定の一意のプレースホルダー キー ( column-{…}-1など) のプレースホルダー設定を定義しても、Sitecore.Mvc.Pipelines.Response.GetDynamicPlaceholderInitialKey.RemovePlaceholderUniqueKeySuffixプロセッサが有効になっていない限り、効果はありません。

    modeoff: <mvc.getDynamicPlaceholderInitialKey><processor mode="off" type="Sitecore.Mvc.Pipelines.Response.GetDynamicPlaceholderInitialKey.RemovePlaceholderUniqueKeySuffix, Sitecore.Mvc"/></mvc.getDynamicPlaceholderInitialKey> に設定すると、特定の一意のプレースホルダーキーのプレースホルダー設定を定義できますが、動的プレースホルダーの初期キーnot

  • @Html.Sitecore().DynamicPlaceholder(…)のそれぞれの独立した呼び出しは、お互いについて何も知りません。そのため、同じ名前の2つの動的プレースホルダーを同じレンダリングに挿入すると、競合が発生します。例:

    @Html.Sitecore().DynamicPlaceholder("column", count: 2)

    @Html.Sitecore().DynamicPlaceholder("column")

    なる:

    Html.Sitecore().Placeholder("column-{…}-0")

    Html.Sitecore().Placeholder("column-{…}-1")

    Html.Sitecore().Placeholder("column-{…}-0")

    この状況で衝突を取り除くには、次のSeedを設定する必要があります。

    @Html.Sitecore().DynamicPlaceholder("column", count: 2)

    @Html.Sitecore().DynamicPlaceholder("column", seed: 10)

    なる:

    Html.Sitecore().Placeholder("column-{…}-0")

    Html.Sitecore().Placeholder("column-{…}-1")

    Html.Sitecore().Placeholder("column-{…}-10")

  • Countパラメータは、レンダリング パラメータを使用していつでもオーバーライドできるため、シードがカウント増加の余地で設定されているか、MaxCountを設定する必要があることに注意してください。

この記事を改善するための提案がある場合は、 お知らせください!