Это похоже на работу, но я не проверял его широко ...
Сначала нужно создать класс, который наследуется от 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>
Затем создать свой собственный класс 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 и зарегистрируйте этот класс как новый тип поля.
Update
Как было отмечено в комментариях, выше решение не работает должным образом при расширении подразделов. Вместо фильтрации по языку текущей версии элемента он будет фильтроваться на основе текущего языка интерфейса оболочки. Это связано с тем, что элемент управления TreeViewEx, который является дочерним элементом управления элементом управления TreeList, смотрит только на строку запроса для параметра языка. Если ни один не найден, по умолчанию используется контекстный язык. К счастью, мы можем внести очень простое изменение в javascript, чтобы он также искал скрытое поле scLanguage. Файл находится в папке \ sitecore \ shell \ Controls \ TreeviewEx \ TreeviewEx.js. Измените строку 63 в функции onTreeGlyphClick.
Старый:
var contentLanguage = Sitecore.getUrlParameterValue("la");
Новое:
var contentLanguage = Sitecore.getUrlParameterValue("la") || $F('scLanguage');
Вы не можете сделать это из коробки, так что вам нужно, чтобы написать свой собственный TreeList. Вы можете переопределить метод Add() и создать предупреждение, если версия не существует. Но почему вы хотите это сделать? Если кто-то удаляет версию элемента, указанного в вашем поле, он остается ссылкой и данные древовидной железы становятся «недействительными». Почему бы не проверять допустимые версии при запросе всех элементов в поле treelist для презентации? –
Требование состоит в том, что элементы, которые не имеют версий, не должны отображаться в списке (я имею в виду список левой стороны элемента управления древовидной структурой). Btw, вы имеете в виду переопределение метода Добавить в Sitecore.Shell.Applications.ContentEditor.TreeList класс? Затем, в каком конфигурационном файле я должен ссылаться на свой новый класс CustomTreeList? – EngelbertCoder
@EngelbertCoder Эта ссылка поможет вам начать создание настраиваемого типа поля http://sdn.sitecore.net/Articles/API/Creating%20a%20Composite%20Custom%20Field.aspx –