asp.net - que - marcadores dinamicos chrome
Sitecore ''marcadores dinĂ¡micos'' con MVC (2)
Estoy buscando una solución dinámica de marcadores de posición en MVC. Hay al menos dos buenas descripciones de este "patrón" para usar con los formularios web:
- http://trueclarity.wordpress.com/2012/06/19/dynamic-placeholder-keys-in-sitecore/
- http://www.techphoria414.com/Blog/2011/August/Dynamic_Placeholder_Keys_Prototype
Y también encontré este blog que explica cómo hacerlo con MVC:
Primero, traté de implementar el método de Techphoria (con GUID) utilizando técnicas de la entrada de blog de MVC (extensión de SitecoreHelper) y también intenté implementar el último método descrito (usa sufijos numéricos que se incrementan Column_1, Column_2, etc.).
Con todas las variaciones que probé, no logré crear una solución de trabajo. Mis marcadores de posición no se nombran correctamente (terminé con estructuras de marcadores de posición extrañas o se repiten los marcadores de posición).
Sin entrar en los detalles de mis intentos, me gustaría saber si alguien más tiene una solución de trabajo lista que pueda usar.
Si no puedo encontrar una solución que ya esté funcionando, describiré mi problema con más detalle y veré si puedo hacer que eso funcione.
Descargué el paquete Integrated Dynamic Placeholders del mercado de sitecore. Al crear su página, se incrementan los marcadores de posición con el sufijo configurable que se adjunta al final de la clave del marcador de posición para que sean únicos, de acuerdo con su orden en la capa de presentación. Trabajó fuera de la caja para mí.
He creado esta extensión que crea placholders dinámicos.
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));
}
}
Crea un marcador de posición con el guid en el nombre. También creé un paso en la tubería que extrae el guid y comprueba la configuración de los marcadores de posición.
Código para obtener la configuración del marcador de posición al marcador dinámico de posición Si crea un marcador dinámico de posición con @ Html.Sitecore (). DynamicPlaceholder ("prueba"): el siguiente código toma la configuración de la configuración del marcador de posición llamada prueba
/// <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);
}
}
}
El siguiente código elimina el guid de los datos de Chrome en el editor de página
/// <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;
}
}
}
}
}
Editar
La configuración de incluir web.config se incluye a continuación:
<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>