2011-11-07 1 views
0

私は次の問題に直面しています:特定のテンプレート用のモバイルサイトを動的に追加したい、モバイルレイアウトを特定のアイテムの標準値に指定しました。これはすべて正常に動作しますが、Itemのフィールドを変更すると、デフォルトのサイトのレイアウトとレンダリングがなくなりました!誰もがこの問題の解決策/示唆を持っていますか?Sitecoreはプログラムでモバイルサイトを追加します

私はSitecore 6.4で作業しています。

前もって太もも!

私は現在使用している(これはアイテムにハードコードレイアウトを追加することで、私はこの問題を修正するとき、次のステップは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(); 
     } 
    } 
関連する問題