Sitecore добавить программно мобильный сайт - PullRequest
0 голосов
/ 07 ноября 2011

Я столкнулся со следующей проблемой: я хочу динамически добавить мобильный сайт для определенных шаблонов, я указал мобильную раскладку в стандартных значениях конкретного элемента. Это все работает нормально, но когда я изменил поле элемента, макет и визуализация сайта по умолчанию исчезли! У кого-нибудь есть решение / предложение по этой проблеме?

Я работаю с 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 Ответ

1 голос
/ 11 ноября 2011

Я исправил это с помощью следующих методов:

        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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...