2013-02-13 65 views
6

我需要在事件系統中獲取與活動關聯的組件。Tridion工作流程 - 如何在事件處理程序的活動中獲取組件

我嘗試使用,以獲取組件ID:

public void OnActivityInstanceFinishPost(ActivityInstance activityInstance, string finishMessage, string nextActivity, string dynamicAssignee) 
    { 

     if (activityInstance.ProcessInstance.ProcessDefinition.Title.Equals("Component Process IESE")) 
     { 
      if (activityInstance.ActivityDefinition.Title.Equals("Create or Edit Component")) 
      { 
       WFE workflow = tdse.GetWFE(); 
       try 
       { 
        Component comp = (Component)activityInstance.ProcessInstance.Item; 

        XMLReadFilter filter = new XMLReadFilter(); 
        String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080"); 

        ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 

       } 
       catch (Exception e) 
       { } 

      } 
     } 
    } 

我們嘗試不同的選擇:

Component comp = (Component)activityInstance.ProcessInstance.Item; 

但這種方法會返回一個空。

然後我在網上找到了一個解決方案:

XMLReadFilter filter = new XMLReadFilter(); 
String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080"); 

ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 
Component comp = hist.Item as Component; 

但ProcessHistory對象爲null。

如何確定與activityInstance關聯的組件?

謝謝。

+0

哪個中醫版本是這樣? – 2013-02-13 08:43:06

+0

Tridion 2009 SP1 – Guskermitt 2013-02-13 12:20:10

回答

5

審查通過Guskermitt所需的功能後,我已經證明了他一個更合適的方法做他需要做什麼。簡而言之,在這種情況下不需要EventSystem。

他的目標是一個組件已獲得批准後,發送電子郵件,該辦法將是以下幾點:

  1. 添加到工作流程中新增自動活動。
  2. 創建一個新的.NET程序集,在這種情況下是一個C#類來完成他需要做的事情。
  3. 在GAC中註冊程序集。
  4. 在工作流程的新自動活動中添加邏輯以使用.NET程序集。

2#

[ProgId("WfHelper")] 
[ComVisible(true)] 
public class Helper 
{  
public void SendMail(string workItemId) 
{ 
var session = new Session(); 
. 
. 
. 

4#

dim helper 
set helper = CreateObject("WfHelper") 
call helper.SendMail(CurrentWorkItem.ID) 
set helper = nothing 
FinishActivity 「Email has been sent" 
3

ActivityInstance有一個WorkItems屬性(繼承自Activity),其中包含對您的Component的引用。

+0

謝謝你,Arjen。我們找不到與該活動關聯的工作項。我們已經安裝了Tridion 2009 SP1。你能通過一個例子嗎? – Guskermitt 2013-02-13 14:24:33

2

OnActivityInstanceFinishPost表示您的活動已完成。因此沒有更多的工作項與之相關聯。但是,您正在獲取與此相關的流程實例和工作項目。如果您在那裏得到零,那麼它表明您的工作流程已完成,並且組件已移出工作流程。從查看代碼,很可能您的ProcessInstance已完成(它不會爲空,但它不會有任何與其關聯的項目)。

我懷疑你已閱讀這篇文章http://www.tridiondeveloper.com/autopublishing-on-workflow-finish建議查看歷史記錄。你有沒有通過CM GUI查看歷史記錄,那裏有歷史記錄嗎?如果不是,那就是爲什麼你會得到空值。工作流程過程在完成時移至歷史記錄。因此,在查看歷史記錄之前,請仔細檢查您是否確實處於上次工作流程活動狀態。

通過查看您的代碼,錯誤似乎是您正在嘗試使用activityInstance.ProcessInstance.ID獲取歷史記錄對象。 GetObject()應該返回一個項目,但是你的轉換到ProcessHistory應該會中斷,然後你悄悄地吃掉這個異常。你需要在歷史ID傳遞,而不是processInstance的ID如下:

ProcessHistory hist = (ProcessHistory)tdse.GetObject(processHistoryId, EnumOpenMode.OpenModeView, Constants.URINULL, filter); 
+0

你好,我檢查了你的改變我的代碼,但它沒有奏效。 – Guskermitt 2013-02-13 16:57:44

+0

您是否通過CM GUI查看歷史記錄,是否有歷史記錄,並且您是否參與了工作流程中的最後一項活動? – 2013-02-13 17:18:02

+0

我回顧了CM GUI中的「歷史列表」,所有任務都完成了131076.我無法在131080中看到完成tcm的活動。在OnActivityInstanceFinishPost中處理的活動是我完成的第一個活動。謝謝。 – Guskermitt 2013-02-14 07:44:23

相關問題