Ho un pulsante sitecore personalizzato che cambia il modello dell'articolo corrente, abbastanza semplice.Copia il rendering del sitecore su un nuovo modello a livello di codice usando renderingDefinition.ItemId?
Tuttavia, come parte di questo sto provando a migrare anche i rendering del vecchio layout in un nuovo layout se è di un certo tipo di sottotitolo di ItemId
. Tuttavia, il valore ItemId
restituito è sempre nullo, l'unico valore che ottengo dallo RenderingDefinition
è UniqueId
.
Cosa sto sbagliando?
Ho usato this blog post come guida.
Il Codice
public class ConvertToNewTemplateCommand : Command
{
protected void Run(ClientPipelineArgs args)
{
if (!SheerResponse.CheckModified())
return;
Item item = Context.ContentDatabase.Items[args.Parameters["id"]];
if (args.IsPostBack)
{
if (args.Result == "yes")
{
//Get current layout details
var originalLayoutXml = item[FieldIDs.LayoutField];
//Get new template
TemplateItem hubTemplate = Context.ContentDatabase.GetTemplate("some guid...");
//Change template
item.ChangeTemplate(hubTemplate);
//Reset laytout
ResetLayout(item);
//Get reset layout
var newLayoutXml = item[FieldIDs.LayoutField];
//Add all the module containers to the new layout in the central column
MoveModuleContainers(item, originalLayoutXml, newLayoutXml);
}
}
}
private void MoveModuleContainers(Item item, string oldXml, string newXml)
{
var oldLayout = LayoutDefinition.Parse(oldXml);
var newLayout = LayoutDefinition.Parse(newXml);
bool updated = false;
var oldRenderings = (oldLayout.Devices[0] as DeviceDefinition).Renderings;
var newRenderings = (newLayout.Devices[0] as DeviceDefinition).Renderings;
foreach (RenderingDefinition rendering in oldRenderings)
{
// Here is where the rendering.ItemID is always null
if (rendering != null && !String.IsNullOrEmpty(rendering.ItemID) && new Guid(rendering.ItemID) == new Guid("matching guid..."))
{
rendering.Placeholder = "middlecolumn";
newRenderings.Add(rendering);
updated = true;
}
}
if (updated)
{
// Save item...
}
}
}
Bello, Dan. E benvenuti a Stack Overflow! –
+1 rocce di supporto Sitecore! Grazie per aver condiviso il loro feedback. –
Mentre questa risposta mi ha portato lì alla fine (e mi ha salvato da ore di difficoltà a capire perché le origini dei dati non venivano restituite), è leggermente incompleto. GetFieldValue è in realtà un metodo statico nella classe Sitecore.Data.Fields.LayoutField. Mi ci è voluto un po 'di tempo per capirlo, quindi spero che questo salvi la prossima persona un po' di confusione :) – Chris