2012-12-03 8 views
6

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... 
      } 
} 
} 

risposta

6

ho ottenuto sul Sitecore support alla fine, che mi ha informato che dovrei usare:

Sitecore.Data.Fields.LayoutField.GetFieldValue(item.Fields[Sitecore.FieldIDs.LayoutField]) 

invece di:

item[FieldIDs.LayoutField] 

per ottenere il articoli layoutField correttamente. Ciò comporta che i valori di rendering vengano analizzati correttamente e, come si dice, il resto è cronologia.

+0

Bello, Dan. E benvenuti a Stack Overflow! –

+0

+1 rocce di supporto Sitecore! Grazie per aver condiviso il loro feedback. –

+1

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

Problemi correlati