2012-12-03 35 views
6

मेरे पास एक कस्टम साइटकोर बटन है जो वर्तमान आइटम के टेम्पलेट को काफी सरल बनाता है।renderingDefinition.ItemId का उपयोग कर प्रोग्रामेटिक रूप से नए टेम्पलेट में साइटकोर प्रतिपादन की प्रतिलिपि बनाना?

हालांकि इस हिस्से के रूप में मैं पुराने लेआउट के प्रस्तुतिकरण को नए लेआउट में माइग्रेट करने की कोशिश कर रहा हूं यदि यह ItemId द्वारा एक निश्चित सब्बाउट प्रकार का है। हालांकि ItemId जो लौटाया जाता है वह हमेशा शून्य होता है, केवल RenderingDefinition से प्राप्त होने वाला एकमात्र मान UniqueId है।

मैं क्या गलत कर रहा हूं?

मैंने एक गाइड के रूप में this blog post का उपयोग किया है।

कोड

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

उत्तर

6

मैं अंत जो मुझे बताया कि मैं का उपयोग करना चाहिए में Sitecore support पर मिल गया:

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

के बजाय:

item[FieldIDs.LayoutField] 

पाने के लिए आइटम layoutField सही ढंग से। इसके परिणामस्वरूप प्रतिपादन मूल्यों को सही ढंग से पार्स किया जा रहा है और जैसा कि वे कहते हैं कि शेष इतिहास है।

+0

अच्छा एक, दान। और ढेर ओवरफ्लो में आपका स्वागत है! –

+0

+1 साइटकोर समर्थन चट्टानों! उनकी प्रतिक्रिया साझा करने के लिए धन्यवाद। –

+1

जबकि इस जवाब ने मुझे अंत में वहां पहुंचाया (और मुझे परेशानियों के घंटों से बचाया कि डेटा स्रोतों को वापस क्यों नहीं किया जा रहा था), यह थोड़ा अपूर्ण है। GetFieldValue वास्तव में Sitecore.Data.Fields.LayoutField कक्षा पर एक स्थिर विधि है। मुझे यह समझने के लिए थोड़ा सा समय लगा, तो उम्मीद है कि यह अगले व्यक्ति को थोड़ा उलझन में बचाएगा :) – Chris