以编程方式将子布局添加到项目特定设备

时间:2015-08-20 06:42:57

标签: sitecore

对于项目要求之一,我想在运行时向项添加子布局,并且应该将此子布局添加到设备(默认,打印机),所以我使用了以下代码:

                Item item = GetDatabase().GetItem(Sitecore.Data.ID.Parse(itemId));
                if (item != null)
                {
                    LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]);
                    LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);

                    string[] targetedDevices = new string[] { "{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}", "{46D2F427-4CE5-4E1F-BA10-EF3636F43534}" };

                    foreach (var device in targetedDevices)
                    {
                        DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(device);
                        RenderingDefinition renderingDefinition = new RenderingDefinition();
                        renderingDefinition.ItemID = sublayoutId;
                        renderingDefinition.Placeholder = "column-content";


                        deviceDefinition.AddRendering(renderingDefinition);
                    }
                    // Save the layout changes
                    item.Editing.BeginEdit();
                    layoutField.Value = layoutDefinition.ToXml(); ;
                    item.Editing.EndEdit();
                }

我的问题是,是否有另一种选择sitecore API等演示设备的方法?因为我几乎没有编码目标设备的ID。

1 个答案:

答案 0 :(得分:4)

我还没有看到任何特定的API,因为我已经通过Sitecore.Kernel.dll导航了。也许有一些第三方sitecore扩展可以扭曲和扩展这个功能,但我再次意识到这一点。

需要注意的重点:我注意到上面提到的代码:您正在访问

item.Fields[Sitecore.FieldIDs.LayoutField]

这对于最高为7的Sitecore版本有效。但是,由于Sitecore 8引入了Versioned Layouts,您应该使用

item.Fields[Sitecore.FieldIDs.FinalLayoutField]

代替。希望有所帮助。