Sitecore树列表数据源 - VersionExist

时间:2014-01-30 09:22:03

标签: sitecore treelist

在Sitecore Treelist控件中,我想只获取列出的元素,这些元素具有该语言的版本。

我进行了搜索,发现有包含/排除项目/模板的参数。但我不能给出类似Versions.Count>的条件。 0

有没有办法通过将参数传递给模板的数据源字段来实现?

或者我是否需要覆盖树形图控件?

感谢名单

1 个答案:

答案 0 :(得分:3)

这似乎有效,但我没有广泛测试......

首先创建一个继承自MasterDataView的类。请注意,由于您只关注基于当前上下文语言的过滤,因此我没有明确地使用特定语言获取项目。如果您想更明确地了解相关信息,请参阅以下答案:https://stackoverflow.com/a/8232087/2911685

public class LanguageFilteringMasterDataView : MasterDataView
{
    protected override void GetChildItems(ItemCollection items, Item item)
    {
        base.GetChildItems(items, item);
        this.FilterItemsWithNoVersionInLanguage(items);
    }

    protected virtual void FilterItemsWithNoVersionInLanguage(ItemCollection items)
    {
        for (var i = items.Count - 1; i >= 0; i--)
        {
            if (items[i].Versions.Count <= 0)
            {
                items.RemoveAt(i);
            }
        }
    }
}

然后使用config include:

注册此类
    <dataviews>
        <dataview name="LanguageFilteredMaster" assembly="sc70" type="sc70.Controls.LanguageFilteringMasterDataView" Parameters=""/>
    </dataviews>

然后创建自定义treelist类:

public class LanguageFilteringTreelist : TreeList
{
    private const string DataViewName = "LanguageFilteredMaster";

    protected override void OnLoad(EventArgs args)
    {
        base.OnLoad(args);
        var dataContext = this.FindDataContext();
        if (dataContext != null)
        {
            dataContext.DataViewName = DataViewName;
        }
    }

    protected virtual DataContext FindDataContext()
    {
        if (this.Controls.Count <= 0)
        {
            return null;
        }

        var child = this.Controls[0];
        return child.Controls.OfType<DataContext>().FirstOrDefault();
    }
}

最后,转到您的Core数据库并将此类注册为新的字段类型。

<强>更新

如评论中所述,扩展子项时上述解决方案无法正常工作。它不是根据当前项目版本的语言进行过滤,而是根据shell的当前上下文语言进行过滤。这是因为作为TreeList控件的子控件的TreeviewEx控件仅查看语言参数的查询字符串。如果未找到,则默认为上下文语言。幸运的是,我们可以对javascript进行非常简单的更改,使其也可以查找隐藏的scLanguage字段。该文件位于\ sitecore \ shell \ Controls \ TreeviewEx \ TreeviewEx.js。更改onTreeGlyphClick函数中的第63行。

旧:

var contentLanguage = Sitecore.getUrlParameterValue("la");

新:

var contentLanguage = Sitecore.getUrlParameterValue("la") || $F('scLanguage');