不幸的是,Adam Najmanowicz 的回答中提到的管道适用于其他一些类型,如 Droplink 和 Multilist,但管道不适用于 Droptree 字段。
在深入研究之后,我发现 Droptree 字段的来源使用了错误的上下文项,正如 Adam 提到的,但代码来自 Droptree 字段本身:-
Sitecore.Shell.Applications.ContentEditor.Tree, Sitecore.Kernel
利用 Adam 回答中的查询字符串代码,我们可以创建一个“固定的”Droptree 自定义字段,它与常规 Droptree 几乎相同,但将使用正确的上下文项。代码将从普通的 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
}
}
上面的代码与基本Tree字段的 Source 属性几乎相同,除了如果我们检测到我们在呈现参数对话框中,我们会从 URL 中找出正确的上下文项。
要创建自定义字段,您只需按照此处所述编辑 Web.Config 文件。然后将自定义字段添加到核心数据库,如此处所述。
这意味着参数现在可以查询其来源,允许我们将可用项目限制为内容编辑器。(对于多站点解决方案很有用)。