2017-10-11 118 views
1

我試圖找到所有通過代碼繼承特定模板的模板。我有基本模板的標識(Base Web Page),並且遍歷Sitecore中的所有模板項目,以查找繼承Base Web Page的項目。C#Sitecore獲得繼承模板

foreach (var item in templateItems) 
{ 
    var baseTemplates = item.Template.BaseTemplates.ToList(); 
    foreach (var baseTemplate in baseTemplates) 
    { 
     if (baseTemplate.ID == templateItem.ID) 
     { 
      inheritors.Add(item.ID.ToString()); 
     } 
    } 
} 

然而,item.Template.BaseTemplates給我的根水平基本模板列表;而不是給我Base Web Page,它讓我從(AdvancedAppearanceHelp等)Base Web Page繼承

enter image description here

所以我不知道,如果該項目實際上是繼承Base Web Page與否的模板。

有沒有一種方法可以直接獲取模板?如何找到繼承Base Web Page的所有模板?

+0

你的解決之道在於LinkDatabase –

+0

關心詳細說明? –

回答

1

var baseTemplates = item.Template.BaseTemplates.ToList(); 

線的部分item.Template不正確。

item.Template返回/sitecore/templates/System/Templates/Template在這裏,所以你總是檢查一個BaseTemplateTemplate模板。

你的代碼應該是:

foreach (var item in templateItems) 
{ 
    var baseTemplates = new TemplateItem(item).BaseTemplates.ToList(); 
    foreach (var baseTemplate in baseTemplates) 
    { 
     if (baseTemplate.ID == templateItem.ID) 
     { 
      inheritors.Add(item.ID.ToString()); 
     } 
    } 
} 

而且更好的方法可以使用LinkDatabase找到從BaseTemplate場鏈接一樣,在你的項目的所有引用:

var links = Sitecore.Globals.LinkDatabase.GetItemReferrers(templateItem, false); 
foreach (var link in links) 
{ 
    if (link.SourceFieldID == Sitecore.FieldIDs.BaseTemplate) 
    { 
     inheritors.Add(link.SourceItemID.ToString()); 
    } 
}