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

2015년 9월 2일 수요일

Sitecore PowerShell Script

#HowTo #PowerShell

 이번에는 Sitecore PowerShell Script에 관한여 소개해보겠다.

페이지 템플릿 또는 아이템의 필드 템플릿 값을 변경해야할경우, 간혹 많이 아이템을 하나하나씩 들어가 업데이트 해야하는 경우가 있다. 이럴경우 많은 시간이 소비될 뿐아니라 페이지를 만들고 업데이트하는 과정에서 Best Practice라고 할수가 없다.

이럴경우, 두가지 옵션이 있는데, 첫번째는 템플릿의 Standard Value를 리셋하는 것이고, 두번째는 Sitecore PowerShell의 스크립트를 통하여 변경하고 싶은 아이템의 값을 모두 업데이트하는것이다. 첫번째의 경우 가장 간편하고 안전한 업데이트라고 할수있으나, 만약 템들릿이 많은 필드 타입을 가지고 있고, __Standard Value를 통하여 만들어진 아이템이 아니라면 곤란하다.

이럴경우 두번째 옵션을 선택하는데, 아래는 선택되어진 Context 아이템에 Workflow 필드를 없데이트 하는것이다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
######################################################################
##  1. 먼저 default workflow state 세팅한다                          ##
##  2. 스크립트를 실행하기전 반드시 아이템의 아이디가 정확한지 확인하다  ##
######################################################################

function SetWorkflow($item)
{
    ## Update only items assigned __Default workflow
    if ($item."__Default workflow" -eq "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}") {
        $item.__Workflow = "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}";
        $item."__Workflow state" = "{190B1C84-F1BE-47ED-AA41-F42193D9C8FC}";
    }
}

## Update correct workflow information.
get-item . -Language * | foreach-object { SetWorkFlow($_) }
get-childitem . -recurse -Language * | foreach-object { SetWorkFlow($_) }

## Show Updated Result
get-item . -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow"
get-childitem . -recurse -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow"


아래는 이런문제때문에 StackworkFlow에 질문하여 답변한 링크이다.
http://stackoverflow.com/questions/29263398/sitecore-workflow-is-not-working/29286256#29286256

2015년 7월 28일 화요일

템플릿 필드 업데이트 ItemEditing

#HowTo #Template

 사이트코어를 사용하다 보면은 프로그램상으로 해당 페이지 또는 Sublayout/Rendering component의 템플릿 필드 값을 업데이트 해야하는 경우가 있다.

Sitecore.Data.Items.ItemEditing


아래의 코드는:

  • 아이템 저장
  • 업데이트 아이템 정보 (수정날짜, 에디터 및 통계정보)
  • 아이템 저장과 관련된 이벤트를 실행한다


Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get");

//Begin Editing Sitecore Item
path.Editing.BeginEdit();
try
{
    path["fieldName"] = "This is updated value";

    // This will commit the field value
    path.Editing.EndEdit();
}
catch (Exception)
{
    //Revert the Changes
    path.Editing.CancelEdit();
}


Sitecore.Data.Items.EditContext


아래의 코드는 윗 코드와 달리, 선택적으로 통계정보를 업데이트할수있으며, 또한 파라미터를 전달하는데 있어서 보안체크 또한 가능하다.


Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get");

//Enable or disable statistics information
bool updateStatistics = false;  

//Temporary enable or disable events
bool silent = true;

//Begin Editing Sitecore Item
path.Editing.BeginEdit();
using (new EditContext(path, updateStatistics, silent))
{
    path["fieldName"] = "This is updated value";
}
path.Editing.EndEdit();


Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get");

// Disable security check
path.Editing.BeginEdit();
using (new EditContext(path, SecurityCheck.Disable))  
{  
    path["fieldName"] = "This is updated value";  
}  
path.Editing.EndEdit(); 

2015년 4월 28일 화요일

Workflow Related Item 업데이트 하기

#HowTo #Workflow #FYI

 이번에 회사에서 사이트코어 workflow세팅을 재수정하기로 하였다. 사이트코어의 유저권한에 따라, 에디터는 컨테츠를 수정하고 제출할수 있으며, 검증자는 승인을 하고, 마지막 관리자 또는 등록자는 해당 업데이트된 페이지를 Publish 할 수있도록 하는것이다.

여기서 하나의 문제점은, 아래의 사진처럼 content item에 페이지를 구성하는 많은 sublayout들이 존재할수가 있다. 각각 다른 템플릿이 적용된 관계로 페이지를 등록하고, 승인한다고 하더래도 해당 선택되어진 content item만 workflow에 적용될뿐이다. 다른 child Related Item은 그대로 initial state에 존재할수가 있다.



이런 경우를 보완하기 위하여, content item의 Workflow state이 업데이트 되면, 페이지에 등록되어진 sublayout역시 모두 똑같은 workflow state 으로 바뀌게 된다.



 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
public class UpdateWorkflowState
{
    // List all controls in page item
    public RenderingReference[] GetListOfSublayouts(string itemId, Item targetItem)
    {
        RenderingReference[] renderings = null;

        if (Sitecore.Data.ID.IsID(itemId))
        {
            renderings = targetItem.Visualization.GetRenderings(Sitecore.Context.Device, true);
        }

        return renderings;
    }

    // Return all datasource defined on one item
    public IEnumerable<string> GetDatasourceValue(WorkflowPipelineArgs args, Item targetItem)
    {
        List<string> uniqueDatasourceValues = new List<string>();
        Sitecore.Layouts.RenderingReference[] renderings = GetListOfSublayouts(targetItem.ID.ToString(), targetItem);
        foreach (var rendering in renderings)
        {
            if (!uniqueDatasourceValues.Contains(rendering.Settings.DataSource))
                uniqueDatasourceValues.Add(rendering.Settings.DataSource);
        }

        return uniqueDatasourceValues;
    }

    // Check workflow state and update state
    public WorkflowResult ChangeWorkflowState(Item item, ID workflowStateId)
    {
        using (new EditContext(item))
        {
            item[FieldIDs.WorkflowState] = workflowStateId.ToString();
        }
        return new WorkflowResult(true, "OK", workflowStateId);
    }

    // Verify workflow state
    public WorkflowResult ChangeWorkflowState(Item item, string workflowStateName)
    {
        IWorkflow workflow = item.Database.WorkflowProvider.GetWorkflow(item);

        if (workflow == null)
        {
            return new WorkflowResult(false, "No workflow assigned to item");
        }

        WorkflowState newState = workflow.GetStates().FirstOrDefault(state => state.DisplayName == workflowStateName);

        if (newState == null)
        {
            return new WorkflowResult(false, "Cannot find workflow state " + workflowStateName);
        }

        return ChangeWorkflowState(item, ID.Parse(newState.StateID));
    }
}



여기는 해당 모든 sublayout을 불러오고, 현재 workflow state의 그 다은 state로 적용시키는 것이다.


1
2
3
4
5
6
7
8
9
// Find all controls on item
foreach (string controls in GetDatasourceValue(args, args.DataItem))
{
    if (!String.IsNullOrEmpty(controls))
    {
        Item listControls = args.DataItem.Database.GetItem(controls);
        ChangeWorkflowState(listControls, "Awaiting Approval");
    }
}