Sitecore:以编程方式将工作流分配给项目

我已经配置了一个工作流程,像往常一样以“草稿”状态开始。 我已经为模板的标准值配置了工作流程。 它在内容编辑器中工作得很好。 (当我使用内容编辑器创建项目时,一旦我创建项目,工作流程就会被分配给项目,并且状态变为“草稿”。)

但是当我在上述模板下以编程方式创建项目时,它不会分配工作流程。 我该怎么做才能分配工作流程? 如果有,请分享任何代码示例。

谢谢。

Sitecore.Data.Items.TemplateItem template = this.MasterDatabase.GetItem("/sitecore/templates/user defined/sample types"); Sitecore.Data.Items.Item parent = this.MasterDatabase.GetItem(parentId); Sitecore.Data.Items.Item newItem; // Create new item and retrieve it newItem = template.CreateItemFrom("sampleName", parent); newItem.Editing.BeginEdit(); newItem.Name = StringFormatter.CreateItemNameFromID(this.newItem); newItem.Fields["Title"].Value = "Sample Title" newItem.Editing.EndEdit(); 

我不会使用Dhanuka777的答案,因为它不使用Sitecore的工作流状态命令及其附带的有用function,例如电子邮件生成。 它还需要硬编码Guids。

以下代码的好处:

  • 利用Sitecore的状态命令及其具有的良好function,例如生成电子邮件以提醒用户等
  • 不要在解决方案中存储状态和命令的Guids
  • 独立于Sitecore的背景
  • 摘要,因此它可以用于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 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"); } } 

解决了标准字段的问题,

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

我全神贯注地寻找一个很好的答案。 我正在创建一个新项目,并希望开始其工作流程。 jRobbins的答案对我不起作用,因为如果项目的当前工作流状态为null并且它没有提供设置初始工作流状态的好方法,则会抛出exception。

以下对我有用:

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

这将设置我的新项目的工作流程,并将其工作流程状态设置为初始状态。

在确定我在标准值上设置默认工作流程后,以下组合,感谢上面的海报,完美地运作:

 var workflowId = item.Fields["__Default workflow"].Value; var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow(workflowId); workflow.Start(item);