Je recherche une solution de travail dynamique avec espace réservé dans MVC. Il existe au moins deux bonnes descriptions de ce "modèle" à utiliser avec WebForms:
Et j'ai aussi trouvé ce blog expliquant comment faire avec MVC:
J'ai d'abord essayé d'implémenter la méthode de Techphoria (avec des GUID) en utilisant les techniques de MVC blogpost (extension de SitecoreHelper) et j'ai également essayé d'implémenter la dernière méthode décrite (utilise des suffixes numériques incrémentés Column_1, Column_2, etc.).
Avec toutes les variantes que j'ai essayées, je n'ai pas réussi à créer une solution efficace. Mes espaces réservés ne sont pas correctement nommés (je me suis retrouvé avec d'étranges structures d'espaces réservés ou des espaces réservés se répétant).
Sans entrer dans les détails de mes tentatives, j'aimerais savoir si quelqu'un d'autre a une solution de travail prête à l'emploi.
Si je ne parviens pas à trouver une solution qui fonctionne déjà, je vais décrire mon problème plus en détail et voir si je peux le faire fonctionner.
J'ai créé cette extension qui crée des placholders dynamiques
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));
}
}
Il crée un espace réservé avec le nom de référence dans le nom. J'ai également créé une étape dans le pipeline qui extrait le guide et vérifie les paramètres d'espace réservé.
Code permettant d'obtenir les paramètres d'espace réservé dans l'espace réservé dynamique Si vous créez un espace réservé dynamique avec @ Html.Sitecore (). DynamicPlaceholder ("test") - le code suivant reprend le paramètre des paramètres d'espace réservé appelé test
/// <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);
}
}
}
Le code suivant supprime le guid des données chrome dans l'éditeur de page
/// <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;
}
}
}
}
}
Modifier
Les paramètres d'inclusion web.config sont inclus ci-dessous:
<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>
J'ai téléchargé le package Dynamic Dynamic Placeholders depuis le marché Sitecore. Lors de la construction de votre page, il incrémente les espaces réservés avec le suffixe configurable ajouté à la fin de la clé d’emplacement pour les rendre uniques, en fonction de leur ordre dans la couche de présentation. Travaillé hors de la boîte pour moi.