计算要存储在项目上的布局增量

时间:2015-06-22 17:11:21

标签: sitecore

我试图弄清楚如何计算,然后以编程方式存储渲染的布局增量。我所处的情况是我在标准值上定义了渲染。它的数据源是空的。然后我有一个基于该模板创建项目的过程,但我需要在渲染上设置数据源。

默认情况下,新项目上的__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才能使用,当我所拥有的只是渲染项时。

1 个答案:

答案 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
}

因此,我认为您可以使用LayoutDefinitionDeviceDefinitionRenderingDefinition提供的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/

相关问题