6

我有一个应用于子布局的渲染参数模板。它上面有一个 Droptree 字段,我想将该字段的 Source 设置为 Sitecore 查询,以便我可以限制该字段的可用选项。

来源可以是:

query:./*

或者

query:./ancestor-or-self::*[@@templatename='MyTemplate']/

查询只需要获取与我们所在的内容项相关的项。这通常适用于内容编辑器中的 Droptree 字段。

但是我发现查询在这里不起作用,因为我们在渲染参数中,所以它没有使用内容项作为它的上下文。查询失败,我只得到了完整的 Sitecore 树。

我发现这可以通过以下链接使用“可查询数据源位置”来修复数据源字段:- http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/

但是我不知道从哪里开始让这个对其他渲染参数字段起作用。

有任何想法吗?(我使用的是 Sitecore 6.6 Update 5)

4

2 回答 2

7

不幸的是,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 文件。然后将自定义字段添加到核心数据库,如此所述。

这意味着参数现在可以查询其来源,允许我们将可用项目限制为内容编辑器。(对于多站点解决方案很有用)。

于 2013-08-05T14:13:16.190 回答
5

这里的关键是将字段编辑器的上下文设置为相对于您正在编辑的项目而不是渲染参数(我认为它默认具有)。所以你可以有处理器:

public class ResolveRelativeQuerySource
{
    public void Process(GetLookupSourceItemsArgs args)
    {
        Assert.IsNotNull(args, "args");
        if (!args.Source.StartsWith("query:"))
            return;
        Item contextItem = null;
        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);
                contextItem = Sitecore.Data.Database.GetItem(contentItemUri);
            }
        }
        else
        {
            contextItem = args.Item;
        }
    }
}

上钩为:

<sitecore>
  <pipelines>
    <getLookupSourceItems>
    <processor patch:before="*[@type='Sitecore.Pipelines.GetLookupSourceItems.ProcessQuerySource, Sitecore.Kernel']"
        type="Cognifide.SiteCore.Logic.Processors.ResolveRelativeQuerySource, Cognifide.SiteCore" />
    </getLookupSourceItems>
  </pipelines>
</sitecore>

与 Przemek 博客中的 ResolveQueryableDatasources 一起,这应该可以解决您的问题。

于 2013-08-05T07:38:14.087 回答