2011-11-25 71 views
3

我需要将许多模板字段上的Shared属性设置为false。是否有一种简单的方法可以在代码不更改字段ID的情况下执行此操作?我写了下面的代码,但它似乎没有更新该属性。设置项目中所有模板的Sitecore字段共享

Sitecore.Data.Database masterDb = Sitecore.Configuration.Factory.GetDatabase("master"); 

using (new Sitecore.SecurityModel.SecurityDisabler()) 
{ 
    try 
    { 
     var templates = TemplateManager.GetTemplates(masterDb); 

     foreach (var template in templates.Values) 
     { 
      if (template.FullName.StartsWith("FolderName")) 
      { 
       foreach (var field in template.GetFields(false)) 
       { 
        TemplateManager.ChangeFieldSharing(field, TemplateFieldSharing.None, masterDb); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
} 

回答

7

虽然TemplateManager.GetTemplates通话让你的Template对象的集合,你需要什么TemplateItem对象,以便能够对其进行编辑。您可以使用该ID从您现有的Database对象中获取该ID。

然后您需要遍历模板的每个TemplateSectionItem,然后才能获得TemplateFieldItem,您可以在其中访问InnerItem属性并更改共享字段。您还需要标记BeginEdit()EndEdit(),以便您可以执行更改。

Sitecore.Data.Database masterDb = Sitecore.Configuration.Factory.GetDatabase("master"); 

using (new Sitecore.SecurityModel.SecurityDisabler()) 
{ 
    try 
    {      
     var templates = TemplateManager.GetTemplates(masterDb); 

     foreach (var template in templates.Values) 
     {       
      if (template.FullName.StartsWith("FolderName")) 
      {        
       var tmpl = masterDb.GetTemplate(template.ID); 

       foreach (var section in tmpl.GetSections()) 
       {         
        foreach (var templateFieldItem in section.GetFields()) 
        { 
         templateFieldItem.BeginEdit(); 
         templateFieldItem.InnerItem[TemplateFieldIDs.Shared] = "0"; 
         templateFieldItem.EndEdit(); 
        }  
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.Write("Error" + ex.Message); 
    } 
} 

希望这有助于:)

+0

这看起来像一个坚实的解决方案。 +1 – Younes

+0

看起来像...但它会引发FieldSharingChangedRemoteEvent?我不太确定。 –