程序化地处理所有Sitecore项目与工作流

本文关键字:项目 工作流 Sitecore 处理 程序化 | 更新日期: 2023-09-27 18:14:29

我有一种情况,我有很多项目在Workbox,我需要清除。

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

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

我没有做过很多关于工作流的实验,所以有没有人有任何代码样本或想法,我如何才能实现这一点?

程序化地处理所有Sitecore项目与工作流

这是一篇关于以编程方式改变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));
}