2015-11-18 120 views
3

在Sitecore 8.0項目上我目前正在嘗試以編程方式更新RenderingReference的數據源。 由於之前的決定,渲染的數據源不是基於Id,而是基於路徑。Sitecore更新渲染引用

使用以下代碼獲取渲染引用,並在方法內正確更新數據源。但這些更改從未保存到數據庫中。

有什麼我做錯了嗎?還是我想做一些不可能的事情?

page.Editing.BeginEdit(); 
var renderings = page.Visualization.GetRenderings(Sitecore.Context.Device, true); 
foreach (var rendering in renderings) 
{ 
    rendering.Settings.DataSource = "A New DataSource"; 
} 
page.Editing.EndEdit(); 

回答

3

您需要更新__Layout字段的值。

有一個很好的博客文章解釋這裏:Update data source of sublayout or rendering in Sitecore

的代碼是這樣說:

public void UpdateRenderingDatasource(Item item, string newDatasource) 
{ 
    //Get all added renderings 
    Sitecore.Layouts.RenderingReference[] renderings = item.Visualization.GetRenderings(Sitecore.Context.Device, true); 

    // Get the layout definitions and the device 
    LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]); 
    LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value); 
    DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString()); 
    foreach (RenderingReference rendering in renderings) 
    { 
     // Update the renderings datasource value accordingly 
     deviceDefinition.GetRendering(rendering.RenderingID.ToString()).Datasource = newDatasource; 
     // Save the layout changes 
     item.Editing.BeginEdit(); 
     layoutField.Value = layoutDefinition.ToXml(); 
     item.Editing.EndEdit(); 
    } 
} 
+1

非常感謝您的回答。我結束了包含0渲染的DeviceDefinition。這似乎是由於Sitecore 8.0具有共享佈局和最終佈局。通過將新的LayoutField的參數更改爲[Sitecore.FieldIds.FinalLayoutField],我得到了正確的效果圖。 – Thomas

+0

完美!很高興幫助你。 –