2015-08-20 18 views
2

對於項目需求之一,我想在運行時向項目添加子圖層,並且應該將此子圖層添加到設備(默認打印機),因此我使用了以下代碼:以編程方式向項目特定設備添加子圖層

   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

爲什麼不只是將組件添加到標準值的表示詳細信息中的所有設備中,然後只使用規則引擎/ Personlisation隱藏不應使用它顯示的設備的組件? – jammykam

+0

是的,我可以做到這一點,但我在尋找的是,如果我可以得到我需要使用sitecore API的設備,如:Sitecore.Context.Device.ID.ToString(),但這檢索當前的內容設備如果我需要特定上下文以外的設備。 –

+1

上面的代碼在哪裏運行?當編輯器進行更改/創建項目或向用戶呈現項目時?我不認爲有這些API,因爲您可以添加自己的設備定義,因此您可以輕鬆擴展,甚至刪除Sitecore提供的設備,因此無法提供「Devices.Default」 (或類似)。 – jammykam

回答

4

不幸的是,我還沒有看到任何特定的API,儘管我瀏覽了Sitecore.Kernel.dll。也許有一些第三方的sitecore擴展會扭曲和擴展這個功能,但是現在我意識到這一點。

重要的一點要注意:您正在訪問

item.Fields[Sitecore.FieldIDs.LayoutField] 

,這是有效的Sitecore的版本多達7但作爲Sitecore的8引入版本化的佈局,你應該使用:我上面提到的代碼注意到

item.Fields[Sitecore.FieldIDs.FinalLayoutField] 

改爲。希望有所幫助。

相關問題