Sitecore添加可编程移动站点

本文关键字:站点 移动 可编程 添加 Sitecore | 更新日期: 2023-09-27 18:13:47

我面临以下问题:我想动态添加一个移动站点的特定模板,我在移动布局中指定了特定项的标准值。这一切都很好,但当我改变项目的一个字段的布局和默认站点的渲染消失了!有人对这个问题有什么建议吗?

我正在使用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();
        }
    }
}

Sitecore添加可编程移动站点

我已经用以下方法修复了这个问题:

        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();
        }
    }