簡體   English   中英

以編程方式處理所有Sitecore項目與工作流程

[英]Programmatically Process all Sitecore items with Workflow

我有情況,我需要清理工作Workbox中的很多項目。

我需要處理這些項目,以便根據此規則為它們分配工作流狀態(不觸發工作流操作):

如果項目具有草稿狀態或等待批准,並且發布的版本高於當前版本,則將工作流程狀態設置為x worflowstate。

我沒有做過很多實驗工作流程,所以有沒有人有任何代碼示例或我如何實現這一點的想法?

這是一篇關於以編程方式更改Sitecore項目的工作流程狀態的博客文章。

首先,您需要找到所選工作流狀態中的所有項目:

IWorkflow[] workflows = Sitecore.Context.Database.WorkflowProvider.GetWorkflows();

IWorkflow chosenWorkflow = workflows[..]; // choose your worfklow

WorkflowState[] workflowStates = chosenWorkflow.GetStates();

foreach (WorkflowState state in workflowStates)
{
    if (!state.FinalState)
    {
        DataUri[] itemDataUris = chosenWorkflow.GetItems(state.StateID);
        foreach (DataUri uri in itemDataUris)
        {
            Item item = Sitecore.Context.Database.GetItem(uri);
            /* check other conditions - newer version exists etc */
            ChangeWorkflowState(item, newWorkflowStateId);
        }
    }
}

用於更改Sitecore項的工作流狀態而不執行與新工作流狀態相關的任何操作的最簡單代碼是:

public static WorkflowResult ChangeWorkflowState(Item item, ID workflowStateId)
{
    using (new EditContext(item))
    {
        item[FieldIDs.WorkflowState] = workflowStateId.ToString();
    }

    return new WorkflowResult(true, "OK", workflowStateId);
}

public static 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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM