一步一步学习sharepoint2010 workflow 系列第二部分:SharePoint无代码工作流 第7章 自定义表单的基础知识(Custom form fundamentals)
三种类型的工具可以在SharePoint中建立自定义表单:开箱即用表单(自动生成),InfoPath表单和ASP.NET表单。 重要的是要知道何时使用每种类型和他们的利弊。例如,你可以完成一个大量处理的通过开箱即用表单,而没有想用更高级的工具 例如Infopath或者ASP.NET。使用开箱即用的表单工作是简单而且快速的,节省了你的时间和成本。正因为如此,它是一个好的选择。 但是,缺点是有时需要使用InfoPath,我们将在本章讨论进一步的细节。因为ASP.NET表单是一个编程的主题,它们将在第9章涵盖。
有了这些工具,它们是许多使用表单去建立工作流解决方案包括自定义开箱即用表单,使用表单库 ,启动和关联表单在SPD工作流等的基础。在这一章中,你将去类似发布自定义表单到表单库, 更新一个库默认模板,和制作共享模板应用到更多的库等。
7.1 使用工具去建立自定义表单(tools used to build custom forms)
开箱即用表单帮助用户编辑列表项和SharePoint数据,并有有限的自定义设置功能,而InfoPath表单带来深层次的自定制。ASP.NET表单内置在Visual Studio用于更多技术复杂的表单。当你设计你的工作流解决方案,认真评估表单技术的利弊。提前考虑你的表单需求,可以节省时间和不必重写的功能。
7.1.1 新建和编辑表单 (New and Edit Forms)
开箱即用表单在你的依赖的列表上生成,而Infopath和ASP.NET表单,你需要一步一步的建立.
考虑在SharePoint中创建新列表或者库,并添加工作流到列表上。大多数情况下,当你创建一个新的自定义列表或库,你会去添加自定义列到列表或库上。当一个项被创建这些元数据将驻留在列表或库上。在一个列表上,你有机会去输入这些元数据通过开箱即用表单,在你点击新建按钮时(图7.1)。
图7.1
如果它被创建,你可以去编辑它。图7.2
图7.2
这两个按钮带你到自动生成表单输入数据的地方。它自然能去启动工作流在列表项上去响应创建新项或者编辑存在的项.
很复杂的自定义工作流表单使用自动生成表单将不能工作,至少它只需要几分钟就可以添加。
让我们快速浏览你可以添加到开箱即用的列表类型,并且怎么自动生成表单的。表7.1和图7.3说明了这点。
表7.1
图7.3
很容易的可以看到这些开箱即用表单丰富的功能。如前所述,工作流可能在列表项或文档的创建时开始, 所以该项的元数据通过表单输入后,将随时付诸行动。
在一个自定义SPD工作流,你可以检查自定义列的数据通过If Current item field equals value 的条件。 使用此条件(图7.4),你可以选择你想要的当前项字段和比较的另外的字段.
图7.4
同样,在Visual Studio工作流在表单上输入的列表项数据很容易的提供给程序员和工作流.
为什么不适用开箱即用 任何时候都可以使用表单吗?
表7.1显示数据类型能被使用,但是如果你想复选框代替单选按钮? 或者你需要更详细的说明,标志,或者图形在表单上做出更多的吸引的图形?或者在下拉列表框的数据可能需要来自 外部的业务数据。对于这些例子,开箱即用表单就不行了。表7.2显示开箱即用的利弊。
表7.2
7.1.2 InfoPath2010的表单( InfoPath 2010 forms)
InfoPath带来很多能力,以提供更先进的解决方案需求。需求例如从Web Service拉出业务数据,动态的控件过滤,和表单字段高级验证提交能容易的完成。另外的优点是你有很多需要去建立独特的,品牌化的用户界面,让最终用户更容易的理解和使用。毫无疑问这些信息能编成一本书,但是我们会看到几个最常用的技术在本章的示例中。
InfoPath表单能驻留在像一个叫做表单库的文档中。虽然并非总是如此,这是最常见的InfoPath场景。 表单库是文档库,但是他们有InfoPath的连接器和专门设计的内部表单。这样,InfoPath弥补了开箱即用表单, 因为编辑表单胜于新建表单,你现在将直接编辑Infopath表单。当你保存或提交以一个表单在表单库, 默认情况下,这些表单上的数据存储到像XML的库。
另外一种方式是InfoPath和SharePoint列表交互通过自定义的列表或者库新建和编辑表单。当你自定义开箱即用表单, 这些表单上的数据总是被映射到列表中的列或者库,而前面的例子,表单本身是被上传到表单库作为附件,并且 该附件包含了XML数据.
所以你怎么知道当自定义开箱即用表单使用了表单库?考虑你将交互多少数据。如果你自定义开箱即用表单, 你需要保存每一个数据。如果你使用表单库,这些数据在表单中保存成XML,所以你不需要去保存更多的数据, 使用表单库比创建许多列更好。表7.3显示利弊
表7.3
浏览器-启用InfoPath表单和依赖
InfoPath客户端是一个客户端应用程序,像Microsoft Word是一个客户端应用程序。你可以使用客户端去设计或编辑表单模板, 当然你也可以使用客户端去填充和提交表单。 SharePoint两个主要的版本是SharePoint Foundation和SharePoint Server。SharePoint Server是附加在SharePoint Foundation上的。 该附加包含一个叫做Form Server启用InfoPath表单去填充和从窗口浏览器中显示。如果没有SharePoint服务器,你只能使用Infopath客户端应用程序。显然,这可能会出现问题。最好的途径就是你的公司购买SharePoint服务器版本。
7.1.3(使用Visual Studio建立ASP.NET表单) ASP.NET forms built in Visual Studio
你想需要表单定制的最大灵活性吗?你现在的表单和代码是很久之前建立的,你想进行重建吗? 你是ASP.NET程序员吗?谁没有兴趣学习InfoPath?如果以上的问题,你都说是的,你将很开心 的听到ASP.NET表单仍然在SharePoint2010发挥着作用。例如,你能替换新建和编辑开箱即用的表单通过自定义的ASP.NET 表单。 你可以自定义的ASP.NET表单嵌入在现在的WebPart中。当一个用户提交表单,你可以使用SharePoint对象模型去添加一个新的列表项 ,并启动该项上的工作流。欲了解更多信息,请参阅第9章.
尽管能支持复杂的自定义,但是ASP.NET表单的增长越来越少因为InfoPath的来到提供了多功能并且简单的工具。而ASP.NET,你需要从头开始,但是InfoPath只需要有控件和向导就能帮助你添加所需的功能到你的表单。因此,ASP.NET的主题不在本章中详解,这里只提供一般的优点和利弊(表7.4)。
表7.4
7.2(使用InfoPath自定义开箱即用表单) Customizing out-of-the-box forms with InfoPath
InfoPath2010中的一个新功能使自定义自动生成的开箱即用的表单。即时你选择开箱即用的途径,后来你又需要更多的功能,你可以自定义这些表单通过InfoPath。这节将引导你通过自定义开箱即用表单的步骤。
在表单库中使用表单和使用InfoPath去自定义开箱即用新建和编辑表单的数据存储方法显然不同。 表单库中的表单存储数据像XML是上传文档到库。当你自定义开箱即用表单,这些数据仍需要映射到列表项的列。 如果你有良好的数据处理,你可能会想到表单库的路线,而不是增加20个列到列表项。你可能想改变一个列或两个列的行为,或者 一个公司的品牌标志或者更细节的介绍。在这种情况下,自定义开箱即用表单是很好的方法。
当需要自定义开箱即用表单时SharePoint Server平台是必须的 本节只适用于SharePoint2010服务器版本
开始时,首先创建一个SharePoint列表或库,并在这个列表上添加所有的你需要跟踪的列。你可以通过列表设置,然后添加列选项。然后你未你的数据需求设置你的列,编辑表单去满足你的用户界面需要。在Ribbon(功能区)列表选项卡,你可以使用自定义列表下拉列表框,并选择自定义表单(图7.5)去启动InfoPath。
图7.5
示例中你将去建立包括一个任务列表,以及每个任务关联的项目和子项目。我们怎么去做关联项目动态改变, 当你选择一个项目,子项目下拉列表框将改变它的项基于选择的父项目。图7.6显示当首次打开显示的任务表单是什么样子的。 注意父项目和子项目将会改变。
图7.6
其实说白了就是表单联动,可以使用(省、市)或者(年纪、班级)来做示例。
Parent Project列是一个查找列,查找一个叫Project Names的列表。Sub Project是另一个查找列,查找另外一个叫 Sub project Names的列表。Sub Project Names列表有两个列,Title和Parent Project。继续之前,设置两个Project Nemas 和Sub Project Names 列表像之前的描述一样。然后,添加一个Project name查找列和一个Sub Project Name查找列到一个任务列表。 最后编辑开箱即用表单在InfoPath中像图7.5的编辑 。
要使Sub Project 下拉列表在你的任务表单中动态变化,选择它的项目基于它的Parent Project如何选择的。 首先,创建一个新的数据源为Sub Project 下拉列表框。下拉列表框默认数据源只包含两个字段,title和ID。 因为你需要去过滤Parent Project列,添加一个新的数据源。然后,过滤数据源通过parent Project的选择。 最后,设置一个规则在Parent Project下拉列表框上,去确定数据源在每次下拉的时候更新。通过表7.5的步骤 你将做到这点。
表7.5
现在所身下的是发布表单到你的任务列表。在文件菜单下的信息选项卡,点击快速发布。现在,当你去创建一个新任务在你的任务列表, Sub Project下拉列表将动态改变基于Parent Project的选择(图7.7)
图7.7
只允许数字的错误
如果你得到这个粗无哦说只允许数字,你想保存字符串到一个列期望是存储数字的。最有可能是Sub Project下拉列表框的值 被设置成字符串了,因为列是查找列,它需要被数字替代。要解决这个错误,请右击Sub Project下拉列表框选择属性。 然后Entries的条目,更改值从d:Title到d:ID。之后重新发布你的表单,表单应妥善保存。
7.3 发布模板到表单库(Publishing a template to a form library)
我们已经结束了关于如何自定义开箱即用表单一节,现在去仔细看表单如何与表单库工作的。当一个用户在一个表单库填充一个表单, 新的表单(例如,XML文档)是创建在该库关联的表单模板。这个模板默认是空白的并且不是可用的。本节介绍如何建立一个你 自定义表单模板和更新默认模板通过你的自定义模板。
将InfoPath表单模板放入一个表单库的方法很多。你可以发布表单模板直接从InfoPath客户端到SharePoint。或者从SharePoint,你可以浏览你的硬盘,并选择表单模板。无论你选择哪种,你需要如何是你需要的。你想表单模板值用在一个库或者你想你的最终用户可以使用去创建新表单在整个网站集的表单模板上?如果你需要一个全局部署表单模板,你将需要发布表单模板到一个内容类型(见节7.4);否则更新开箱即用模板就足够了。
当表单像公司开支报告仅需要添加和编辑在一个表单库中,更新一个表单库的开箱即用表单模板是最简单的办法。 如果你需要一个表单模板被跨越多个表单库共享,详见节7.4.在你编辑表单模板之前,你需要按照以下步骤创建一个表单库:
1 导航到你的SharePoint站点。
2 在Site Actions菜单,点击more options.
3 一个弹出框将出现(图7.8)。在左侧导航,点击Library。
4 在中心导航,选择Form Library。
5 提供一个唯一的名字为表单库,然后点击创建。
图7.8
图7.9
更新这个表单,点击在Template URL下面的Edit Template链接。这将在InfoPath2010 Designer客户端加载一个空的表单。这个界面是空白的,并且有一个灰色的背景。你需要从无到有的去创建你的表单。按照这些步骤去设置一个基本的费用报告模板为你的公司:
1 默认情况下,你页面模板只有标题。按照这些步骤将添加标题和主体页面模板到这个表单。点击页面设计选项卡在加载的InfoPath表单。 在页面布局模板,选择标题和主体。
2给你的表单一个标题,例如SP WFiA Expense Report,和一个描述。
3 点击标题下面,并通过主页选项上的控件菜单添加一个重复表格。选择一个三列的表格。
4 填充重复表列名,例如Date of Expense,Dollar Amount,和Description。 5 保存模板到你的个人电脑硬盘通过点击保存图标。
当你完成后,你的表单将看起来像图7.10
图7.10
InfoPath最佳实践:命名你的基本数据描述 图7.10 显示一个在InfoPath上的示例表单的建立。当建立InfoPath表单, 重点是要确保你的字段命名是有意义的。默认情况下,当你添加一个字段到表单,这个字段名字叫field1,field2,以此类推。 当你保存表单到SharePoint,数据时存储到XML中的。如果你的所有数据都是像field1这样的通用名称,你的XML理解起来会很困难。 你将在第9章学习如何以编程的方式访问InfoPath表单数据。你的数据的准确命名将很有帮助。图7.12显示所有数据重新命名 将建立一个坚实的XML结构,图7.11(默认)将产生令人费解的XML数据。
图7.11 图7.12
图7.13
在这里使用快速发布因为你从表单库本身打开一个空白的模板表单,InfoPath知道它该覆盖哪个库的模板。如果你喜欢,你可以发布到不同的表单库。当你第一次打开InfoPath Designer,你可以从一个叫做SharePoint表单库选择多个模板。如果你创建一个新表单模板,你将是重复之前相反的顺序。而不是首先创建一个表单库,并在高级设置中点击编辑模板。你首先要做的是从头创建模板,然后选择一个表单库发布。
在这种情况下,快速发布将不可用。相反,在文件菜单,发布选项卡下面,有另外的选项去发布到SharePoint服务器(图7.14)。 这个动作将加载一个向导贯穿整个发布过程。点击SharePoint 服务器按钮进行发布。按照表7.6的步骤,你会将你的表单发布到不同的表单库。
图7.14
表7.6
7.4 发布表单模板到内容类型(Publishing a template to a content type )
你已经为单个的表单库定制了表单模板。如果你需要在同一个网站集的多个库中使用模板,最好的办法是发布模板到内容类型。无论内容类型是添加到一个表单库,这个模板将也可以添加到库。
内容类型在这种情形下是有帮助的:你有部门站点在站点集中,它们是一个销售的站点,另一个市场的,和第三个是人力资源的。 这些站点需要自己的费用开支库因为每个部门的批准人不同,你可以创建费用开支内容类型安装就可以了。然后,你可以添加内容类型到 每个部门的表单库。在这个例子中,如果你需要在6个月后更新模板,这个改动将会被传播到每个库。
在第一章中,你学习了内容类型能被使用去封装工作流,模板和元数据的可重用工作流在真个站点集上。创建内容类型 为了节省你的时间,因为你有10个表单库都需要相同的模板,元数据和工作流,你可以添加内容类型到这些库上。 如果你不要使用内容类型,你将需要去添加模板,列和工作流到10个库上,将耗费很多时间和努力去维护。
要发布内容类型,你将使用发布到SharePoint服务器功能。替代选择发布到表单库,你要创建一个新的内容类型(表7.7)
表7.7
7.5 映射表单数据到列(Mapping Form data to columns)
我们已经讨论完如何自定义开箱即用表单以及如何使用表单库去存储自定义表单数据。如果你记得,当你自定义开箱即用表单,数据时保存到列表项上的列上的,而你工作在一个表单库,数据时存储XML表单数据本身的。麻烦是保持所有的数据为XML你将无法进行派讯,筛选和分组数据。也许你想分类所有你的开支费用报告通过开支类型(例如,油耗,午餐,和旅费)。这是通过添加一个字段到InfoPath表单并映射字段到SharePoint列表来完成的,让你能排序,过滤和分组在这个列上。从某种意义上来说,表单库和映射列是两全其美的。你可以存储大量数据到表单,并提取你的用户感兴趣的数据到列表项。
为了说明这个概念,我们回到SPWFiA Expense report去添加一个新的下拉列表(用户可以指定开支类型)。此外,你要添加另一个字段将包含所有费用的总和(计算总和的逻辑在第9章的第1节讨论)。你将重新发布表单到SharePoint,这时映射你的新列到表单库,最终用户可以排序,筛选和分组。按照表7.8去添加你的两个新的数据块到expense report 表单。
表7.8
当你完成后,你的表单看起来像图7.15
图7.15
不是使用快速发布,这次的发布需要很长的路要走,并添加你的ExpenseType和TotalAmount字段映射到列表项。这将给你排序你的expenses通过totalAmount和通过expenseType进行过滤的能力。发布表单通过点击发布-》SharePoint Server,并指定SharePoint站点的URL。之后要决定你要直接发布到库或者到一个内容类型。无论哪种情况,你可以映射数据到列。当你获得步骤在向导说明“以下列出的列表字段将在列上可用...",点击添加按钮,并添加ExpenseType和TotalAmount字段(图7.16)点击下一步,并完成发布.
图7.16
图7.17
在节9.1例子更进一步。在这时,总金额不会自动计算。在第9章,你将添加一些.NET代码到表单去计算这些值的开支总和。有了这些代码, 提交者就不需要手动计算了.
7.6 (SharePoint Designer 工作流中的表单)Forms in SharePoint Designer workflows
你可以使用InfoPath去自定义启动和关联表单在SharePoint Designer工作流。默认情况下,当一个SharePoint Designer工作流首次启动,启动表单会显示给用户,但是仅仅只有两个按钮显示,并且表单是空白的。用户能确认或取消开始的工作流通过这两个按钮。关联表单显示给用户当他们添加工作流到一个列表,而启动表单显示是当工作流启动时。
默认情况下,启动表单包含开始和取消按钮(图7.18)。在一些情况下你可能需要去收集信息从用户在工作流开始之前。你也可能需要添加 信息给表单去帮助理解工作流是如何工作的。
图7.18
当你需要去收集信息从用户在工作流开始前,你可以使用启动表单参数。他们是输入字段显示在启动表单上。之后工作流启动,这些参数 是我们可用的在工作流中。这些启动表单参数是类似局部变量。添加参数到启动表单很简单;点击Ribbon上启动表单参数按钮, 在可以打开关联和启动表单参数的对话框(图7.19)
图7.19
图7.20
之后添加启动参数到工作流,用户将能够与它们互动当手动启动工作流从一个列表项。图7.21显示发布之后启动表单上的启动参数.
图7.21
为了帮助你理解在SharePoint Designer中的启动表单的概念,要通过一个示例工作流零件的库存处理请求。工作流很容易的使用在汽车修理店,在管理零部件的数量,并雇用工作流去处理它们修理部分的顺序请求。
示例将从一个自定义列表名字叫Parts Inventory进行工作流。Parts Inventory列表将有三个列,名字叫Part name,Quantity available,和Base cost。你希望一个流程使你的用户去请求额外的零件当供应成本低的时候。然后,根据成本和他们定义的数量,不同审批者将被分配。
当用户启动库存请求工作流,他们将看见一个自定义启动表单提供他们去输入订购零件的数量。 这个时候启动表单将派上用场。
要设置这个例子,首先通过创建一个新的SharePoint列表标题叫Parts Inventory有三个列。这个列表将存储零部件,并驻入工作流。 然后,在SharePoint Designer创建一个新的列表工作流。打开SharePoint Designer去你创建Parts Inventory列表的站点,在工作流选项卡, 点击列表工作流并选择你的自定义列表。在这时,你将被提示输入标题和描述为你的工作流。输入Parts Request workflow到标题,并点击确定。 在工作流中,通过指定你的启动表单数据启动工作流 表7.9.
表7.9
现在指定的启动参数,用户将看到一个表单当他们开始工作流时。表单将要求他们去输入他们订购的零件的数量。现在添加业务逻辑到你的工作流。 让我们使用计算(Do Calculation)动作去计算请求的成本。你可以添加一个If-Else块到计算如果总成本超过$1000,如果只这样需要经理Joe Bob批准。另外Fred Fredrickson是经理助理,也可以批准。按照表7.9的步骤设置这个动作和条件。
表7.9续
图7.22
表7.9续
现在你有了工作流的基础,发布和测试启动表单。点击保存按钮去保存工作流,然后点击发布按钮去发布工作流到Parts Inventory 列表。 在列表上,选择一个列表项,并启动parts request工作流。工作流不会立即开始,你将被提示需要填写表单。直到你点击”开始“按钮才会开始。 对于我们的工作流,你会看到图7.23.
图7.23
之后你点击开始按钮,工作流将执行计算决定批准的顺序,并且emial将被发送到相应的审批者。现在完成此表格之前,你需要回去,并且定制。表单有最小的数字字段,但是它不直观。按照表7.10的步骤编辑表单使直观显示给用户.
表7.10
之后你发布你的表单,它看起来像图7.24.这是一个通用的例子,但是不要被蒙骗,因为你可以做许多很强大的事情通过InfoPath在你的初始化表单。 人们通常用他来填充下拉列表从外部数据(包括第6章的例子)
图7.24
下一章
一步一步学习sharepoint2010 workflow 系列第三部分:自定义SharePoint代码工作流 第8章 自定义Visual Studio工作流(Custom Visual Studio workflows)
本人声明
本博客内的文字和图片除标明出处和转贴的外,均系本人原创作品,如转载或使用,不是用于盈利目的,尽请使用,但请注明引自这里和作者的名字;有商业用途的,请与本人联系,协商后再作使用,否则我将采取法律手段维护自己的利益。谢谢合作。meiweijun@163.com