Я внедряю динамические заполнители в Sitecore 7, как описано в статьях.
- http://trueclarity.wordpress.com/2012/06/19/dynamic-placeholder-keys-in-sitecore/
- http://www.techphoria414.com/Blog/2011/August/Dynamic_Placeholder_Keys_Prototype
Он работает правильно, так что я могу добавить ту же визуализацию в макет, и визуализации будут помещены в соответствующий динамический заполнитель. Однако, когда я нажимаю, чтобы добавить рендеринг в динамический заполнитель, настройки заполнителя не используются.
Я ожидаю, что мне будет предложено указать разрешенные визуализации, которые могут быть размещены в динамическом заполнителе. Вместо этого представлено дерево рендеринга/макета для ручного выбора рендеринга, что дает редакторам контента возможность добавлять запрещенные рендеринги в заполнитель.
Я отладил код, и для динамического заполнителя найден правильный элемент настроек заполнителя, и извлекается список разрешенных визуализаций, однако, несмотря на то, что он установлен в аргументах, список не представлен для пользователя. См. код ниже.
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 изменение, затрагивающее вторую половину кода.