Получить элементы, используя запрос sitecore - PullRequest
5 голосов
/ 14 сентября 2011

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 сентября 2011

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

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

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

/sitecore/content/home//*[@@templatename='site section']
5 голосов
/ 24 сентября 2011
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 голосов
/ 14 сентября 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;
    }

Вы даете этому 'item' и 'templatename' шаблона, от которого он должен наследоваться, и вам будет возвращено 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);
      }
   }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...