2015년 3월 17일 화요일

Sublayout을 Item에 적용시키기 (Coding)

이 소스코드는 새로운 sublayout을 현재 페이지 아이뎀의 레이아웃에 적용시키는 코드이다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public void AddSublayoutToItem(string sublayoutId, string datasourcePath)
{
    using (new Sitecore.SecurityModel.SecurityDisabler())
    {
        if (Sitecore.Data.ID.IsID(itemId) && Sitecore.Data.ID.IsID(sublayoutId))
        {
            // 마스터 데이타베이스를 선택한다음, 현재 아이템 아이디를 불러온다
            Database masterDatabase = Database.GetDatabase("master");
            Item item = masterDatabase.GetItem(Sitecore.Data.ID.Parse(itemId));
                
            // 이미 마스터 데이타베이스가 불러졌다면, 간단하게 현재 아이템을 불러올수가 있다.
            //Item item = Sitecore.Context.Database.GetItem(Sitecore.Data.ID.Parse(itemId));

            if (item != null)
            {
                // 레이아웃과 디바이스 정보를 가져온다.
                LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]);
                LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
                DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());

                //새로운 렌더링 Definition을 만들고, Sublayout 또는 렌더링의 레퍼런스를 추가한다.
                RenderingDefinition renderingDefinition = new RenderingDefinition();
                renderingDefinition.ItemID = sublayoutId;

                // 새로 추가될 Sublayout의 Placeholder값을 정한다.
                renderingDefinition.Placeholder = "content";

                // 새로 추가된 Sublayout의 Datasource 값을 정한다. 값은 DataSource의 경로로 대체할수도 있다.
                renderingDefinition.Datasource = "{24240FF2-B4AA-4EB2-B0A4-63E027934C38}";
                // renderingDefinition.Datasource = "/sitecore/content/Home/Books";

                // 렌더링 레퍼런스를 선택되어진 디바이스에 추가한다.
                deviceDefinition.AddRendering(renderingDefinition);

                // 변경된 레이아웃을 저장한다.
                item.Editing.BeginEdit();
                layoutField.Value = layoutDefinition.ToXml(); ;
                item.Editing.EndEdit();
            }
        }
    }
}