2011-09-14 9 views
5

En el kit de inicio que usa el constructor xpath, ¿cómo obtengo todos los elementos que heredan de la plantilla 'Sección del sitio' en el elemento Inicio?Recuperar elementos utilizando la consulta de sitecore

Cuando ejecuto el siguiente:

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

un artículo se devuelve /sitecore/content/Home/Products lo cual tiene sentido, sin embargo, lo siguiente no devuelve nada:

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

Lo que estoy tratando de hacer es crea un menú a partir de los elementos que heredan la plantilla 'Sección del sitio' utilizando el control web asp.net en lugar de xslt.

¿Alguna idea?

Gracias, Tarek

** ACTUALIZACIÓN

proporcionar más información sobre la cuestión:

artículo /sitecore/content/Home/Products tiene plantilla /sitecore/templates/Starter Kit/Site Sections/Product Section que cuenta con una plantilla de base de /sitecore/templates/Starter Kit/Item Types/Site Section

Si yo quiero los productos y referencias (similares a los productos) elementos en Inicio ejecutaría la siguiente consulta :

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

Hay una manera de obtener el elemento en Inicio que tiene la Sección del sitio como plantilla base. En xslt hay un método sc:GetItemsOfType('site section',$home/item) que lo hace.

** respuesta

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

Respuesta

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

Lo que sugeriría que hagas es la lógica de escritura para determinar si un artículo implementa una plantilla específica. Esto se puede hacer, por ejemplo, el uso de este código:

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

Usted da a esto el 'elemento' y el 'TemplateName' de la plantilla debe heredar de y se le devolverá un verdadero/falso. Por ejemplo, puede obtener una Lista y pasar por un foreach en el que filtra los elementos que no se heredan.

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

Espero que pueda hacer algo útil con la información anterior!

+0

Gracias, apreciar los detalles, pero el código es el mismo que ejecutar consulta:/Sitecore/contenido/home/* [@@ TEMPLATEKEY = 'sección de productos'] No es recoger el plantilla base de la sección del producto que debe ser la sección del sitio. –

5

El uso de // en la consulta lo hará recursivo donde / es solo para niños inmediatos. Esto tiene un impacto en el rendimiento.

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

Además, ¿no debería ser @@templatename y no @@templatekey?

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

plantilla clave siempre es minúscula templatename puede tener letra mayúscula, si las ha nombrado con mayúsculas, entonces templatekey es mejor usarlas. – Holger

+0

Gracias, pero esto no devuelve los elementos correctos. –

Cuestiones relacionadas