2013-02-28 4 views
22

Я ищу рабочее решение Dynamic Placeholder в MVC. Есть по крайней мере два хороших описаний этого «образец» для использования с WebForms:«Динамические заполнители Sitecore» с MVC

И я также нашел этот блог, объясняющие, как сделать это с MVC:

Сначала я попытался реализовать метод Techphoria (с GUID) с использованием методов из blogpost MVC (расширение SitecoreHelper), и я также попытался реализовать последний описанный метод (использует числовые суффиксы с инкрементами Column_1, Column_2 и т. Д.).

Со всеми вариантами, которые я пробовал, мне не удалось создать рабочее решение. Мои заполнители не получили должным образом имени (у меня были странные структуры заполнителей, или заполнители повторяли себя).

Не вдаваясь в подробности моих попыток, я хотел бы знать, есть ли у кого-нибудь готовое рабочее решение, которое я мог бы использовать.

Если я не могу найти уже работающее решение, я опишу свою проблему более подробно и посмотрю, смогу ли я это сделать.

ответ

40

Я создал это расширение, которое создает динамический placholders

public static class SitecoreHelper 
{ 
    public static HtmlString DynamicPlaceholder(this Sitecore.Mvc.Helpers.SitecoreHelper helper, string dynamicKey) 
    { 
     var currentRenderingId = RenderingContext.Current.Rendering.UniqueId; 
     return helper.Placeholder(string.Format("{0}_{1}", dynamicKey, currentRenderingId)); 
    } 
} 

Это создает заполнитель с Guid имени. Я также создал шаг в конвейере, который извлекает guid, и проверяет настройки заполнителя.

Кода для получения параметров заполнителей для динамического заполнителя Если вы создаете динамические пустышку с @ Html.Sitecore() DynamicPlaceholder («тест»). - следующий код принимает значение с настроек заполнителей именем тест

/// <summary> 
/// Handles changing context to the references dynamic "master" renderings settings for inserting the allowed controls for the placeholder and making it editable 
/// </summary> 
public class GetDynamicKeyAllowedRenderings : GetAllowedRenderings 
{ 
    //text that ends in a GUID 
    private const string DYNAMIC_KEY_REGEX = @"(.+)_[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}"; 

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

     string placeholderKey = args.PlaceholderKey; 
     Regex regex = new Regex(DYNAMIC_KEY_REGEX); 
     Match match = regex.Match(placeholderKey); 
     if (match.Success && match.Groups.Count > 0) 
     { 
      placeholderKey = match.Groups[1].Value; 
     } 
     else 
     { 
      return; 
     } 
     // Same as Sitecore.Pipelines.GetPlaceholderRenderings.GetAllowedRenderings but with fake placeholderKey 
     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 flag; 
      args.HasPlaceholderSettings = true; 
      collection = this.GetRenderings(placeholderItem, out flag); 
      if (flag) 
      { 
       args.CustomData["allowedControlsSpecified"] = true; 
       args.Options.ShowTree = false; 
      } 
     } 
     if (collection != null) 
     { 
      if (args.PlaceholderRenderings == null) 
      { 
       args.PlaceholderRenderings = new List<Item>(); 
      } 
      args.PlaceholderRenderings.AddRange(collection); 
     } 
    } 
} 

следующий код удаляет Guid из данных хрома в pageeditor

/// <summary> 
/// Replaces the Displayname of the Placeholder rendering with the dynamic "parent" 
/// </summary> 
public class GetDynamicPlaceholderChromeData : GetChromeDataProcessor 
{ 
    //text that ends in a GUID 
    private const string DYNAMIC_KEY_REGEX = @"(.+)_[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}"; 

    public override void Process(GetChromeDataArgs args) 
    { 
     Assert.ArgumentNotNull(args, "args"); 
     Assert.IsNotNull(args.ChromeData, "Chrome Data"); 
     if ("placeholder".Equals(args.ChromeType, StringComparison.OrdinalIgnoreCase)) 
     { 
      string argument = args.CustomData["placeHolderKey"] as string; 

      string placeholderKey = argument; 
      Regex regex = new Regex(DYNAMIC_KEY_REGEX); 
      Match match = regex.Match(placeholderKey); 
      if (match.Success && match.Groups.Count > 0) 
      { 
       // Is a Dynamic Placeholder 
       placeholderKey = match.Groups[1].Value; 
      } 
      else 
      { 
       return; 
      } 

      // Handles replacing the displayname of the placeholder area to the master reference 
      Item item = null; 
      if (args.Item != null) 
      { 
       string layout = ChromeContext.GetLayout(args.Item); 
       item = Sitecore.Client.Page.GetPlaceholderItem(placeholderKey, args.Item.Database, layout); 
       if (item != null) 
       { 
        args.ChromeData.DisplayName = item.DisplayName; 
       } 
       if ((item != null) && !string.IsNullOrEmpty(item.Appearance.ShortDescription)) 
       { 
        args.ChromeData.ExpandedDisplayName = item.Appearance.ShortDescription; 
       } 
      } 
     } 
    } 
} 

Редактировать

web.config, включают в себя параметры приведены ниже:

<sitecore> 
    <pipelines> 

    <getPlaceholderRenderings> 
     <processor 
     type="YourNamespace.Pipelines.GetPlaceholderRenderings.GetDynamicKeyAllowedRenderings, YourAssembly" 
     patch:before="processor[@type='Sitecore.Pipelines.GetPlaceholderRenderings.GetAllowedRenderings, Sitecore.Kernel']"/> 
    </getPlaceholderRenderings> 

    <getChromeData> 
     <processor 
     type="YourNamespace.Pipelines.GetChromeData.GetDynamicPlaceholderChromeData, YourAssembly" 
     patch:after="processor[@type='Sitecore.Pipelines.GetChromeData.GetPlaceholderChromeData, Sitecore.Kernel']"/> 
    </getChromeData> 

    </pipelines> 
</sitecore> 
+0

Я собираюсь проверить это первое, что сегодня вечером. Благодаря! –

+0

Это работает, Данстон! Большое спасибо!!! –

+3

NP - я обновил код, чтобы изменить отображаемое имя заполнителя для редактора, им не нужно видеть guid – dunston

0

Я скачал Integrated Dynamic Placeholders пакет из Sitecore рынка. При создании своей страницы он увеличивает метки заполнителей с помощью настраиваемого суффикса, добавленного в конец ключа-заполнителя, чтобы сделать их уникальными в соответствии с их порядком на уровне презентации. Работала из коробки для меня.

Смежные вопросы