我试图弄清楚如何计算,然后以编程方式存储渲染的布局增量。我所处的情况是我在标准值上定义了渲染。它的数据源是空的。然后我有一个基于该模板创建项目的过程,但我需要在渲染上设置数据源。
默认情况下,新项目上的__Renderings字段为空(如预期的那样)。到目前为止,我已经能够获得RenderingReference到我的渲染,检测到数据源是空白的,但我不能在我的生活中弄清楚如何设置数据源然后在我项目的__Renderings字段中存储正确的delta
到目前为止,我有:
foreach (var device in new DeviceRecords(database).GetAll())
{
foreach (var rendering in myItem.Visualization.GetRenderings(device, false).Where(r => r.RenderingID == renderingId)
{
if (rendering.Settings.DataSource.IsNullOrEmpty())
{
var dataSourceItem = datasourceFolder.Add("Datasource name", dataSourceTemplate);
rendering.Settings.DataSource = dataSourceItem.ID.ToString();
using (new EditingContext(myItem)){
myItem[FieldIDs.LayoutField] == //????
}
}
}
}
我的猜测是我需要以某种方式调用XmlDelta中的某些内容,但看起来所有这些方法都需要一些Xml才能使用,当我所拥有的只是渲染项时。
答案 0 :(得分:1)
我曾经写过一些代码,试图从Sitecore的XML增量中提取数据源信息。我从未尝试过更新它,但这可能适合你。
我使用的类是Sitecore.Layouts.LayoutDefinition
,它能够解析XML,如果我没记错的话,它通过将delta与底层模板数据相结合来处理正确的页面控件集的工作。 。你可以像这样构建它:
string xml = LayoutField.GetFieldValue(item.Fields["__Renderings"]);
LayoutDefinition ld = LayoutDefinition.Parse(xml);
DeviceDefinition deviceDef = ld.GetDevice(deviceID);
foreach(RenderingDefinition renderingDef in deviceDef.GetRenderings(renderingID))
{
// do stuff with renderingDef.Datasource
}
因此,我认为您可以使用LayoutDefinition
,DeviceDefinition
和RenderingDefinition
提供的API来访问数据。有关我如何在此博文中的processImages()
函数中使用此信息的更多信息:https://jermdavis.wordpress.com/2014/05/19/custom-sitemap-filespart-three/
我认为您之后缺少的一步是您可以修改此对象存储的数据(例如,为特定渲染设置数据源),然后使用ToXml()
方法取回修改后的数据存储到Renderings字段中?
您可以通过使用Reflector或DotPeek等内容查找更多信息,以查看代码内部的“布局详细信息”对话框如何在Sitecore UI中修改此数据。
- 编辑添加 -
我对这个主题进行了更多的挖掘,因为我对如何正确地再次保存数据感兴趣。我写了我在这里发现的内容:https://jermdavis.wordpress.com/2015/07/20/editing-layout-details/