【问题标题】:Sitecore Tree list datasource - VersionExistSitecore 树列表数据源 - VersionExist
【发布时间】:2014-01-30 09:22:03
【问题描述】:

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

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

这样的条件

有没有办法通过将参数传递给模板的数据源字段来做到这一点?

或者我需要覆盖树列表控件吗?

感谢

【问题讨论】:

  • 您不能开箱即用地执行此操作,因此您需要编写自定义 TreeList。如果不存在版本,您可以覆盖方法 Add() 并生成警报。但是你为什么要这样做呢?如果有人删除了您的字段中引用的某个项目的版本,它会保持引用状态,并且您的树形列表数据会“无效”。为什么在查询演示文稿的树列表字段中的所有项目时不检查有效版本?
  • 要求是没有版本的项目不应该显示在列表中(我的意思是treelist控件的左侧列表)顺便说一句,你的意思是覆盖Sitecore.Shell中的方法Add。 Applications.ContentEditor.TreeList 类?那么,我应该在哪个配置文件中引用我的新 CustomTreeList 类?
  • @EngelbertCoder 此链接将帮助您开始创建自定义字段类型sdn.sitecore.net/Articles/API/…
  • 请看@TwentyGotoTen 的回答。 Add() 方法在作者想要将广告项添加到他的列表时调用。这并不完全符合您的要求,因为仍然显示所有项目。为了满足您的要求,我认为您需要覆盖TreeList 的呈现。看看OnLoad() 方法,有一个dataContext.Filter 属性接受Sitecore 查询。如果您可以进行查询以过滤您的项目,那么这就是方法。否则我认为您还必须覆盖TreeviewEx WebControl(用于TreeListOnLoad())。
  • John West 也有一些优秀的博客文章解释了如何创建自定义 TreeList,例如:sitecore.net/unitedkingdom/community/technical-blogs/…

标签: sitecore treelist


【解决方案1】:

这似乎可行,但我没有进行广泛的测试......

首先创建一个继承自 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);
            }
        }
    }
}

然后使用配置注册这个类:

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

然后创建您的自定义树列表类:

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 数据库并将此类注册为新的字段类型。

更新

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

旧:

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

新:

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

【讨论】:

  • 非常感谢您的广泛回答。原则上,它可以工作,但它只检查数据源根目录的第一级子项。它不检查子项(如果该语言只有一个子项,它会显示所有子项)您能否提供修改,以便子项也被版本过滤?
  • 它适用于我的子项目。每次展开节点时,它都应该在数据视图上执行 GetChildItems 方法。也许尝试进入代码以确保它被调用。
  • 等等...我确实看到子项目有问题,但不是你描述的那个。我再看看。
  • 好的,我对树列表控件有了新的反感。扩展太难了。但是,我确实找到了解决该问题的方法。我会更新答案以包含它。
  • 只是为了确认,这仍然适用于 8.1 -3。唯一的区别是javascript代码。您无需再进行更改,因为 sitecore 现在将所选语言附加到 html 中,例如:&lt;input id="FIELD9318757_all_Language" type="hidden" value="en-CA"&gt; 您可以在 sitecore 的 stackexchange sitecore.stackexchange.com/questions/21/… 上看到更新
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多