Sitecore: Assign workflow to an item programmatically

后端 未结 4 1692
深忆病人
深忆病人 2020-12-17 04:24

I have configured a workflow, starts with \"Draft\" state as usual. And I have configured the workflow for standard values of the template. It works perfect in Content edito

相关标签:
4条回答
  • 2020-12-17 04:45

    Solved the issue with Standard Fields,

    newItem.Editing.BeginEdit();                    
    newItem.Fields["__Workflow"].Value = "{4D1F00EF-CA5D-4F36-A51E-E77E2BAE4A24}"; //Set workflow
    newItem.Fields["__Workflow state"].Value = "{7F39DF46-B4B9-4D08-A0D4-32DE6FD643D1}"; //Set   workflow state to Unposted.
    newClassified.Editing.EndEdit();  
    
    0 讨论(0)
  • 2020-12-17 04:46

    I would not use Dhanuka777's answer as it does not utilise Sitecore's Workflow State Commands and the useful functionality that comes with it e.g. email generation. It also requires hardcoding Guids.

    Benefits of the below code:

    • Utilise Sitecore’s State Commands and the nice functionality they have e.g. generating emails to alert users etc
    • Don’t store the Guids of the States and Commands inside the solution
    • Independent of Sitecore's Context
    • Abstract so it can be used for all Workflows in Sitecore.
        public bool UpdateWorkflow(WorkflowState newWorkflowState, Item item)
        {
            Assert.ArgumentNotNull(newWorkflowState, "The new WorkflowState can not be null");
            Assert.ArgumentNotNull(item, "Item can not be null");
    
            bool successful = false;
    
            WorkflowState currentWorkflowState = GetWorkflowStateForItem(item);
    
            if (currentWorkflowState != newWorkflowState)
            {
                IWorkflow workflow = GetWorkflowOfItem(item);
    
                if (workflow != null)
                {
                    List<WorkflowCommand> applicableWorkflowCommands = workflow.GetCommands(currentWorkflowState.StateID).ToList();
    
                    foreach (var applicableWorkflowCommand in applicableWorkflowCommands)
                    {
                        Item commandItem = _database.GetItem(applicableWorkflowCommand.CommandID);
    
                        string nextStateId = commandItem["Next state"];
    
                        if (nextStateId == newWorkflowState.StateID)
                        {
                            WorkflowResult workflowResult = workflow.Execute(applicableWorkflowCommand.CommandID, item, "", false);
                            successful = workflowResult.Succeeded;
                            break;
                        }
                    }
                }
            }
            else
            {
                successful = true;
            }
    
            return successful;
        }
    
        public WorkflowState GetWorkflowStateForItem(Item item)
        {
            var workflow = GetWorkflowOfItem(item);
            return workflow != null ? workflow.GetState(item) : null;
        }
    
        public IWorkflow GetWorkflowOfItem(Item item)
        {
            return _database.WorkflowProvider.GetWorkflow(item);
        }
    
        private Database _database
        {
            get
            {
                return Sitecore.Data.Database.GetDatabase("master");
            }
        }
    
    0 讨论(0)
  • 2020-12-17 04:50

    After making sure I'd set a default workflow on the standard values, the following combination, with thanks to posters above, worked perfectly:

    var workflowId = item.Fields["__Default workflow"].Value;
    var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
    workflow.Start(item);
    
    0 讨论(0)
  • 2020-12-17 05:07

    I looked all over for a good answer to this. I was creating a new item and wanted to start its workflow. jRobbins's answer didn't work for me because it throws an exception if the current workflow state of the item is null and it didn't offer a good way of setting the initial workflow state.

    The following worked for me:

    var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId);
    workflow.Start(item);
    

    This sets the workflow of my new item plus sets its workflow state to the initial state.

    0 讨论(0)
提交回复
热议问题