为 Microsoft Office SharePoint Server 2007 创建工作流时,可以选择创建允许用户使用各种技术与工作流进行交互的各种表单。本演练演示如何使用 Microsoft Office InfoPath 2007 创建这些表单。只有当您也在使用 Microsoft Office SharePoint Server 2007 时,才可以选择使用 Microsoft Office InfoPath 2007。对于 Windows SharePoint Services 3.0,必需使用 ASPX 表单从工作流发起人那里收集数据。通过使用 Microsoft Office InfoPath 2007,用户能够通过 2007 Microsoft Office system 客户端应用程序(如 Microsoft Office Excel 2007、Microsoft Office Word 2007、Microsoft Office PowerPoint XML 格式 和 InfoPath Forms Services)以及 Web 浏览器与工作流进行交互。
在本演练中,我们创建一个使用 InfoPath 表单的简单工作流。工作流将任务分配给所选的用户,并等待该用户完成任务。工作流使用一个自定义 InfoPath 表单向启动工作流的用户收集初始数据,并使用另一个表单让指派的用户可以编辑工作流任务并将任务标记为已完成。
下面是本演练中描述的任务:
先决条件
若要完成本演练,需要安装以下软件:
注意: |
如同进行所有 Microsoft Office SharePoint Server 2007 开发一样,应当使用与要部署代码的环境极其相似的开发环境来创建工作流。 由于不一定总能使用开发者资源完整地复制一个生产环境,因此请确保这两个环境尽可能相似,这样才会大大简化开发和调试过程。例如,特定于 Microsoft Office SharePoint Server 2007 的工作流活动要求必须在用来开发工作流的计算机上安装 Windows SharePoint Services 和 Microsoft Office SharePoint Server 2007。 |
方案
在本演练中创建的示例工作流是一个基本工作流。当用户启动该工作流时,Microsoft Office SharePoint Server 2007 显示一个自定义初始表单,使用此表单可以从启动工作流的用户处收集三部分信息。以下信息将用于处理工作流:
之后,工作流创建任务并将其分配给指定的用户。该用户可以使用自定义任务编辑表单来编辑工作流任务。任务编辑表单包含一个复选框,用户可利用它将任务标记为已完成。每次用户编辑任务时,工作流会再次确定用户是否已将任务标记为已完成。在用户将任务标记为已完成之后,工作流会在 Microsoft Office SharePoint Server 2007 中将任务标记为已完成,然后结束工作流活动。
后续步骤
步骤 1:创建工作流初始表单
使用 Microsoft Office InfoPath 2007,可以创建在 2007 Microsoft Office system 客户端应用程序(例如 Microsoft Office Excel 2007、Microsoft Office Word 2007、Microsoft Office PowerPoint XML 格式 和 InfoPath Forms Services 自身)以及 Web 浏览器中运行的工作流表单。
此过程中的步骤发生在如何:为 Office SharePoint Server 2007 中的工作流设计 InfoPath 表单中所述过程之后。
注意: |
此过程假定您熟悉如何向 Microsoft Office InfoPath 2007 表单添加控件和配置这些控件。 |
创建工作流程初始表单
完成后,表单应该如下图所示。
注意,我们已命名了文本字段"assignee"、"instructions"和"comments"。稍后将使用这些文本字段名来填充从工作流代码中的 onWorkflowActivated 活动调用的 SPWorkflowActivationProperties。当表单将其数据提交给 Microsoft Office SharePoint Server 2007 后,Office SharePoint Server 2007 会启动一个新的工作流实例,并将这些自定义属性作为名称/值对添加到 SPWorkflowActivationProperties 对象。然后,工作流代码可以通过访问这些名称/值对来检索数据。
有关详细信息,请参阅如何:设计使用关联和初始数据的工作流表单。
在此过程中的晚些时候,您将提取此表单的架构以创建架构 (.xsd) 文件。然后,此架构将成为您在"onWorkflowActivation"活动中创建和引用的类的基础。表单字段集合名称将成为架构文件的根元素名称,而根据架构文件生成的类将与架构文件根元素同名。
按照前面的操作为字段集合指定唯一的名称,而不是使用默认名称 myfields,这将帮助确保根据表单架构文件生成的类也具有唯一的名称。当对反序列化多个表单的工作流进行编程时,这一点尤为重要。
注意: |
不要为表单指定备用路径。这样做会引发错误,使您无法将表单发布到服务器。 |
InfoPath 会将表单源文件集合(包括架构文件)保存到指定位置。表单架构文件总是命名为 myschema.xsd。
默认情况下,Visual Studio 2005 将 xsd.exe 命令行工具安装到以下位置(其中 C: 表示您的硬盘):
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
复制代码
xsd myschema.xsd /c /l:CS
或
复制代码
xsd myschema.xsd /c /l:VB
具体取决于您用于开发工作流的语言。
此命令根据表单架构生成新的类文件。将使用架构文件名称创建该文件。在此示例中,名称将为 myschema.cs。在该文件中创建的基类将与架构的根元素同名,架构的根元素与表单字段集合同名。在此演练中,名称为"InitForm"。
步骤 2:创建工作流任务编辑表单
步骤 2:创建工作流任务编辑表单
接下来,您需要创建一个表单,使工作流用户能够与分配给他们的工作流任务进行交互。
演练中的此步骤将遵循如何:设计工作流任务表单以使用任务数据中介绍的过程。
注意: |
此过程假定您熟悉向 Microsoft Office InfoPath 2007 表单添加控件和配置这些控件。 |
先决条件
步骤 1:创建工作流初始表单
创建工作流任务编辑表单
控件类型 |
名称 |
数据类型 |
文本框 |
说明 |
文本(字符串) |
复选框 |
isFinished |
True/False(布尔值) |
按钮 |
确定 |
N/A |
注意: |
因为此表单用于与工作流进行交互,所以您希望阻止 Office InfoPath 2007 提示用户进行保存。选择它可能会导致在执行工作流过程中引发异常 |
将工作流任务架构作为辅助数据源添加到您的表单中,使 Microsoft Office SharePoint Server 2007 能够为该表单提供任务数据,这用于在加载该表单后预写入字段值。第一步是创建表示工作流任务架构的 XML 架构文件。有关详细信息,请参阅如何:设计工作流任务表单以使用任务数据。
注意: |
文件名 ItemMetadata.xml 区分大小写。 |
Xml
复制代码
<?xml version="1.0" encoding="utf-8"?>
<z:row xmlns:z="#RowsetSchema"
/>
在本例中,您要显示用户在初始表单中输入的说明。请记住,创建工作流任务时这些说明已作为扩展属性添加到工作流任务中。
下面的代码演示如何从代码访问扩展的属性。
C#
复制代码
private void createTask(object sender, EventArgs e)
{
…
taskProps.ExtendedProperties["instructions"] = instructions;
}
因此您需要为 instructions 任务属性 (Property) 添加属性 (Attribute)。已完成的 ItemMetadata.xml 应包含以下文本。
Xml
复制代码
<z:row xmlns:z="#RowsetSchema"
ows_instructions=""
/>
您将 ItemMetadata.xml 文件作为资源文件包含在表单模板中后,在工作流解决方案中不再需要该文件。
任务表单需要 ItemMetadata.xml 作为辅助数据源。如果未添加 ItemMetadata.xml 作为辅助数据源,则表单在打开时将生成错误。 |
"Instructions"文本框控件此时绑定到 instructions 工作流任务属性。当 Microsoft Office SharePoint Server 2007 加载您的任务表单时,该表单将在文本框中显示任务说明。
步骤 3:创建工作流
在此演练的前两部分中,通过 Microsoft Office InfoPath 2007 创建了工作流启动和任务编辑表单。在此演练的最后一步,您将使用 Visual Studio 2005 Designer for Windows Workflow Foundation 创建一个顺序工作流项目和该工作流的代码组件。
先决条件
为完成此演练,必须完成以下过程:
注意: |
与所有 Microsoft Office SharePoint Server 2007 开发工作一样,您应使用与将要部署代码的环境非常相似的开发环境来创建工作流。尽管使用开发资源并非总是能够完全复制生产环境,但确保这两种环境尽可能相似将可以大大简化开发和调试过程。例如,特定于 Microsoft Office SharePoint Server 2007 的工作流活动要求在用于开发工作流的计算机上安装 Windows SharePoint Services 和 Microsoft Office SharePoint Server 2007。 |
创建新的 Office SharePoint Server 2007 工作流项目
Visual Studio 2005 Designer for Windows Workflow Foundation 将打开一个新的工作流项目。该工作流项目中包含所需的 Windows SharePoint Services 3.0 引用,并且工具箱上包含专门针对 Windows SharePoint Services 3.0 工作流设计的工作流活动。
在解决方案资源管理器中,右键单击您的项目名称。选择"添加",然后选择"现有项"。使用"添加现有项"对话框,浏览到您在其中创建您的 InitForm.cs 文件或 InitForm.vb 文件的位置并单击"添加"。
添加和配置工作流活动
既然已经创建了新的工作流项目,那么现在让我们开始设计工作流。
在此工作流中,共有 5 个活动。
活动 |
说明 |
OnWorkflowActivated |
在激活工作流时执行。 |
CreateTask |
创建新工作流任务,并将其分配给用户。 |
While |
执行它包含的活动,直到某个特定条件不再为 true。 |
OnTaskChanged |
在工作流任务被修改时执行。 |
CompleteTask |
将工作流任务设置为已完成。 |
设置 OnWorkflowActivation 活动的属性
在使用 Windows SharePoint Services 顺序工作流项目模板创建了您的工作流项目时,Visual Studio 2005 会自动将第一个活动添加到您的设计图面,并在代码隐藏文件中创建一种方法。此第一个活动被称为 OnWorkflowActivated,默认名称为 onWorkflowActivated1。所有 Windows SharePoint Services 3.0 工作流都必须使用此活动启动。
如果未显示工作流的图形表示形式,请在解决方案资源管理器中双击 Workflow1.cs 文件。如果工作流设计器仍然没有预填充 OnWorkflowActivated 活动,请确保您使用了正确的 Windows SharePoint Services 顺序工作流模板。 |
请注意,在属性窗口中,CorrelationToken 和 Path 属性分别设置为 workflowToken 和 workflowProperties。它们都是工作流变量,工作流引擎使用它们将数据传送到适当的工作流实例。激活工作流实例时,将初始化 workflowProperties 变量对象。它包含所有工作流公用的属性,如工作流实例标识符 (ID) 和运行工作流实例的列表项。还可以包含传递给自定义工作流启动表单的自定义属性。在这种情况下,workflowProperties 变量将包含工作流实例的启动属性。 |
C#
复制代码
using System.Xml;
using System.Xml.Serialization;
using Microsoft.SharePoint.Workflow
C#
复制代码
private String assignee = default(String);
private String instructions = default(String);
private String comments = default(String);
复制代码
namespace WorkflowLibrary1
{
public sealed partial class Workflow1: SharePointSequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent(); }
public Guid workflowID = default(System.Guid);
public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties
workflowProps = new
Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();
}
C#
复制代码
private void onWorkflowActivated(object sender, ExternalDataEventArgs e)
{
workflowID = workflowProps.WorkflowId;
XmlSerializer serializer = new XmlSerializer(typeof(InitForm));
XmlTextReader reader = new XmlTextReader (new System.IO.StringReader(workflowProps.InitiationData));
InitForm initform = (InitForm) serializer.Deserialize(reader);
assignee = initform.assignee;
instructions = initform.instructions;
comments = initform.comments;
}
添加 CreateTask 活动
请注意,taskToken、taskId 和 taskProps 都是变量名称。taskToken 变量是相关令牌,使 Office SharePoint Server 2007 可将数据传送到工作流实例中的适当任务。taskId 变量是 GUID,用于标识工作流实例中的任务。taskProps 变量中包含用于初始化该任务的属性。 |
复制代码
public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties afterProps = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties beforeProps = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
C#
复制代码
private void createTask(object sender, EventArgs e)
{
taskID = Guid.NewGuid();
taskProps.Title = "Demo Task";
taskProps.AssignedTo = assignee;
taskProps.Description = instructions;
taskProps.ExtendedProperties["comments"] = comments;
taskProps.ExtendedProperties["instructions"] = instructions;
}
在工作流程的这一阶段,任务已创建并已分配给某个用户。此时,您必须添加活动,使工作流等待该用户完成任务。您将使用表示工作流的逻辑流控制的活动来实现此目的。
添加 While 活动
只要 While 活动所评估的条件结果解析为 true,就会使其中的活动进行循环。在此示例中,您将使用该活动循环执行任务编辑事件,直到用户明确表示完成任务为止。
当您将此属性设置为 Code Condition 时,表示对于该工作流,已创建了一个自定义函数并且该函数应当用于处理 while1 活动。
如果将 Condition 子属性设置为 notFinished,将指定应当运行的方法。该方法必须返回一个布尔值。
添加 OnTaskChanged 活动
请注意,CorrleationToken 和 TaskId 属性将设置为 createTask1 活动中使用的变量。该设置会将此活动绑定到 createTask1 活动创建的同一任务,并确保工作流接收到正确任务的更改事件。 另请注意,afterProps 和 beforeProps 是对象变量。afterProps 变量表示任务更改事件发生之后的任务属性,而 beforeProps 表示任务更改事件发生之前的任务属性。 |
C#
复制代码
public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties afterProps = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties beforeProps = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
C#
复制代码
private bool isFinished = false
请记住,任务编辑表单包含一个名为 isFinished 的复选框。该复选框值是一个布尔值,作为自定义属性存储在 afterProps 变量中。onTaskChanged 方法需要访问 afterProps 变量中的这一自定义属性。 |
每次更改任务时,while1 活动都会调用此方法以确定是否满足它的条件。只要 ConditionalEventArgs 对象的 Result 属性的计算结果为 true,while1 活动就会继续等待。
添加设置 ConditionalEventArgs 对象的 Result 属性的代码。
C++
复制代码
private void notFinished(object sender, ConditionalEventArgs e)
{
e.Result
}
现在,用户每次编辑该任务时,onTaskChanged1 活动都会处理任务更改事件。它将调用 onTaskChanged 方法,该方法将检查任务属性并设置 isFinished 变量,以表示用户是否已将任务标记为已完成。然后 while1 活动将调用 notFinished 方法,该方法将事件的结果设置为 isFinished 变量的相反值。如果 isFinished 返回 false,事件结果将设置为 true,并且 while1 活动将继续等待任务更改;如果 isFinished 等于 true,事件结果将设置为 false,并且 while1 活动将完成,工作流将继续进行下一个活动。
添加 CompleteTask 活动
请注意,CorrelationToken 和 TaskId 属性设置为 createTask1 活动中使用的变量。这会将该活动绑定到 createTask1 活动创建的同一任务。 |
您已完成了工作流,现在可以测试、调试和部署工作流及其随附的表单了。
后续步骤
若要使工作流可与 Office SharePoint Server 2007 中的文档库相关联,您还必须编译工作流程序集,将工作流安装为一项功能,并在选定网站上激活该工作流功能。
有关执行这些后续步骤的信息,请参阅 Windows SharePoint Services 软件开发工具包 (SDK) 中的如何:部署工作流模板。
将工作流与文档库或列表关联后,可以使用 Visual Studio 2005 Designer for Windows Workflow Foundation 调试工作流。有关详细信息,请参阅 Windows SharePoint Services 软件开发工具包 (SDK) 中的如何:调试 Windows SharePoint Services 工作流程。
该文章仅为学习之用,文章转载于MSDN