2012-11-23 6 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

は、サイトコアのワークフローの状態のコマンドと、例えば、それに付属している便利な機能を利用しないように私はDhanuka777の答えを使用することはありません標準フィールド、

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

この方法でハードコードされたGuidsを設定しないでください。それを正しく設定するには、jRobbinsの答えを使用します。 –

+2

私たちの特別な必要性のために、ハードコードされたIDは私たちのためには大丈夫でした。注意すべき点は、 '__Workflow [...]'の代わりに 'Sitecore.FieldIDs.Workflow'と' Sitecore.FieldIDs.WorkflowState'を使用できることです。例: 'itemVersion.Fields [Sitecore.FieldIDs.WorkflowState] .Value = approvedState.ToString();'。 –

11

で問題を解決しました電子メール生成。また、Guidをハードコーディングする必要もあります。以下のコードの

利点:

  • 活用サイトコアの国家コマンドと彼らが持っている 素敵な機能、例えばそれはサイトコア内のすべてのワークフローのために使用することができるように、抽象ユーザーに警告する電子メールなど
  • は、サイトコアのコンテキストの
  • 依存しないソリューション内の米国およびコマンドのGUIDを格納しないでください
  • を生成します。
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の答えは、アイテムの現在のワークフロー状態がnullで、初期ワークフロー状態を設定する良い方法を提供していない場合に例外をスローするため、私にとっては機能しませんでした。

私のために働い以下:

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); 
関連する問題