对于项目要求之一,我想在运行时向项添加子布局,并且应该将此子布局添加到设备(默认,打印机),所以我使用了以下代码:
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。
答案 0 :(得分:4)
我还没有看到任何特定的API,因为我已经通过Sitecore.Kernel.dll导航了。也许有一些第三方sitecore扩展可以扭曲和扩展这个功能,但我再次意识到这一点。
需要注意的重点:我注意到上面提到的代码:您正在访问
item.Fields[Sitecore.FieldIDs.LayoutField]
这对于最高为7的Sitecore版本有效。但是,由于Sitecore 8引入了Versioned Layouts,您应该使用
item.Fields[Sitecore.FieldIDs.FinalLayoutField]
代替。希望有所帮助。