先看 Kaneboy 的《SharePoint Designer 2007, 强大的工作流设计器》。然后,我们针对利用 SPD 2007进行扩展、设计工作流三个常见问题做一些回答。由于开始步入大忙期,时间和精力有限,每个问题我都只点到为止,具体更细节就不累赘。
1、“从用户处收集数据”这个Action中输出的输出变量是什么,做什么用?或者换个问法,我怎么获取用户填写在收集表单里的数据?
A:输出的变量实际上是任务列表中的ItemID。“从用户处收集数据”这个Action是一个强迫工作流暂停以等待用户进行操作的过程。该Action实际是以任务形式在任务列表中新建一条任务向用户派发,然后用户上来编辑任务进行录入数据,以完成任务。这个输出变量ItemID就是用来定位获取用户填写的数据项的。在Conditions中放入“比较任意数据”,选择“任务”列表要查找用户输入值的哪个字段,然后下面把任务ID和输出变量关联即可。
2、初始变量Initiations和变量Variables有何区别?
A:初始变量赋值于工作流启动前,而Variables则赋值于工作流启动后。二者均在整个工作流生命周期内可用。初始变量工作流务必设置默认值,用于当新建就自动触发工作流的情景。无法通过查找获取到的数据,或者多次反复使用的数据都可以存入变量Variables中,以便在Workflow周期里方便使用。
3、自定义扩展Activity中,如何获取当前SPWeb、SPList、SPListItem、SPFile等?比如,最简单的,如何获取当前工作流运作的ListItem数据?
A:完全可以在自定义Activity中通过WorkflowContext上下文获取到当前项或当前SPWeb等信息。除非你要获取其他Site的数据,否则就没必要用去把Site Url、List Guid或ListItem ID等这些数据信息作为输入参数让工作流定制人员来手工输入以获取相关对象。
下面为一个代码模板(LiveWriter不支持代码色彩,就看黑白的代码吧):
public class MyActivity: Activity
{
#region Properties
public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
public WorkflowContext __Context
{
get
{
return (WorkflowContext)base.GetValue(__ContextProperty);
}
set
{
base.SetValue(__ContextProperty, value);
}
}
public static DependencyProperty ListItemProperty = DependencyProperty.Register("ListItem", typeof(int), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
public int ListItem
{
get
{
return (int)base.GetValue(ListItemProperty);
}
set
{
base.SetValue(ListItemProperty, value);
}
}
public static DependencyProperty ListIdProperty = DependencyProperty.Register("ListId", typeof(string), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
public string ListId
{
get
{
return (string)base.GetValue(ListIdProperty);
}
set
{
base.SetValue(ListIdProperty, value);
}
}
#endregion
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
Guid listGuid = Helper.GetListGuid(__Context, ListId);
SPList list = __Context.Web.Lists[listGuid];
SPListItem item = __Context.GetListItem(list, ListItem);
// 做自己的事 :)
return ActivityExecutionStatus.Closed;
}
其对应在 WSS.ACTIONS 中的节点配置如下:
<Action Name="测试Activity"
ClassName="TestActivities.MyActivity"
Assembly="TestActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dd27a7cb343a4cac"
AppliesTo="list"
Category="我的自定义操作">
<RuleDesigner Sentence="输出 %1 到数据库">
<FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseDoclibItem" />
</RuleDesigner>
<Parameters>
<Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In"/>
<Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" />
<Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In" />
</Parameters>
</Action>
几点说明:
SPD 2007 设计工作流基本也就这些东西,主要要扩展的还是需要你用 VS2005 来自定义 Activity 配合,才能达到最大灵活性。
剩下的就是发挥想象力动手吧。