Tridion工作流 - 如何在事件处理程序中的活动中获取组件

时间:2013-02-13 08:11:15

标签: workflow tridion

我需要在事件系统中获取与Activity关联的组件。

我尝试使用以下方式获取组件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;

但是此解决方案返回null。

然后我在互联网上找到了下一个解决方案:

 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相关联的组件?

谢谢。

3 个答案:

答案 0 :(得分:5)

在回顾了Guskermitt所需的功能之后,我向他展示了一种更简洁的方式来做他需要做的事情。简而言之,在这种情况下不需要EventSystem。

他的目标是在组件获得批准后发送电子邮件,方法如下:

  1. 向工作流程添加新的自动活动。
  2. 创建一个新的.NET程序集,在本例中是一个C#类来完成他需要做的事情。
  3. 在GAC中注册程序集。
  4. 在工作流程中的新自动活动中添加逻辑以使用.NET程序集。
  5. 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"
    

答案 1 :(得分:3)

ActivityInstanceWorkItems属性(继承自Activity),其中包含对Component的引用。

答案 2 :(得分:2)

OnActivityInstanceFinishPost表示您的活动已完成。因此,没有更多的工作项与之相关联。但是,您将获取流程实例和与之关联的工作项。如果您在那里获得null,那么它表明您的工作流程已完成且组件已移出工作流程。通过查看代码,很可能您的ProcessInstance已完成(它不会为null,但它不会有任何与之关联的项目。)

我怀疑您已阅读此帖http://www.tridiondeveloper.com/autopublishing-on-workflow-finish建议查看历史记录。您是否通过CM GUI查看历史记录,那里是历史项目?如果不是,那就是为什么你得到null。工作流程过程在完成后移动到历史记录。因此,在查看历史记录之前,请仔细检查您确实在最后一个工作流程活动中。

通过查看代码,错误似乎是您尝试使用activityInstance.ProcessInstance.ID获取历史对象。 GetObject()应该返回一个项目,但是你对ProcessHistory的强制转换应该会中断,然后你会悄悄地吃掉异常。您需要传递历史记录ID,而不是ProcessInstance ID,如下所示:

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