2011-09-14 3 views
5

В стартовом наборе, использующем конструктор xpath, как получить все элементы, которые наследуются от шаблона «Site Section» в разделе «Дом»?Извлечь элементы, используя запрос sitecore

Когда я запускаю следующее:

/sitecore/content/home/*[@@templatekey='product section'] 

один элемент возвращается /sitecore/content/Home/Products, который имеет смысл, однако, следующее ничего не вернуть:

/sitecore/content/home/*[@@templatekey='site section'] 

То, что я пытаюсь сделать, это создайте меню из элементов, которые наследуют шаблон «Site Section», используя веб-управление asp.net вместо xslt.

Любые идеи?

Спасибо, Тарек

** UPDATE

предоставить дополнительную информацию по этому вопросу:

Пункт /sitecore/content/Home/Products имеет шаблон /sitecore/templates/Starter Kit/Site Sections/Product Section, который имеет базовый шаблон /sitecore/templates/Starter Kit/Item Types/Site Section

Если я хотите товары и ссылки (похожие на продукты) в разделе «Главная». Я бы выполнил следующий запрос :

/sitecore/content/home/*[@@templatekey='product section' or @@templatekey='references section'] 

Есть ли способ получить элемент под Домом, который имеет раздел сайта в качестве базового шаблона. В xslt существует метод sc:GetItemsOfType('site section',$home/item), который делает это.

** Ответ

var homeItem = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartPath); 
var siteSectionItems = new List<Item>(); 

foreach (Item item in homeItem.Children) 
{ 
    var itemTemplate = TemplateManager.GetTemplate(item); 

    if (itemTemplate.InheritsFrom("Site Section")) 
     siteSectionItems.Add(item); 
} 

ответ

5
var homeItem = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartPath); 
var siteSectionItems = new List<Item>(); 

foreach (Item item in homeItem.Children) 
{ 
    var itemTemplate = TemplateManager.GetTemplate(item); 

    if (itemTemplate.InheritsFrom("Site Section")) 
     siteSectionItems.Add(item); 
} 
0

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

/// <summary> 
    /// Determines if the item implements the specified template. 
    /// </summary> 
    /// <param name="item">The item to check.</param> 
    /// <param name="templateName">Name of the template.</param> 
    /// <returns> 
    /// A boolean indicating weather the item implements the template or not 
    /// </returns> 
    public static bool DoesItemImplementTemplate(Item item, string templateName) 
    { 
     if (item == null || item.Template == null) 
     { 
      return false; 
     } 

     var items = new List<TemplateItem> { item.Template }; 
     int index = 0; 

     // flatten the template tree during search 
     while (index < items.Count) 
     { 
      // check for match 
      TemplateItem template = items[index]; 
      if (template.Name == templateName) 
      { 
       return true; 
      } 

      // add base templates to the list 
      items.AddRange(template.BaseTemplates); 

      // inspect next template 
      index++; 
     } 

     // nothing found 
     return false; 
    } 

Вы даете это «элемент» и «TemplateName» шаблона он должен наследовать и вы будете возвращены истина/ложь. Например, вы можете получить список и пройти через foreach, в котором вы отфильтровываете элементы, которые не являются наследованием.

List<Item> completeList = new List<Item>(); 
completeList = Sitecore.Context.Item.Children().toList<Item>(); 

List<Item> correctItemList = new List<Item>(); 

foreach(Item thisItem in completeList) 
{ 
    if(DoesItemImplementTemplate(thisItem, "myTemplate") 
    { 
     if(!correctItemList.Contains(thisItem) 
     { 
     correctItemList.Add(thisItem); 
     } 
    } 
} 

Надеюсь, вы можете сделать что-то полезное с вышеуказанной информацией!

+0

Спасибо, оценить детали, но код так же, как работает запрос:/Sitecore/содержание/дома/* [@@ templatekey = 'раздел продукции'] Это не подбирая базовый шаблон раздела продукта, который должен быть участком сайта. –

5

Использование // в запросе сделает его рекурсивным, где / является непосредственным ребенком. Это влияет на производительность.

/sitecore/content/home//*[@@templatekey='site section'] 

Кроме того, она не должна быть @@templatename и не @@templatekey?

/sitecore/content/home//*[@@templatename='site section'] 
+0

templatekey всегда в нижнем регистре templatename может иметь прописную букву, если вы назвали ее с прописными буквами, поэтому лучше использовать шаблон. – Holger

+0

Спасибо, но это не возвращает правильные элементы. –

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