Sök…


Ställ in objektstatus och kör åtgärder i det tillståndet

public void MoveToStateAndExecuteActions(Item item, ID workflowStateId)
{
    Sitecore.Workflows.IWorkflowProvider workflowProvider = Item.Database.WorkflowProvider;
    Sitecore.Workflows.IWorkflow workflow = workflowProvider.GetWorkflow(item);

    // if item is in any workflow
    if (workflow != null)
    {
        using (new Sitecore.Data.Items.EditContext(item))
        {
            // update item's state to the new one
            item[Sitecore.FieldIDs.WorkflowState] = workflowStateId.ToString();
        }

        Item stateItem = ItemManager.GetItem(workflowStateId, 
            Language.Current, Sitecore.Data.Version.Latest, item.Database, SecurityCheck.Disable);

        // if there are any actions for the new state
        if (!stateItem.HasChildren)
            return;

        WorkflowPipelineArgs workflowPipelineArgs = new WorkflowPipelineArgs(item, null, null);

        // start executing the actions
        Pipeline pipeline = Pipeline.Start(stateItem, workflowPipelineArgs);
        if (pipeline == null)
            return;
        WorkflowCounters.ActionsExecuted.IncrementBy(pipeline.Processors.Count);
    }
}

Tack vare den här tråden

Utför arbetsflödeskommando för att ändra arbetsflödesläget

Tack vare det här fantastiska inlägget

Om vi vill efterlikna Sitecore UI-beteende och köra kommandot som kommer att ändra arbetsflödestillståndet, måste vi använda WorkflowProvider för att få en instans av arbetsflödet tilldelat det givna objektet och anropa Execute-metoden med ett valt kommando-ID. Detta avfyrar alla handlingar som definieras under kommandobjektnoden, ändrar objektets tillstånd och avfyrar alla autohandlingar som definieras under den nya tillståndsnoden:

public static WorkflowResult ExecuteCommand(Item item, string commandName, string comment)
{
    IWorkflow workflow = item.Database.WorkflowProvider.GetWorkflow(item);
 
    if (workflow == null)
    {
        return new WorkflowResult(false, "No workflow assigned to item");
    }
 
    WorkflowCommand command = workflow.GetCommands(item[FieldIDs.WorkflowState])
        .FirstOrDefault(c => c.DisplayName == commandName);
 
    if (command == null)
    {
        return new WorkflowResult(false, "Workflow command not found");
    }
 
    return workflow.Execute(command.CommandID, item, comment, false, new object[0]);
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow