SharePoint中的列表(List) 与Content Type 之四
创建自定义的列表元素
=================
使用用户界面创建列表, 你可以使用Site Action菜单来导航到Create->Customer Lists. 在New Page上的表单会使用Custom List Type类型来启动一个空列表的创建, 在Custom List Type中除了Title以外, 没有可以编辑的columns(也就是fields). 创建了列表之后, 你可以在settings菜单下选择Create Column来添加新的标准WSS field type. 一个field type值得是一种WSS中可以被用来存储数据的数据类型. 它跟SQL的数据类型相似(事实上它就是使用SQL data type定义的), 当然, 你还可以创建你自己的field type. 下表展示除了Create Column页面上默认的WSS field type.
Field Type | 描述 |
Single Line Of Text | 单行文本. 允许的最大字符数是可以自定义的. |
Multiple Lines Of Text | 纯文本, 富文本(粗体, 斜体, 文本对齐), 或者增强富文本(图片, 表格, 链接) 的文本框. 富文本框在编辑模式下会显示一个rich text toolbar. |
Choice | 你定义的多个item的选项栏 |
Number | 数值. 选项包括最小, 最大, 小数位等等. |
Currency | 一个特定的货币格式的货币价值 |
Date And Time | 日期信息, 或者是日期和时间信息 |
Lookup | 对另一个网站列表字段的值的引用字段 |
Yes/No | 一个真或假的布尔字段. 在用户界面中呈现为复选框 |
Person Or Group | 当前站点的一个用户或成员. 这个域还可以显示在线与否的信息, 这里的在线指的是Windows Live Messenger或者是Office Live Communications Server. |
Hyperlink Or Picture | URL格式的字符串 |
Calculated | 从其他域计算得来的值 |
使用CAML定义自定义列表元素
==================
现在我们要一步步地完成定义site column, content type, 和list schema的过程. 如果你想要跟随我们的示例代码, 你可以在VS中打开名为LitwareTypes的工程. 这个工程包含几个不同的自定义provisioning components的例子. 如果你打开并build这个project, install.bat文件会拷贝所有需要的文件到TEMPLATES目录下, 并安装一个叫做LitwareTypes的feature. 然后你就能够与LitwareTypes feature, 在任意站点集的范围(scope)内互动了.
WSS的provision components是使用CAML和HTML来定义data schema的. WSS中使用的大多数CAML元素的结构都在TEMPLATE\XML目录下的XML schema文件中定义. 你可以拷贝这些XSD文件到%ProgramFiles%\Microsoft Visual Studio 8\Xml\Schemas中, 之后你就可以在VS2005中使用IntelliSense了. 注意CAML定义在编程的时候需要一点小技巧, 需要一点debugging的支持, 所以测试是很关键的.
通过Diagnostic Logging来Debug CAML
CAML内容的定义在Visual Studio中是没有debugging支持的. 这使得开发自定义content type, lists, 还有其他provisioning components的时候让人感觉很沮丧. 然而, 你可以在Central Administration站点中开启verbose logging.
尽管web界面可能是唯一展现一个模糊错误信息的地方, 类似“Exception from HRESULT: 0x81070201,” 但是diagnostic log会告诉你所需要的用来修复XML文件的细节信息, 类似这样: “Failed to retrieve the list schema for feature FBDECD96-62DC-48c88F0A-7B827A042FD9, list template 10001; expected to find it at: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Features\LitwareTypes\VendorList.”
小提示: Visual Studio 2005 extensions for Windows SharePoint Services 3.0是一个生成轻量级provisioning components的强大的工具. 你可以使用它来作为手工制作provisioning component的起点. 但是有一些WSS3.0新引入的feature是不支持的.
定义Site Column Definition
======================
List在columns(也称为filelds)中存储他们的数据, columns是可以在list的上下文中定义. WSS 3.0还引入了site columns, 这使得我们可以以一种可以重用的方式来定义一个field. 为了不定义一个比方说叫做first name的field好多次.WSS 可以在一个叫做fields的feature中定义site column一次. 下面的代码展现了FirstName site column是如何使用CAML在一个Field 元素中被定义的.
<Field ID="{}" Name="FirstName" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="FirstName" Group="$Resources:Person_Event_Columns" DisplayName="$Resources:core,First_Name;" Type="Text"> </Field>
小提示: 内建的columns是定义在feature: "fields" 中的, 当你创建你自己column定义的时候, 这个fields feature可以是一个很好的参考.
在上面的代码中, 你可以观察到FirstName site column 的基于文本的部分是使用一个特殊的, 带有“$”字符的语法定义的, 比如: $Resources:core,First_Name. 这个语法是在ASP.NET 2.0 中引入的, 它是一种方式, 帮助我们从一个资源文件中拿到本地化了的字符串. 这种为site column definition进行本地化的能力使得WSS 3.0支持位多个不同的语言提供不同语言版本的provision component的能力. Inside Microsoft Windows SharePoint Services 3.0的第九章详细介绍了这个主题.
作为一个简单的例子, 我们会创建一个vendor list, 其中带有如下的columns: Company, Contact, Phone, Industry, Company Size, 和Activity Notes. 我们将使用WSS预定义的columns来配置Company, Contact, 和Phone. 然后, 我们会为Industry 和 Activity Notes 创建两个新的site column definition.
LitwareTypes 工程包含一个自定义的feature, 叫做LitwareTypes. 你可以在它的Feature.xml看它. 下面的代码就是. 这个feature定义的scope是Site, 这意味着它被设计为在站点集的级别可以被激活.
Custom Column Definitions
<?xml version="1.0" encoding="utf-8"?> <!-- Litware Column Types --> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Field ID="{}" Name="Industry" DisplayName="Industry" Type="Choice" Format="RadioButtons" Group="Litware Columns"> <CHOICES> <CHOICE>High Tech</CHOICE> <CHOICE>Legal</CHOICE> <CHOICE>Medical</CHOICE> </CHOICES> <Default>High Tech</Default> </Field> <Field ID="{}" Type="Note" RichText="TRUE" AppendOnly="TRUE" Name="ActivityNotes" DisplayName="Activity Notes" Sortable="FALSE" SourceID="http://schemas.microsoft.com/sharepoint/v3" Group="Litware Columns"> </Field> </Elements>
Industry site column definition是基于choice field type的, 它提供给了用户三种不同的可供赋值的选择. Industry site column deninition 还被指定为应该使用RadioButtons的方式渲染, 这是在Format attribute中指定的.
ActivityNotes site column definition 是基于Notes field type的, 它允许用户来属于大量的文本信息, 可以跨越多行. 还要注意, 这个site column definition 还被定义为支持rich text , 以及WSS3.0引入的append-only behavior. 注意, 任何一个包含append-only site column 的列表都必须开启versioning选项, 才能让append-only这个 behavior正常工作.
现在你已经看到了如何创建site column definition, 让我们看看如何让他们在WSS站点上出现. 每一个站点都有一个Site Column Gallery. 在LitwareTypes feature 在某一个Site collection中被激活之后, 我们自定义的site column definitions 会出现在顶级站点的Site Columns Gallery 中. 你可以使用内建的名为mngfield.aspx的application page来查看站点的Site Columns Gallery 中都包含些什么, 这个页面可以在Site Settings页面上的链接上点击进入. 下图展现了一个已经被添加了的site columns的例子.
注意, 在site column被添加到Site Column Gallery之后, 用户就可以在当前站点和所有其下的子站点中使用了. 所以, 添加site column到顶级站点的Site Column Gallery 会使得整个站点集都可以使用这个column. 这就提供了一个通过站点集scope的feature, 而不是站点scope的feature, 来添加site column definition的强烈动机,
在site column definitions 被添加到站点之后, 用户可以立刻在添加column到list的时候使用它们. 下图给出了添加新column的例子:
如果你创建一个自定义的列表, 添加了Industry 和ActivityNotes这两个columns, 那么你就可以测试它们的行为了. 下图就是例子:
摘译自:
Inside Microsoft Windows SharePoint Services 3.0 第六章