在 Sitecore Treelist 控件中,我只想获取列出的元素,这些元素具有该语言的版本。
我进行了搜索,发现有包含/排除项目/模板的参数。但我不能给出像 Versions.Count > 0 这样的条件
有没有办法通过将参数传递给模板的数据源字段来做到这一点?
还是我需要覆盖树列表控件?
谢谢
这似乎有效,但我没有广泛测试它......
首先创建一个继承自 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 数据库并将此类注册为新的字段类型。
更新
如评论中所述,上述解决方案在展开子项时无法正常工作。它不会根据当前项目版本的语言进行过滤,而是根据 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');