2011-11-07 36 views
0

我面臨以下問題:我想爲特定模板動態添加移動網站,我在特定項目的標準值中指定了移動版面。這一切都可以正常工作,但是當我更改了Item的字段時,默認網站的佈局和渲染消失了!有沒有人有這個問題的解決方案/建議?Sitecore以編程方式添加手機網站

我正在使用Sitecore 6.4。

Thanx提前!

我目前使用的代碼(這是添加硬編碼的佈局,以一個項目,下一步就是(當我解決了這個問題),以獲得從standard_values項目佈局)

public class CheckMobileLayout 
    { 
    public void Process([NotNull] SaveArgs args) 
    { 
     try 
     { 
      foreach (Sitecore.Pipelines.Save.SaveArgs.SaveItem saveItem in args.Items) 
      { 
       Item orgItem = Context.ContentDatabase.Items[saveItem.ID, saveItem.Language, saveItem.Version]; 
       if(orgItem.Name != "Content Editor") 
       { 
        TemplateItem testTemplate = orgItem.Template; 

        foreach (Field orgField in orgItem.Fields) 
        { 
         if (orgField != null) 
         { 
          if (orgField.GetTemplateField().Type == "Mobile Checkbox") 
          { 
           foreach (Sitecore.Pipelines.Save.SaveArgs.SaveField saveField in saveItem.Fields) 
           { 
            if (saveField.ID == orgField.ID) 
            { 
             if (saveField.Value != orgField.Value) 
             { 
              if (saveField.Value == "1") AddMobileLayout(orgItem); 
              else RemoveMobileLayout(orgItem); 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     catch (NullReferenceException) 
     { 
     } 
    } 

    private void RemoveMobileLayout(Item orgItem) 
    { 
     using (new SecurityDisabler()) 
     { 
      Database masterDatabase = Database.GetDatabase("master"); 
      orgItem = masterDatabase.GetItem(orgItem.Paths.Path); 
      string renderingXml = orgItem[Strings.Renderings]; 

      LayoutDefinition layoutDefinition = new LayoutDefinition(); 
      layoutDefinition.LoadXml(renderingXml); 

      string mobileDeviceId = Strings.mobileDeviceID; 
      DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(mobileDeviceId); 

      deviceDefinition.Layout = String.Empty; 

      string outputXml = layoutDefinition.ToXml(); 
      Log.Info(outputXml, this); 
      orgItem.Editing.BeginEdit(); 
      orgItem[Strings.Renderings] = outputXml; 
      orgItem.Editing.EndEdit(); 
     } 
    } 

    private void AddMobileLayout(Item orgItem) 
    { 
     using (new SecurityDisabler()) 
     {     
      Database masterDatabase = Database.GetDatabase("master"); 
      Item testItem = masterDatabase.GetItem(orgItem.Paths.Path); 
      string renderingXml = testItem[Strings.Renderings]; 


      LayoutDefinition layoutDefinition = new LayoutDefinition(); 
      layoutDefinition.LoadXml(renderingXml); 

      string mobileDeviceId = Strings.mobileDeviceID; 
      DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(mobileDeviceId); 

      deviceDefinition.Layout = Strings.mobileLayoutID; 

      string outputXml = layoutDefinition.ToXml(); 

      testItem.Editing.BeginEdit(); 
      testItem[Strings.Renderings] = layoutDefinition.ToXml(); 
      testItem.Editing.EndEdit(); 
     } 
    } 
} 

回答

1

我已經用下面的方法解決了這個問題:

 protected void RemoveMobileLayout(Item item) 
    { 
     using (new SecurityDisabler()) 
     { 
      LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]); 
      DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID); 

      if (mobileDevice.Layout != null) mobileDevice.Layout = null; 
      if (mobileDevice.Renderings != null) mobileDevice.Renderings = null; 

      item.Editing.BeginEdit(); 
      item[Sitecore.FieldIDs.LayoutField] = layoutDefinition.ToXml(); 
      item.Editing.EndEdit(); 
     } 
    } 

    protected void AddMobileLayout(Item item) 
    { 
     using (new SecurityDisabler()) 
     { 
      LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]); 
      DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID); 
      TemplateItem itemTemplate = item.Template; 

      if (itemTemplate != null) 
      { 
       if (itemTemplate.StandardValues != null) 
       { 
        Item standardValues = itemTemplate.StandardValues; 

        foreach (DeviceItem deviceItem in Sitecore.Configuration.Factory.GetDatabase("master").Resources.Devices.GetAll()) 
        { 
         if (deviceItem.ID.ToString() == Resources.mobileDeviceID) 
         { 
          mobileDevice.Layout = standardValues.Visualization.GetLayout(deviceItem).ID.ToString(); 
          RenderingReference[] sublayouts = standardValues.Visualization.GetRenderings(deviceItem, true); 

          foreach (RenderingReference sublayout in sublayouts) mobileDevice.AddRendering(new RenderingDefinition() { ItemID = sublayout.RenderingItem.ID.ToString(), Placeholder = sublayout.RenderingItem.Placeholder }); 
         } 
        } 
       } 
      } 
      item.Editing.BeginEdit(); 
      item[Sitecore.FieldIDs.LayoutField] = layoutDefinition.ToXml(); 
      item.Editing.EndEdit(); 
     } 
    } 
相關問題