2011-09-14 5 views
5

xpath 빌더를 사용하는 시작 키트에서 홈 항목 아래의 '사이트 섹션'템플릿에서 상속 한 모든 항목을 얻는 방법은 무엇입니까?sitecore 쿼리를 사용하여 항목 검색

나는 다음과 실행하면 :

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

가 난 할 노력하고있어 것은 :

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

하나의 항목이 의미가 /sitecore/content/Home/Products을 반환하지만, 다음 아무것도 반환하지 않습니다 xslt 대신 asp.net 웹 컨트롤을 사용하여 'Site Section'템플릿을 상속하는 항목에서 메뉴를 빌드하십시오.

아이디어가 있으십니까?

감사합니다, 타렉

**

질문에 대한 추가 정보를 제공 UPDATE :

항목 /sitecore/content/Home/Products는 경우 /sitecore/templates/Starter Kit/Item Types/Site Section

의 기본 템플릿을 가지고 템플릿 /sitecore/templates/Starter Kit/Site Sections/Product Section을 가지고 I 집에서 제품 및 참조 (제품과 유사) 항목을 원한다면 다음 쿼리를 실행합니다. :

/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를 수행 할 수 있습니다.

위의 정보를 유용하게 활용하시기 바랍니다.

+0

덕분에, 세부 사항을 주셔서 감사합니다,하지만 코드는 쿼리를 실행하는 것과 동일합니다 :/sitecore/내용/홈/* [@@ templatekey = '제품 섹션'] 그것은 최대 따기 아니에요을 사이트 섹션이어야하는 제품 섹션의 기본 템플릿. –

5

쿼리에서 //을 사용하면 재귀 적으로 만들어집니다. 여기서 /은 바로 하위 항목입니다. 성능에 영향을 미칩니다.

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

, 그것은 @@templatename하지 @@templatekey 안?

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

templatekey는 항상 소문자입니다. templatename은 대문자로 이름을 붙인 경우 대문자를 사용할 수 있으므로 templatekey를 사용하는 것이 더 좋습니다. – Holger

+0

감사하지만 올바른 항목을 반환하지는 않습니다. –

관련 문제