有朋友问用QF的时候一些具体的功能如何实现,如以下的问题:
“我用的是 vs2008+quickflow+infopath,想在vs 代码里来更新文档库中项的值 同时还需要更新其他相关联的列表项的值”
QF的基础是WF3.5和SharePoint本身的功能,然后提供了Flowchart类型的流程和一些常用的活动,显然,QF不可能考虑到所有的业务场景,不可能提供对所有功能的内在支持。
幸运的是,WF本身具有很强的扩展性,而QF并没有把这些扩展性屏蔽掉。基于QF的扩展开发包含以下内容:
1)EventBus的扩展,见SharePoint工作流解决方案QuickFlow系列(6)—事件总线(EventBus)
2)开发自定义的Activity,包含两种活动:
- 原生的WF活动。QF支持原生的WF活动,但是原生WF活动不能放到Flowchart的根下,必须采用Step活动包装(即先添加一个Step活动,然后再Step活动中即可添加任意其他活动)
- QF的活动,支持直接添加到Flowchart的根下,并可以画线连接其他活动。
本篇文章就来讲解下QF活动的扩展开发,原生QF活动的开发可以参照QF活动。
本文以一个简单的请假审批流程作为示例: 员工提交请假申请,部门经理审批,审批通过后,自动添加一个日历项到日历列表中。
1)先创建一个列表,用来提交请假信息,名称为“请假申请”,并添加开始时间,结束时间,备注三个字段。
2)新建一个Workflow Activity Library类型的项目,名称为QFExtensions.
3)添加对QuickFlow.dll和Microsoft.SharePoint.dll的引用
Microsoft.SharePoint.dll在目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI中
将QuickFlow.wsp改名为QuickFlow.cab,然后解压缩,即可得到QuickFlow.dll
4)将活动名称改为AddCalendar, 基类改为QuickFlow.SPSequenceActivity。
所有可以添加到Flowchart跟上的活动都必须继承于SPSequenceActivity。
然后重载Execute方法,编写添加日历项的代码:
[ToolboxItem(typeof(ActivityToolboxItem))] [Designer(typeof(ActivityDesigner), typeof(IDesigner))] public partial class AddCalendar: QuickFlow.SPSequenceActivity { public AddCalendar() { InitializeComponent(); } protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { SPWeb web = this.WorkflowProperties.Web; SPList calendarList = web.Lists["Calendar"]; SPListItem item = calendarList.Items.Add(); item["Title"] = "请假:" + this.WorkflowProperties.Item.Title; //此处的Start Time等日历列表的字段需要实际版本修改,这儿是英文版上的字段名 item["Start Time"] = this.WorkflowProperties.Item["开始时间"]; item["End Time"] = this.WorkflowProperties.Item["结束时间"]; item["Description "] = this.WorkflowProperties.Item["备注"]; item.Update(); return ActivityExecutionStatus.Closed; } }
5)将项目进行强签名,然后将QFExtensions.dll部署到GAC中,(直接将dll拖拽到C:\Windows\assembly或者执行示例项目中的GAC.bat文件)
6)配置web.config
用Reflector打开QFExtensions.dll,找到程序集的全名
修改应用程序目录下的web.config,在authorizedTypes节点中添加配置:
<authorizedType Assembly="QFExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=25e4e899ff9bd7c5" Namespace="QFExtensions" TypeName="*" Authorized="True" />
7)配置QuickFlowDesigner。
打开QuickFlowDesigner目录下的ToolboxItems.txt文件,添加一行配置:
QFExtensions.AddCalendar,QFExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=25e4e899ff9bd7c5
8)启动QFD,可以看到AddCalendar活动已经出现在工具栏上了
9)画出流程图,发布流程,可以看看效果了
添加ListItem
启动流程
本文示例代码下载:
后记:有朋友问:如何怎样写带有属性的扩展组件?
编写WF活动的所有经验都可以用于QuickFlow的活动开发,对这个问题,只要给活动声明属性即可,假设要修改AddCalendar的代码,使日历列表的名字可以配置,代码如下:
[ToolboxItem(typeof(ActivityToolboxItem))] [Designer(typeof(ActivityDesigner), typeof(IDesigner))] public partial class AddCalendar: QuickFlow.SPSequenceActivity { public AddCalendar() { InitializeComponent(); } public string ListName{get;set;} protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { SPWeb web = this.WorkflowProperties.Web; SPList calendarList = web.Lists[this.ListName]; SPListItem item = calendarList.Items.Add(); item["Title"] = "请假:" + this.WorkflowProperties.Item.Title; //此处的Start Time等日历列表的字段需要实际版本修改,这儿是英文版上的字段名 item["Start Time"] = this.WorkflowProperties.Item["开始时间"]; item["End Time"] = this.WorkflowProperties.Item["结束时间"]; item["Description "] = this.WorkflowProperties.Item["备注"]; item.Update(); return ActivityExecutionStatus.Closed; } }
以上的代码中采用的是普通属性,普通属性在设计器中只能直接赋值,无法进行绑定,若要添加可以绑定的属性,则需要用WF中的依赖属性,将ListName声明修改如下:
public static DependencyProperty ListNameProperty = DependencyProperty.Register("ListName", typeof(System.String), typeof(AddCalendar)); [ValidationOption(ValidationOption.Required)] [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] [BrowsableAttribute(true)] [CategoryAttribute("Misc")] public String ListName { get { return ((string)(base.GetValue(ListNameProperty))); } set { base.SetValue(ListNameProperty, value); } }