Получение элементов с помощью запроса sitecore

Как в стартовом наборе с помощью xpath builder получить все элементы, которые унаследованы от шаблона «Раздел сайта», в элементе «Главная»?

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

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

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

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

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

Любые идеи?

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

** ОБНОВЛЕНИЕ

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

Элемент /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);
}

person Community    schedule 14.09.2011    source источник


Ответы (2)


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

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

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

/sitecore/content/home//*[@@templatename='site section']
person Mark Ursino    schedule 14.09.2011
comment
templatekey всегда в нижнем регистре. templatename может иметь заглавную букву, если вы назвали их заглавными буквами, поэтому лучше использовать templatekey. - person Holger; 15.09.2011

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

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

Вы даете этому «элемент» и «имя шаблона» шаблона, от которого он должен наследоваться, и вам будет возвращено значение true/false. Например, вы можете получить список и пройти через 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);
      }
   }
}

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

person Younes    schedule 14.09.2011
comment
Спасибо, спасибо за подробности, но код такой же, как и при выполнении запроса: /sitecore/content/home/*[@@templatekey='product section'] Он не выбирает базовый шаблон раздела продукта, который должен быть разделом сайта. . - person ; 14.09.2011