---
title: "動的プレースホルダー"
slug: "dynamic-placeholders"
abstract: "動的プレースホルダーを使うと、同じプレースホルダー名を何度も追加できます"
---
# 動的プレースホルダー

動的プレースホルダーを使うと、同じプレースホルダー名を何度も追加できます。複数のレンダリングにまたがることができ、同じプレースホルダーを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\- 特定のプレースホルダーのHTML出力を受け入れ、修正されたHTMLを返す関数DynamicPlaceholderRenderContext
    
-   DynamicPlaceholder(DynamicPlaceholderDefinition definition)
    
    definition - 動的なプレースホルダーを定義するためのすべてのオプションを集約する
    

通常のSitecoreのプレースホルダーがプレースホルダー名をプレースホルダーキーとして使うのに対し、動的プレースホルダーは一意キーを生成します。

> !注この記事は *非SXA*の動的プレースホルダーについて言及しています。 [SXAのプレースホルダーキー](https://doc.sitecore.com/xp/en/developers/sxa/103/sitecore-experience-accelerator/walkthrough--building-a-simple-rendering-960026.html) は異なる慣例に従っています。

動的プレースホルダーキーは以下の通りです:

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

ここで

-   rendering unique suffix - プレースホルダーを含むレンダリングのUIDです。これにより、異なるレンダリング間でプレースホルダーキーの一意性が保証されます。
-   unique suffix within rendering - 動的に生成されたプレースホルダーのインデックス番号。最初の数値は Seedに等しい。

動的プレースホルダー contentがUID {7a943e27-b649-400c-986d-33d07f0f50ca}、count\`\`2, 、seedが5でレンダリング中に使用されていると仮定します。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を用いて、次のようなlambdaを使えばユーザー体験を向上させることができます。

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パラメータを上書きして、コードを変えずに**コンテンツエディター**や**エクスペリエンスエディター**からCountパラメータを更新できるということです。

パラメータ名のフォーマットは以下の通りです:

-   ph\_placeholderKey\_paramName
    
    例:
    
    名前: ph\_column\_count;値:5。「列」動的なプレースホルダーは5つのプレースホルダーを生成します。
    
    名前: ph\_column\_width;値:30px
    
-   ph\_placeholderKey\_indexNumber\_paramName
    
    例:
    
    名前: ph\_column\_2\_width; value: 50px。「width」パラメータは、インデックス2のプレースホルダーが出力修飾子によって処理される間のみ渡されます。
    

## 鍵生成のカスタマイズ

mvc.getDynamicPlaceholderKeysパイプラインで動的なプレースホルダーキーを生成する方法Sitecoreカスタマイズできます。このパイプラインには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-{…}-0とcontent-{…}-1の両方に適用可能です。特定の一意のプレースホルダーキー(例: column-{…}-1)のプレースホルダー設定を定義しても、Sitecore.Mvc.Pipelines.Response.GetDynamicPlaceholderInitialKey.RemovePlaceholderUniqueKeySuffixプロセッサが有効化されていない限り効果はありません。
    
    modeがoff: <mvc.getDynamicPlaceholderInitialKey><processor mode="off" type="Sitecore.Mvc.Pipelines.Response.GetDynamicPlaceholderInitialKey.RemovePlaceholderUniqueKeySuffix, Sitecore.Mvc"/></mvc.getDynamicPlaceholderInitialKey>に設定されると、特定の一意のプレースホルダーキーのプレースホルダー設定を定義できますが、動的プレースホルダーの初期キーについては**定義できません**。
    
-   それぞれの独立した @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を設定する必要があります。