Динамические заполнители Sitecore Разрешенные визуализации

Я внедряю динамические заполнители в Sitecore 7, как описано в статьях.

Он работает правильно, так что я могу добавить ту же визуализацию в макет, и визуализации будут помещены в соответствующий динамический заполнитель. Однако, когда я нажимаю, чтобы добавить рендеринг в динамический заполнитель, настройки заполнителя не используются.

Я ожидаю, что мне будет предложено указать разрешенные визуализации, которые могут быть размещены в динамическом заполнителе. Вместо этого представлено дерево рендеринга/макета для ручного выбора рендеринга, что дает редакторам контента возможность добавлять запрещенные рендеринги в заполнитель.

Я отладил код, и для динамического заполнителя найден правильный элемент настроек заполнителя, и извлекается список разрешенных визуализаций, однако, несмотря на то, что он установлен в аргументах, список не представлен для пользователя. См. код ниже.

public class GetDynamicKeyAllowedRenderings : GetAllowedRenderings
{
    //string that ends in a GUID
    public const string DynamicKeyRegex = @"(.+){[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}}";

    public new void Process(GetPlaceholderRenderingsArgs args)
    {
        Assert.IsNotNull(args, "args");

        // get the placeholder key
        string placeholderKey = args.PlaceholderKey;
        var regex = new Regex(DynamicKeyRegex);
        Match match = regex.Match(placeholderKey);

        // if the placeholder key text followed by a Guid
        if (match.Success && match.Groups.Count > 0)
        {
            // Is a dynamic placeholder
            placeholderKey = match.Groups[1].Value;
        }
        else
        {
            return;
        }

        Item placeholderItem = null;
        if (ID.IsNullOrEmpty(args.DeviceId))
        {
            placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey, args.ContentDatabase,
                                                             args.LayoutDefinition);
        }
        else
        {
            using (new DeviceSwitcher(args.DeviceId, args.ContentDatabase))
            {
                placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey, args.ContentDatabase,
                                                                 args.LayoutDefinition);
            }
        }

        // Retrieve the allowed renderings for the Placeholder
        List<Item> collection = null;
        if (placeholderItem != null)
        {
            bool allowedControlsSpecified;
            args.HasPlaceholderSettings = true;
            collection = this.GetRenderings(placeholderItem, out allowedControlsSpecified);
            if (allowedControlsSpecified)
            {
                args.CustomData["allowedControlsSpecified"] = true;
            }
        }
        if (collection != null)
        {
            if (args.PlaceholderRenderings == null)
            {
                args.PlaceholderRenderings = new List<Item>();
            }
            args.PlaceholderRenderings.AddRange(collection);
        }
    }
}

Поскольку этот код был разработан для Sitecore 6.5/6.6, мне интересно, внес ли переход на Sitecore 7.0 изменение, затрагивающее вторую половину кода.


person Jonathan Robbins    schedule 03.09.2014    source источник


Ответы (1)


Я нашел источник проблемы, декомпилировав ядро ​​Sitecore 7 и просмотрев класс GetAllowedRenderings по умолчанию. Если обнаружены разрешенные рендеринги, для параметра ShowTree необходимо установить значение false. Увидеть ниже

public class GetDynamicKeyAllowedRenderings : GetAllowedRenderings
    {
        //string that ends in a GUID
        public const string DynamicKeyRegex = @"(.+){[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}}";

        public new void Process(GetPlaceholderRenderingsArgs args)
        {
            Assert.IsNotNull(args, "args");

            // get the placeholder key
            string placeholderKey = args.PlaceholderKey;
            var regex = new Regex(DynamicKeyRegex);
            Match match = regex.Match(placeholderKey);

            // if the placeholder key text followed by a Guid
            if (match.Success && match.Groups.Count > 0)
            {
                // Is a dynamic placeholder
                placeholderKey = match.Groups[1].Value;
            }
            else
            {
                return;
            }

            // Same as Sitecore.Pipelines.GetPlaceholderRenderings.GetAllowedRenderings from here but with fake placeholderKey
            // i.e. the placeholder without the Guid
            Item placeholderItem = null;
            if (ID.IsNullOrEmpty(args.DeviceId))
            {
                placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey, args.ContentDatabase,
                                                                 args.LayoutDefinition);
            }
            else
            {
                using (new DeviceSwitcher(args.DeviceId, args.ContentDatabase))
                {
                    placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey, args.ContentDatabase,
                                                                     args.LayoutDefinition);
                }
            }

            List<Item> collection = null;
            if (placeholderItem != null)
            {
                bool allowedControlsSpecified;
                args.HasPlaceholderSettings = true;
                collection = this.GetRenderings(placeholderItem, out allowedControlsSpecified);
                if (allowedControlsSpecified)
                {
                    // Hide the Layout/Rendering tree to show the Allowed Renderings
                    args.Options.ShowTree = false;
                }
            }
            if (collection != null)
            {
                if (args.PlaceholderRenderings == null)
                {
                    args.PlaceholderRenderings = new List<Item>();
                }
                args.PlaceholderRenderings.AddRange(collection);
            }
        }
    }

Похоже, это изменение, внесенное Sitecore 7.

person Jonathan Robbins    schedule 03.09.2014
comment
Эй... отличная работа, Джонатан. Можно ли выбрать первый разрешенный рендеринг и применить его к заполнителю, не открывая диалоговое окно «Выбор рендеринга» ?? - person Prathamesh dhanawade; 14.10.2015
comment
Это хороший вопрос. Это должно быть возможно, но это может потребовать значительного объема работы. По сути, где я установил args.Options.ShowTree = false; вам нужно сделать вызов для разрешенных рендеров. Затем декомпилируйте код Sitecore, чтобы узнать, что делает нажатие кнопки «Выбрать визуализацию», и скопируйте его после вызова разрешенных визуализаций. - person Jonathan Robbins; 14.10.2015
comment
Именно то, что я ищу сейчас .... это означает, что мне придется расширить реализацию sitecore для применения рендеринга. Любое руководство о том, где я могу найти этот код.? - person Prathamesh dhanawade; 14.10.2015
comment
У меня была быстрая маршрутизация, и конвейер getPlaceholderRenderings получает разрешенные рендеринги, и этот выбор рендеринга, похоже, основан на конвейере getRenderingDatasource, поэтому имейте добычу в коде для процессоров конвейера, и вы сможете заставить его работать - person Jonathan Robbins; 14.10.2015
comment
Я попробовал код, но не смог найти универсального решения, например, если я хочу использовать то же самое для какого-либо другого рендеринга. Возможно ли каким-либо другим способом, подобным установке стандартных значений для шаблона элемента или около того? - person Prathamesh dhanawade; 15.10.2015
comment
Хорошо, я рекомендую опубликовать новые вопросы с тем, чего вы пытаетесь достичь. Я постараюсь найти время, чтобы спровоцировать сегодня вечером - person Jonathan Robbins; 15.10.2015
comment
Я уже опубликовал один stackoverflow.com/questions/33031246/ - person Prathamesh dhanawade; 16.10.2015