2012-11-23 97 views
5

我已經配置了一個工作流程,照常以「草稿」狀態開始。我已經爲模板的標準值配置了工作流程。它在內容編輯器中非常完美。 (當我創建一個項目使用內容編輯器,一旦我創建項目,工作流程被分配到該項目,它的狀態變成「草稿」。)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(); 

回答

4

解決了標準字段的問題,

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

不要用這種方式設置硬編碼的Guid。使用jRobbins答案來正確設置它。 –

+2

針對我們的特殊需求,硬編碼ID對我們來說很好。有一點需要注意的是,您可以使用'Sitecore.FieldIDs.Workflow'和'Sitecore.FieldIDs.WorkflowState'而不是'__Workflow [...]'。例如:'itemVersion.Fields [Sitecore.FieldIDs.WorkflowState] .Value = approvedState.ToString();'。 –

11

我不會用Dhanuka777的答案,因爲它不會使用Sitecore的工作流狀態的命令,並且例如,用它的有用的功能電子郵件代。它也需要硬編碼指導。下面的代碼的

優點:

  • 利用Sitecore的狀態命令和漂亮的功能,他們 有例如生成的電子郵件提醒用戶等
  • 不要國家和命令的GUID存儲解決方案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<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"); 
     } 
    } 
+3

我不認爲這個過於複雜的代碼與4(!)嵌套if語句應該是「正確」的方式來做某事。而且似乎沒有回答這個問題:如何將工作流和隨機工作流狀態分配給項目。相反,如果下一個狀態恰好是所需的狀態,它基本上會將項目移動到下一個工作流程狀態。 – eloycm

3

我到處尋找一個很好的答案。我正在創建一個新項目並希望開始其工作流程。 jRobbins的答案對我不起作用,因爲如果該項目的當前工作流程狀態爲空,並且它沒有提供設置初始工作流程狀態的好方法,則會引發異常。

以下爲我工作:

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

這臺我的新項目的工作流程以及將其工作流狀態到初始狀態。

1

確保我設定的標準值,下面結合一個默認的工作流程,以感謝海報上面後,工作完美:

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