InfoPath + Workflow + MOSS
在MOSS 2007种利用InfoPath 2007结合Workflow Foundation可以高效的做出非常强大的工作流应用。因为在SDK中这部分的内容有点不流畅,读起来比较费劲。所以我想以我的一点小经验和大家Share下,希望能少走点弯路,然后再结合SDK 、ECM Starter Kits 和 WSS Workflow StarterKits 快速掌握这个非常棒的功能。
1、我要创建用于 MOSS 的 Workflow 项目。
请下载 WSS Workflow StarterKits,安装后将有个"SharePoint Server"的组,内有 SharePoint Sequential Workflow Library 和 SharePoint State Machine Workflow Library 两个项目模板。利用这两个模板创建的项目,对 Workflow 的开发、部署都很方便。
- 项目用到的 Microsoft.Office.Workflow.Tasks.dll、Microsoft.SharePoint.dll 和 Microsoft.SharePoint.WorkflowActions.dll均在装有MOSS 2007的机器的 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI\ 目录下。其中开发时主要注意记得在VS2005工具箱里注册 microsoft.sharepoint.WorkflowActions.dll,就可以从工具箱里拖拉出MOSS 特有的 Workflow 控件了。
- Feature.xml:在 MOSS 中, Workflow 是作为 MOSS 的 Feature 存在的,具体使用时再关联到具体某个 List 或 Library 中并创建实例运作的。因为 Feature.xml 文件就是安装部署时候要把生成的项目 dll 文件作为 Feature 注册到MOSS 中的描述文件了。刚打开时是空的,只是一些提示,按提示插入 Feature 的 Snippets,就有一段 xml 代码插入。其中 GUID 可通过 VS2005 菜单 Tools 下的 Create GUID 创建一个新的 GUID 填入;中间有个 <ElementManifest Location="workflow.xml" /> 节点用于关联工作流 xml 描述文件。
- Workflow.xml:工作流描述文件。其中有工作流名字Name(该名字在添加 Workflow 关联具体列表或文档库时显示在工作流列表中);GUID(同样通过 Create GUID 生成填入);CodeBesideClass和CodeBesideAssembly对应工作流类全名和程序集全称(项目如进行签名,此处需明确PublickToken,同时把 install.bat 中 gacutil 部分反注释掉);TaskListContentTypeId为工作流使用到的任务列表的 ContentType ID,默认为 Workflow Tasks 的 ContentTypeID,一般不需要修改;AssociationUrl、InstantiationUrl和ModificationUrl一般也不用改,默认创建即是用于呈现InfoPath 的页面,其中 AssociationUrl 为用来关联 Workflow 和列表或文档库,并设置工作流运行参数的页面;InstantiationUrl为用于当手动启用工作流时呈现给用户的初始化页面。Association_FormURN 和 Instantiation_FormURN 等以 _FormURN 结尾的节点都存放其相应的InfoPath Form 的 ID(该 ID 可通过设计InfoPath Form时,打开“文件->属性”窗口即可看到该InfoPath Form 的 ID)。关于 TaskForm 下面解释。
- install.bat:用于安装部署Workflow的批处理文件。根据具体情况注释或反注释命令行,同时配置MOSS地址即可。
- Workflow1.cs:工作流设计和代码。
2、我的 InfoPath 表单模版无法正常发布,或者发布后状态为“Installing”而不是“Ready”。
请检查以下几个环节,一般无法正常发布都有可能是以下原因造成。
3、我在 MOSS 列表中设置 Workflow 为新增一条记录 A 时就自动启动,同时给审批者创建一条任务,该任务用了我自己定义的任务InfoPath 表单,但该 InfoPath 任务表单中有几个字段是要读取记录A中字段值来显示的。
这个问题的实质就是要把某条具体 ListItem 中的字段值传递给 Task 表单(该表单为 InfoPath 表单),然后再通过Task表单显示出来。这里头有三个子问题:怎样获取和当前Workflow相关的 ListItem、通过怎样方式把值传递给 Task表单、Task 表单最后又怎么呈现。
具体范例可以查看 ECMStarterKits中 HelloWorld 经典示例。结合上面注意的几点。
4、我现在已经在 Workflow.xml 里配置了一个 Task Form了(有类似这么一个节点<Task0_FormURN>urn:schemas-microsoft-com:office:infopath:ReviewTaskForm:-myXSD-2005-11-22T23-52-35</Task0_FormURN>),这个 Task Form是我第一个 Task 用到的,但我还有第二步,第三步,每个步骤都会建一个任务,我的每个任务都要对应不同的 Task Form 来收集每个阶段的用户录入的数据来运作工作流的。怎么加第二个任务表单?
根据 SDK 《Windows Task Form〉,无疑,增加第二个Task Form的第一步就是在把设计好的第2步用到的InfoPath 表单模板的 ID(URN) 配置起来。即在<Task0_FormURN>节点下增加类似这么一个节点:<Task1_FormURN>urn:schemas-microsoft-com:office:infopath:MultiStage-Initiation:-myXSD-2006-04-28T22-44-03</Task1_FormURN>。
真正核心的问题来了,怎么让第2个任务表单<Task1_FormURN>和实际工作流中分配的第2条任务关联起来?好,关键就在 SPWorkflowTaskProperties.TaskType 这个属性。TaskType = 0 时就表示这是第一个任务请用第一个任务表单,TaskType=1时就表示这是第二个任务请用第二个任务表单。就是这么简单。:)
你可以打开 ECM StarterKits中的 MultiStage 示例,这个示例是比较实用的例子,务必研读。打开示例中的 WorkflowTask.cs,找个GetTaskCreationProperties()方法。修改如下:
public SPWorkflowTaskProperties GetTaskCreationProperties(int taskType)
{
SPWorkflowTaskProperties properties = new SPWorkflowTaskProperties();
properties.AssignedTo = this.Participants[0].AccountId;
properties.Title = this.TaskTitle;
properties.Description = this.TaskInstructions;
properties.SendEmailNotification = true;
properties.TaskType = taskType;
properties.DueDate = (DateTime)this.dueDate;
return properties;
}
然后再打开 Workflow1.cs 代码,搜索到这么一行代码 activity.TaskCreationProperties = this.activeTask.GetTaskCreationProperties(); 改为:
activity.TaskCreationProperties = this.activeTask.GetTaskCreationProperties(this.completedStages);
至此,这个 MultiStage 例子就更智能化了。你在增加工作流步骤外,还可以方便控制每个步骤任务用到的 InfoPath 表单了,而不是都用同一个表单。
5、先到这里吧。最后推荐几篇经典文章:
总结
以上是生活随笔为你收集整理的InfoPath + Workflow + MOSS的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 华硕a豆14 Pro评测
- 下一篇: 《PlaneNet-单幅RGB图像的分段