레이블이 placeholder인 게시물을 표시합니다. 모든 게시물 표시
레이블이 placeholder인 게시물을 표시합니다. 모든 게시물 표시

2017년 8월 30일 수요일

Placeholder 컨트롤 수 제한하기

xEditor를 사용하다보면, 사이트코어 사용자의 권한 설정에 따라 특정한 Placeholder에 하나 이상의 컴포넌트를 제한해야하는 경우가 있다.

또한, 특정한 필드가 각각의 페이지가 아닌, 템플릿 __Standard Values에서 일괄적으로 변경을 해야하는 경우가 있는데, 이럴경우 사이트코어의 GetChromeDataArgs 클래스 파이프라인을 통하여 제한설정을 할수가 있다.


 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.Linq;
using Sitecore.Pipelines.GetChromeData;
using System.Text.RegularExpressions;
using Sitecore.Diagnostics;
using Sitecore.Data.Items;
using Sitecore.Security.Accounts;
using Sitecore.Layouts;
using Sitecore.Data;
using Sitecore.Data.Fields;

namespace Sitecore.Placeholder.Restriction
{
    public class RemoveDeleteButton : GetPlaceholderChromeData
    {
        public override void Process(GetChromeDataArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
            Assert.IsNotNull(args.ChromeData, "Chrome Data");
            if ("placeholder".Equals(args.ChromeType, StringComparison.OrdinalIgnoreCase))
            {
                string placeholderKey = args.CustomData["placeHolderKey"] as string;

                Sitecore.Data.Fields.LayoutField layoutField = new Sitecore.Data.Fields.LayoutField(Context.Item.Fields[Sitecore.FieldIDs.FinalLayoutField]);
                LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
                DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Context.Device.ID.ToString());

                // Initial setting path is "/sitecore/system/Modules/Placeholder Restriction Manager/Remove Delete Button"
                Item removeDeleteButtonItem = Context.Item.Database.GetItem("/sitecore/system/Modules/Placeholder Restriction/Remove Delete Button");

                if (removeDeleteButtonItem == null)
                {
                    Assert.IsNull(removeDeleteButtonItem, "Item is null");
                    return;
                }

                MultilistField listOfRenderingItemsDelete = removeDeleteButtonItem.Fields["List of Rendering Items"];
                string listOfUserRolesDelete = removeDeleteButtonItem.Fields["List of Users and Roles"].Value.Trim();
                List<string> eachListOfUserRolesDelete = !String.IsNullOrEmpty(listOfUserRolesDelete) ? listOfUserRolesDelete.Split(';').ToList() : null;

                // Remove "Delete" button in placeholder
                if (eachListOfUserRolesDelete != null && eachListOfUserRolesDelete.Select(e => User.Current.IsInRole(e) || User.Current.LocalName.Equals(e)).Any())
                {
                    args.ChromeData.Custom["removeAddHereButton"] = true;
                    foreach (ID renderingItemId in listOfRenderingItemsDelete.TargetIDs)
                    {
                        RenderingItem r = RenderingItem.GetItem(renderingItemId, Context.Data.Database, true);
                        string renderingName = Regex.Replace(r.Name.ToLower(), @"\s+", "");
                        string displayName = Regex.Replace(args.ChromeData.DisplayName.ToLower(), @"\s+", "");

                        // Only when rendering name matches to its display name
                        // Only when rendering item's display name contains rendering name
                        if (renderingName == displayName || displayName.Contains(renderingName))
                        {
                            args.ChromeData.Custom["editable"] = false;
                        }
                    }
                }
            }
        }
    }
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <getChromeData>
        <processor
          type="Sitecore.Placeholder.Restriction.RemoveDeleteButton, Sitecore.Placeholder.Restriction"
          patch:after="processor[@type='Sitecore.Pipelines.GetChromeData.GetPlaceholderChromeData, Sitecore.Kernel']"/>
      </getChromeData>
    </pipelines>
  </sitecore>
</configuration>

2016년 5월 20일 금요일

Placeholder Setting 없이 다이나믹한 Placeholder 사용하기

#사이트코어 #Placeholder #Dynamic

템플릿을 만들고 "__Standard Values" 아이템을 만들어 레이아웃 및 컨트롤을 정의해놓으면, 손 쉽게 페이지를 만들고 설정할수가 있다.

페이지 View (.cshtml)에는 이미 정해진 Placeholder Key 값이 있고, 여기에 Assign이 된 렌더링 아이템들만이 Dynamic하게 사용되어질수 있는데, 하나 추가적으로 세팅해야 할것은 템플릿 또는 페이지 레이아웃의 Placeholder Settings에 꼭 이 Key 값을 추가해야지 Placeholder가 수정되어질수있다. 여기 "Placeholder Setting" 리스트를 추가하지 않으면, 페이지에 등록된 Placeholder는 사용할수가없다. 

만약, 한 페이지에 다양하고 많은 Placeholder값이 필요하다면, 이것을 하나하나 추가하기는 쉽지가 않을뿐더러, 새로운 Placeholder를 추가해야한다면 또 레이아웃을 수정 해야하므로 번거로움이 많다.

사이트 .config 파일에서 이것을 쉽게 Disable 할수가 있다.

"Sitecore.ExperienceEditor.config" 파일에서 "WebEdit.PlaceholdersEditableWithoutSettings"을 "true"로 변경하면, Placeholder Settings 없이 다이나믹한 Placeholder를 사용할수가 있다.


<!-- 
    WEB EDIT PLACEHOLDERS EDITABLE WITHOUT SETTINGS Indicates 
    whether placeholders should be editable in the Page Editor 
    if placeholder settings are not specified. 
    Default value: false 
--> 

<setting name="WebEdit.PlaceholdersEditableWithoutSettings" value="true" />