2014-01-30 7 views
0

в элементе управления Sitecore Treelist, я хочу получить только перечисленные элементы, которые имеют версию на этом языке.Sitecore Tree list datasource - VersionExist

Я сделал поиск и выяснил, что есть параметры для включения/исключения элементов/шаблонов. Но я не могу дать в таком состоянии, как Versions.Count> 0

Есть ли способ сделать это, передав параметр в поле источника данных шаблона?

Или мне нужно переписать элемент управления теневиком?

Thanx

+0

Вы не можете сделать это из коробки, так что вам нужно, чтобы написать свой собственный TreeList. Вы можете переопределить метод Add() и создать предупреждение, если версия не существует. Но почему вы хотите это сделать? Если кто-то удаляет версию элемента, указанного в вашем поле, он остается ссылкой и данные древовидной железы становятся «недействительными». Почему бы не проверять допустимые версии при запросе всех элементов в поле treelist для презентации? –

+0

Требование состоит в том, что элементы, которые не имеют версий, не должны отображаться в списке (я имею в виду список левой стороны элемента управления древовидной структурой). Btw, вы имеете в виду переопределение метода Добавить в Sitecore.Shell.Applications.ContentEditor.TreeList класс? Затем, в каком конфигурационном файле я должен ссылаться на свой новый класс CustomTreeList? – EngelbertCoder

+0

@EngelbertCoder Эта ссылка поможет вам начать создание настраиваемого типа поля http://sdn.sitecore.net/Articles/API/Creating%20a%20Composite%20Custom%20Field.aspx –

ответ

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); 
      } 
     } 
    } 
} 

Затем зарегистрировать этот класс конфига включают в себя:

<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'); 
+0

Большое спасибо за этот обширный ответ. В принципе, он работает, но он проверяет только дочерние элементы первого уровня корня источника данных. Он не проверяет подпункты (если на этом языке есть только один подэлемент, он отображает все подэлементы) Можете ли вы предложить модификацию, чтобы дети также были отфильтрованы с версиями? – EngelbertCoder

+0

Он работает для меня на подэлементах. Он должен выполнять метод GetChildItems в представлении данных каждый раз, когда вы расширяете узел. Возможно, попробуйте войти в код, чтобы убедиться, что он вызван. –

+0

Подождите ... Я вижу проблему с подэлементами, но не с тем, что вы описали. Я еще раз посмотрю. –

Смежные вопросы