2010-12-23 122 views
4

我試圖在工作流命令中實現一個基本的Javascript確認框(例如,「你確定要編輯它嗎?」)。根據用戶是否點擊是或否,我想要在工作流程中轉到不同的狀態。這是我現在有(某種邏輯取出)代碼:Sitecore工作流和管道

[Serializable] 
public class ConfirmAction 
{ 
    public void Process(WorkflowPipelineArgs args) 
    { 
     Item currentItem = args.DataItem; 
     ClientPipelineArgs clientArgs = new ClientPipelineArgs(); 
     Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs); 
    } 

    protected void DialogProcessor(ClientPipelineArgs args) 
    { 
     if (args.IsPostBack) 
     { 
      if (args.Result != "yes") 
      { 
       args.AbortPipeline(); 
       return; 
      } 
     } 

     else 
     { 
      Sitecore.Context.ClientPage.ClientResponse.Confirm("Are you sure you want to edit this?"); 
      args.WaitForPostBack(); 
     } 
    } 
} 

我是新來的管道模型,特別是關係到Sitecore的,所以我有點在抓救命稻草。我相信我遇到的問題是我沒有辦法從ClientResponse管道中將結果返回到工作流程管道,以告訴它該做什麼。

謝謝。

編輯:

使用燕的信息,我終於想出了以下解決方案:

public void Process(WorkflowPipelineArgs args) 
{ 
    Item currentItem = args.DataItem; 
    ClientPipelineArgs clientArgs = new ClientPipelineArgs(); 
    clientArgs.Parameters.Add("itemID", currentItem.ID.ToString()); 
    clientArgs.Parameters.Add("stateID", currentItem.Fields["__Workflow state"].Value); 
    Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs); 
} 

protected void DialogProcessor(ClientPipelineArgs args) 
{ 
    if (args.IsPostBack) 
    { 
     if (args.Result != "yes") 
     { 
      Item currentItem = Sitecore.Configuration.Factory.GetDatabase("master").GetItem(args.Parameters["itemID"]); 
      currentItem.Editing.BeginEdit(); 
      currentItem.Fields["__Workflow state"].Value = args.Parameters["stateID"]; 
      currentItem.Editing.EndEdit();     
      return; 
     } 
     SheerResponse.Eval("window.location.reload();");     
    } 

    else 
    { 
     Sitecore.Context.ClientPage.ClientResponse.YesNoCancel("Are you sure you want to edit this?", "200", "200"); 
     args.WaitForPostBack(); 
    } 
} 

回答

3

嗯,我覺得這是在那裏你可以從ClientPipelineArgs利用。比方說,你當前項目ID添加到參數傳遞:

public void Process(WorkflowPipelineArgs args) 
{ 
    Item currentItem = args.DataItem; 
    ClientPipelineArgs clientArgs = new ClientPipelineArgs(); 
    clientArgs.Parameters.Add("id", currentItem.ID.ToString()); 
    Sitecore.Context.ClientPage.Start(this, "DialogProcessor", clientArgs); 
} 
當你得到積極的結果,你拿回來,並移動到目標工作流狀態上

及更高版本(註釋說明):

protected void DialogProcessor(ClientPipelineArgs args) 
{ 
    if (args.IsPostBack) 
    { 
     if (args.Result == "yes") 
     { 
      // 1. take item ID from args.Parameters["id"]; 
      // 2. get item by this ID 
      // 3. move item to target workflow state 
     } 
    } 
    else 
    { 
     Sitecore.Context.ClientPage.ClientResponse.Confirm("Are you sure you want to edit this?"); 
     args.WaitForPostBack(); 
    } 
} 

這可能需要一些小的改變(我在發佈之前沒有自己運行),但希望你明白。

+0

嗨妍,謝謝你的回答。我已經看過這種方法,但我不清楚如何控制給定項目的工作流程狀態。我覺得這是我需要通過WorkflowPipelineArgs完成的事情。這是不正確的? – raynjamin 2010-12-27 15:03:55