挿入ルールをアイテムもしくは データテンプレートのスタンダードヴァリューに設定することで アイテムもしくはデータテンプレートに関連した アイテムの 挿入オプションを動的に制御できるようになります。今回はカスタムの挿入ルールを作成する手順の覚書を記載します。
今回の挿入ルールは データ定義クックブックの サンプルを使用しています。
検証環境
- Sitecore CMS 6.6 Service Pack 1
- .NET 4.0
1. 挿入ルールクラスの作成
挿入ルールの実態は .NET のクラスです。なので、挿入ルールを実装するクラスを定義する必要があります。今回は PreventChildrenWithCommonTemplate というクラスを作成しました。カスタム挿入ルールクラスを作成する場合 Sitecore.Data.Masters.InsertRule を継承します。サンプルコードのよう Int32 型の値を引数に取るコンストラクタを作成します。あとはExpandメソッドをオーバーライドし挿入オプションを追加したり削除するような処理を記述していきます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace SCSupport.Core
{
public class PreventChildrenWithCommonTemplate : Sitecore.Data.Masters.InsertRule
{
public PreventChildrenWithCommonTemplate(System.Int32 count)
{
}
public override void Expand(System.Collections.Generic.List<Sitecore.Data.Items.Item> insertOptions, Sitecore.Data.Items.Item item)
{
// 挿入オプションで設定されたテンプレートのIDとサブアイテムのデータテンプレートのIDを比較し、
// 挿入オプションと同じデータテンプレートから作成されたアイテムがある場合は、挿入オプションから除外する。
foreach (Sitecore.Data.Items.Item insertOption in insertOptions.ToArray())
{
if (item.Axes.SelectSingleItem("./*[@@templateid='" + insertOption.ID + "']") != null)
{
insertOptions.Remove(insertOption);
}
}
}
}
}
今回作成した挿入オプションルールでは、親アイテムと同じデータテンプレートを持つアイテムの種類(データテンプレート)が挿入オプションに含まれる場合、そのアイテムの種類(データテンプレート)を除外しています。つまり、親アイテムと同じデータテンプレートのサブアイテムを作成することができなくなります。
2. 挿入ルール定義アイテムの作成
クラスを作成したので 挿入ルール定義アイテムを作成します。挿入ルールの定義アイテムは /siteocre/システム/設定/挿入ルール 配下に作成します。挿入ルールアイテムをコンテンツツリー上で選択して、 挿入グループから 挿入ルールを選択します。

今回は 下図のように PreventChildrenWithCommonTemplate という名前で挿入ルール型の定義アイテムを作成しました。

作成した挿入ルール型アイテムのタイプフィールドに 下図のように 挿入ルールを実装するクラスのシグネチャを設定します。

3.挿入ルールの割り当て
挿入ルールの準備ができました。あとは挿入ルールを定期したいコンテンツのアイテムやデータテンプレートのスタンダードヴァリューアイテムに使用する挿入ルールを設定します。
設定したアイテムを選択して、 リボンの設定タブの割り当てコマンドをクリックします。下図のように挿入オプション画面が表示されます。挿入ルールタブをクリックすると、挿入ルールのツリーが表示されるので適用したい挿入ルールを選択します。

4. まとめ
説明は以上です。挿入ルールを使用することで個別のアイテムもしくはデータテンプレートと関連をもつアイテムに対して 挿入オプションを動的に追加、削除することができるようになります。
そのほか、挿入オプションパイプラインにカスタムプロセッサを追加したり、挿入オプションルールを定義することで挿入オプションを動的に制御することもできますが、この場合すべてのアイテムに対して共通の挿入オプションの動的な制御を行いたい場合に使用します。