编程语言
首页 > 编程语言> > c#-以工作流程编程方式处理所有Sitecore项

c#-以工作流程编程方式处理所有Sitecore项

作者:互联网

我遇到的情况是在工作箱中有很多项目需要清除.

我需要处理这些项目,以便可以根据以下规则为它们分配工作流状态(无需触发工作流操作):

如果项目处于草稿状态或等待批准,并且发布的版本高于当前版本,则将工作流状态设置为x worflowstate.

我没有对工作流进行过多的试验,所以有人对我如何实现此目标有任何代码示例或想法吗?

解决方法:

这是关于Changing workflow state of Sitecore items programmatically 的博客文章.

首先,您需要找到所选工作流程状态中的所有项目:

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

标签:sitecore7,sitecore,sitecore6,workflow,c
来源: https://codeday.me/bug/20191121/2051951.html