2017-10-11 4 views
1

私はコードを通して特定のテンプレートを継承するすべてのテンプレートを見つけようとしています。私は基本テンプレート(Base Web Page)のIDを持っており、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を継承されているかどうか代わりに私にBase Web Pageを与える、それは私に(AdvancedAppearanceHelp、など)からBase Web Page継承

enter image description here

テンプレートを与えるので、私は知りません。

直接継承されたテンプレートを取得する方法はありますか? 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()); 
     } 
    } 
} 

、より良いアプローチは、そのようBaseTemplateフィールドからリンクあなたの項目のすべての参照元を見つけるためにLinkDatabaseを使用することができる。

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