2016년 3월 25일 금요일

현재 아이템을 사용중인 모든 아이템 찾기

#사이트코어 #FindRelatedItems #Link

모든 페이지들은 적용되어진 템플릿에 의하여 페이지가 생성이 되고, 템플릿의 값이 어떻게 적용되었는지에 따라, 페이지의 적용된 값도 일괄적으로 업데이트가 된다.
간혹, 잘못 적용된 템플릿을 삭제해야하는 경우가 생기며, 그 템플릿을 삭제하기 위해서는 먼저 템플릿이 사용중인 아이템을 삭제 또는 템플릿 정보를 해당 아이템에서 삭제해야지만이 메인 템플릿 아이템을 삭제할수가 있다.

이번 포스트에서는 어느 아이템에서 해당 템플릿을 사용중인지 찾는 방법을 알아보도록 하겠다.


  1. CMS Link DB를 이용하여 찾는 법

    1. "Content Editor"로 이동 후, 삭제하고자 하는 아이템을 선택한다.
    2. 아이템 선택 후, 상위 매인 툴 박스에서 "Navigation" 탭을 선택한다.
    3. "Navigation" 패널에서 "Links" 버튼을 클릭하면, 선택되어진 아이테을 사용중인 아이템 목록들이 나온다.

  2. 코드를 작성하여 찾는 법

     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
    public Item[] GetReferrers(string itemId)
    {          
        Item item = Sitecore.Data.Database.GetDatabase("master").GetItem(new Sitecore.Data.ID(itemId));
        // 모든 링크된 아이템의 정보를 가져온다
        ItemLink[] itemLinks = Globals.LinkDatabase.GetReferrers(item);
        if (itemLinks == null)
        {
            return null;
        }
        else
        {
            ArrayList items = new ArrayList(itemLinks.Length);
            foreach (ItemLink itemLink in itemLinks)
            {
                // 'Master' DB에 있는 정보를 비교한다.
                if (itemLink.SourceDatabaseName == "master")
                {
                    Item linkItem = Sitecore.Data.Database.GetDatabase("master").Items[itemLink.SourceItemID];
                    if (linkItem != null)
                    {
                        items.Add(linkItem);
                    }
                }
            }
            return (Item[])items.ToArray(typeof(Item));
        }
    }


  3. Powershell 스크립트를 이용하여 찾는 법
    1. 먼저, Sitecore PowerShell를 설치 한 후,
    2. "Content Editor" 또는 "Dashboard"에서 PowerShell Console를 실행시킨다.
    3. 아래의 코드를 PowerShell 스크립트 필디에 넣은 후, "Execute" 버턴을 실행한다.

       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
      $props = @{
          InfoTitle = "Referrers"
          InfoDescription = "현재 아이템을 사용중인 모든 아이템을 리스트하여라."
          PageSize = 25
      }
      
      function Get-ItemReferrers {
          $item = Get-Item -Path "/sitecore/your/template/item/path"
          $linkDb = [Sitecore.Globals]::LinkDatabase
          $links = $linkDb.GetReferrers($item)
          foreach($link in $links){
              $linkedItem = Get-Item -Path master:\ -ID $link.SourceItemID
              $linkedItem
          }
      }
      
      $items = Get-ItemReferrers
      $items | Show-ListView @props -Property @{Label="Name"; Expression={$_.DisplayName} },
                  @{Label="Updated"; Expression={$_.__Updated} },
                  @{Label="Updated by"; Expression={$_."__Updated by"} },
                  @{Label="Created"; Expression={$_.__Created} },
                  @{Label="Created by"; Expression={$_."__Created by"} },
                  @{Label="Path"; Expression={$_.ItemPath} }
      
      Close-Window
      

2016년 3월 9일 수요일

Name Value List 타입을 이용하여 데이타소스 만들기

#HowTo #Datasource #GetItem

사이트코어에서 탬플릿을 만들다보면 다양한 템프릿 필드를 선택할수가 있다. 그 중에서 Key와 Value 개념인 "Name Value List" 타입에 대하여 알아보도록 하겠다.

간혹, 데이타소스를 만들는데 있어서, 똑같은 데이타 타입임에도 불구하여, 데이타의 수 만큼 데이타 이이템을 만들어야 하는경우가 있다.

사이트 이름사이트 URL
구글http://www.google.com
야후http://www.yahoo.com
레딧http://www.reddit.com
사이트코어http://www.sitecore.com
......


이럴경우 사이트 각각의 아이템을 만들 필요없이, 템플릿의 "Name Value List"을 선택함으로로써 하나의 데이타소스 아이템에 여러게의 값을 저장할수가 있다. 프로그래밍에서 Array 또는 List와 똑같은 개념이라고 할수있다.



 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
var db = Sitecore.Configuration.Factory.GetDatabase("master");
// NameValueType의 필드를 가지고 있는 데이타소스 아이템의 ID 값을 입력하다.
var item = db.GetItem("{8A8E427B-9162-4680-AE69-239217F5B9AB}");
 
//데이타를 초기화하고,
var data = new NameValueCollection();
// 필요한만큼 데이타를 추가한다.
data.Add("name1", "value1");
data.Add("name2", "value2");
data.Add("name3", "value3");
data.Add("name4", "value4");
     
using (new Sitecore.SecurityModel.SecurityDisabler())
{
    item.Editing.BeginEdit();
    try
    {
        //데이타값은 필드 이름을 입력한다.
        //'&'는 값들의 Divider이다.
        item["NameList"] = StringUtil.NameValuesToString(data, "&");
    }
    finally
    {
        item.Editing.EndEdit();
    }
}