2011-11-07 3 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(); 
     } 
    } 
관련 문제