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

Sitecore 以编程方式将子布局添加到特定于项的设备,sitecore,Sitecore,对于一个项目需求,我假设在运行时将子布局添加到项中,并且该子布局应添加到设备(默认为打印机),因此我使用了以下代码: Item item = GetDatabase().GetItem(Sitecore.Data.ID.Parse(itemId)); if (item != null) { LayoutField layoutField = new Layout

对于一个项目需求,我假设在运行时将子布局添加到项中,并且该子布局应添加到设备(默认为打印机),因此我使用了以下代码:

                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();
                }

我的问题是,是否有其他方法可以选择SiteCoreAPI之类的表示设备?由于我几乎没有对目标设备的ID进行编码。

不幸的是,我在Sitecore.Kernel.dll中还没有看到任何特定的API。也许有一些第三方sitecore扩展可以扭曲和扩展此功能,但我现在再次意识到了这一点

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

item.Fields[Sitecore.FieldIDs.LayoutField]
这对于Sitecore版本高达7的版本有效。但由于Sitecore 8引入了版本化布局,您应该使用

item.Fields[Sitecore.FieldIDs.FinalLayoutField]

相反。希望能有所帮助。

为什么不在标准值的演示详细信息中向所有设备添加组件,然后在不应使用规则引擎/个性化显示的设备中隐藏组件?是的,我可以做到,但是我要寻找的是,如果我可以使用sitecore API获得我需要的设备,比如:sitecore.Context.device.ID.ToString(),但这会检索当前的内容设备,如果我需要上下文以外的特定设备,该怎么办?上面的代码在哪里运行?编辑器进行更改/创建项目时,还是向用户呈现项目时?我认为没有针对这些的API,因为您可以添加自己的设备定义,因此很容易扩展甚至删除Sitecore提供的设备,因此提供“Devices.Default”(或类似)是没有意义的。