残念ながら、Adam Najmanowicz の回答で言及されているパイプラインは、Droplink や Multilist などの他のタイプでも機能しますが、パイプラインは Droptree フィールドでは実行されません。
これをさらに詳しく調べたところ、Adam が述べたように、ドロップツリー フィールドのソースが間違ったコンテキスト アイテムを使用していることがわかりましたが、コードはドロップツリー フィールド自体から来ています。
Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel
Adam の回答のクエリ文字列コードを利用して、通常のドロップツリーとほぼ同じですが、代わりに正しいコンテキスト アイテムを使用する「固定」ドロップツリー カスタム フィールドを作成できます。コードは通常の Tree コントロールから継承し、Source プロパティの設定方法のみを変更します。
public class QueryableTree : Sitecore.Shell.Applications.ContentEditor.Tree
{
// override the Source property from the base class
public new string Source
{
get
{
return StringUtil.GetString(new string[]
{
base.Source // slightly altered from the original
});
}
set
{
Assert.ArgumentNotNull(value, "value");
if (!value.StartsWith("query:", StringComparison.InvariantCulture))
{
base.Source = value; // slightly altered from the original
return;
}
Item item = Client.ContentDatabase.GetItem(this.ItemID);
// Added code that figures out if we're looking at rendering parameters,
// and if so, figures out what the context item actually is.
string url = WebUtil.GetQueryString();
if (!string.IsNullOrWhiteSpace(url) && url.Contains("hdl"))
{
FieldEditorParameters parameters = FieldEditorOptions.Parse(new UrlString(url)).Parameters;
var currentItemId = parameters["contentitem"];
if (!string.IsNullOrEmpty(currentItemId))
{
Sitecore.Data.ItemUri contentItemUri = new Sitecore.Data.ItemUri(currentItemId);
item = Sitecore.Data.Database.GetItem(contentItemUri);
}
}
if (item == null)
{
return;
}
Item item2 = item.Axes.SelectSingleItem(value.Substring("query:".Length));
if (item2 == null)
{
return;
}
base.Source = item2.ID.ToString(); // slightly altered from the original
}
}
上記のコードは、基本ツリーフィールドの Source プロパティとほぼ同じですが、レンダリング パラメーター ダイアログにいることを検出した場合に、URL から適切なコンテキスト アイテムを見つけ出す点が異なります。
カスタム フィールドを作成するには、ここで説明されているように Web.Config ファイルを編集するだけです。次に、ここで説明されているように、コア データベースにカスタム フィールドを追加します。
これは、パラメーターがソースのクエリを持つことができるようになり、使用可能なアイテムをコンテンツ エディターに制限できるようになったことを意味します。(マルチサイト ソリューションに役立ちます)。