2013-09-24 70 views
-1

你好我想创建专用页面供我在哪里可以改变每个渲染项目的数据源值的私人使用。 我已经创建了下一个代码,但它不会保存项目的任何更改。Sitecore更改渲染数据源

SC.Data.Database master = SC.Configuration.Factory.GetDatabase("master"); 
      SC.Data.Items.Item itm = master.GetItem(tbPath.Text); 
      if (itm != null) 
      { 
       // Get the sublayout to update 
       //string sublayout_name = txtSublayout.Text.Trim(); 
       //if (!string.IsNullOrEmpty(sublayout_name)) 
       { 
        // Get the renderings on the item 
        RenderingReference[] refs = itm.Visualization.GetRenderings(SC.Context.Device, true); 
        if (refs.Any()) 
        { 
         //var data = refs.Select(d=>d); 
         //refs[0].Settings.DataSource 
         var sb = new StringBuilder(); 
         using (new SC.SecurityModel.SecurityDisabler()) 
         { 
          itm.Editing.BeginEdit(); 
          foreach (var d in refs) 
          { 
           if (d.Settings.DataSource.Contains("/sitecore/content/Site Configuration/")) 
           { 
            var newds = d.Settings.DataSource.Replace("/sitecore/content/Site Configuration/", "/sitecore/content/Site Configuration/" + tbLanguage.Text + "/");         
            // sb.AppendLine(string.Format("{0} old: {1} new: {2}<br/>", d.Placeholder, d.Settings.DataSource, newds)); 
            d.Settings.DataSource = newds; 
           } 
          } 
          itm.Editing.EndEdit(); 
         }       
         //lblResult.Text = sb.ToString(); 

       } 
      } 
     } 

我该如何更改数据源? 谢谢

回答

3

您在这里混合了Sitecore中的两个不同的东西。

  • 是在运行时分配给渲染的数据源,当Sitecore的是呈现页面
  • 分配给某个项目

的最简单的方法来呈现细节的数据源达到我认为你想要实现的目标,就是这个。

Item itm = database.GetItem("your item"); 
string presentationXml = itm["__renderings"]; 
itm.Editing.BeginEdit(); 
presentationXml.Replace("what you're looking for", "what you want to replace it with"); 
itm.Editing.EndEdit(); 

(我还没有编译和运行该代码,但它应该相当多的工作,是)

1

您没有将更改保存到外地。

使用LayoutDefinitation类来解析布局字段,并且foreach所有设备定义和呈现定义。

然后finaly将LayoutDifinition提交到布局字段。

SC.Data.Items.Item itm = master.GetItem(tbPath.Text); 
var layoutField = itm.Fields[Sitecore.FieldIDs.LayoutField]; 


LayoutDefinition layout = LayoutDefinition.Parse(layoutField.Value); 
for (int i = 0; i < layout.Devices.Count; i++) 
{ 
    DeviceDefinition device = layout.Devices[i] as DeviceDefinition; 
    for (int j = 0; j < device.Renderings.Count; j++) 
    { 
     RenderingDefinition rendering = device.Renderings[j] as RenderingDefinition; 

     rendering.Datasource = rendering.DataSource.Replace("/sitecore/content/Site Configuration/", 
      "/sitecore/content/Site Configuration/" + tbLanguage.Text + "/"); 
    } 
} 

itm.Editing.BeginEdit(); 
var xml =layout.ToXml() 

layoutField.Value = xml; 
itm.Editing.EndEdit(); 

的代码不是testet,但事我必须在生产上copy事件

0

替换数据源如果任何一个寻找单行Linq的改变:(测试)

var layoutField = item.Fields[Sitecore.FieldIDs.LayoutField]; 
    if (layoutField != null) 
    { 
     var layout = LayoutDefinition.Parse(layoutField.Value); 
     if (layout != null) 
     { 
      foreach (var rendering in layout.Devices.Cast<DeviceDefinition>() 
            .SelectMany 
            (device => device.Renderings.Cast<RenderingDefinition>() 
            .Where 
            (rendering => rendering.ItemID == "RenderingYoulooking"))) 
            { 
             rendering.Datasource = "IDYouWantToInsert"; 
            } 
      layoutField.Value = layout.ToXml(); 
     } 
    }