自定义 SharePoint Team Services 中的 CAML 视图
Microsoft Corporation
2002 年 6 月
适用于:
Microsoft SharePoint Team Services
摘要:了解使用协作应用程序标记语言 (CAML) 中的 View 元素创建 Microsoft SharePoint Team Services 中列表数据的自定义视图。(20 页打印页)
本页内容
简介
创建基本列表视图
在脚本中使用视图
添加个性化消息
列出服务器上的所有子站点
预填充输入框
在视图中嵌入视图
创建缩略图
简介
协作应用程序标记语言 (CAML) 的 View 元素提供一个在 Microsoft SharePoint? Team Services 的数据库中执行查询和返回值的灵活方法。此元素适应对自定义 SharePoint Team Web 站点的广泛需求,从执行查询以便将数据返回到脚本进行处理,到布置页面 部分中列表数据的显示。
要点 您必须具有写页面权限,才能上载页面。您必须以本地 Administrators 组成员的身份登录到服务器计算机,才能写入数据库。
根据您的目的是返回并显示值,还是仅返回值以便在脚本中进行处理,Web 站点的 Default.htm 页或任何列表的 AllItems.htm 页上的列表视图典型方案包含下列子元素。
Query 如果您只希望在一个列表中返回所有值,则该子元素可以为空。
ViewBody 可以使用 ViewBody 子元素(带有或不带 ViewHeader 和 ViewFooter 元素)来布置用于显示数据的视图表。
ViewEmpty ViewEmpty 子元素指定当查询未返回任何数据时所显示的内容。它还为执行替代视图提供了有用的制约性,以防查询中不返回任何项目。请参见下面的示例。
ViewFields 当视图不用于显示项目,只用于返回值进行处理时,ViewFields 子元素可以为空。
RowLimit RowLimit 子元素指定要在当前窗口中显示的项目数。
PagedRowset 当 RowLimit 元素包含的值超出时,PagedRowset 子元素将为下一个窗口定义一个视图。
Toolbar 在 AllItems.htm 页上,Toolbar 子元素定义紧靠列表视图之上的页中显示的按钮和部分行。
CAML HTML 元素与 CDATA 标记共同用来在视图中嵌入标记语言或脚本(例如 <HTML><![CDATA[<TABLE><TR><TH>]]></HTML>)。
要点 为了完成下述任务,您必须具有写页面权限才能上载页面。您必须以本地 Administrators 组成员的身份登录到计算机,才能写入数据库。
假设您具有 SharePoint Team Services 数据库的访问权,则可以通过从 Views 表的 View 列复制视图方案来学习和自定义视图。如果有许多视图,您可以通过要修改 ListView 组件的全局统一标识符 (GUID) 来标识相应的数据库记录。在其他情况下(例如在表单中),您可能需要引用 Lists 表(列表的列表)中 ID、Name 或 Title 列值的组合。然后,您可以使用其视图方案替换整个组件,并使用以下 CAML 包围已复制的视图:
<ows:XML> <SetList>[u_YourCustomListName[without "u_" for native lists]]</SetList> <View> . . . [Copied view schema goes here] . . . </View> </ows:XML>
在 Microsoft FrontPage 中,您可以选择一个视图,右键单击此视图,然后单击 Layout Customization 以展开视图方案并进行自定义。
注 应始终保存原始站点页面的副本,以便可以在需要时复原组件。
创建基本列表视图
下例布置了用于显示自定义列表 (u_MyCustomList) 的视图表。ViewFields 元素指定要在视图页眉中显示的 Title、Stock 和 Price 字段名称以及视图正文中显示的这些字段的值。
<ows:XML> <SetList>[u_MyCustomList]</SetList> <View Name="MyNewView"> <ViewFields> <FieldRef Name="Title"/> <FieldRef Name="Stock"/> <FieldRef Name="Price"/> </ViewFields>
ViewHeader 元素包含 Fields 和 Field 元素,这些元素枚举了 ViewFields 元素所指定的字段名称。HTML 元素包含用于显示表格标题的标记语言,这取决于 Web 或子站点的 /_layouts/styles/ows.css 文件中定义的 ms-vh 样式。
<ViewHeader> <HTML><![CDATA[<TABLE><TR class="ms-vh">]]></HTML> <Fields> <HTML><![CDATA[<TH>]]></HTML> <Field/> <HTML><![CDATA[</TH>]]></HTML> </Fields> <HTML><![CDATA[</TR>]]></HTML> </ViewHeader>
ViewBody 元素包含为列表中的每个项目枚举字段值的 Fields 和 Field 元素。HTML 元素包含用于在表格单元格中显示这些值的标记语言,这取决于 Web 或子站点的 /_layouts/styles/ows.css 文件中定义的 ms-vb 样式。
<ViewBody> <HTML><![CDATA[<TR class="ms-vb">]]></HTML> <Fields> <HTML><![CDATA[<TD>]]></HTML> <Field/> <HTML><![CDATA[</TD>]]></HTML> </Fields> <HTML><![CDATA[</TR>]]></HTML> </ViewBody> <ViewFooter> <HTML><![CDATA[</TABLE>]]></HTML> </ViewFooter>
Query 部分查询股票小于 15 或价格大于 20.00 的情况。
<Query> <Where> <Or> <Lt> <FieldRef Name="Stock"/> <Value Type="Number"> 15 </Value> </Lt> <Gt> <FieldRef Name="Price"/> <Value Type="Currency"> 20.00 </Value> </Gt> </Or> </Where> <OrderBy> <FieldRef Name="Title"/> </OrderBy> </Query> </View> </ows:XML>
为了返回指定字段的所有值,您可以转而使用空的 Query 元素 ()。
在脚本中使用视图
下例说明了如何使用 CAML 视图返回项目 ID 并将它们指定给数组,以便在脚本中进行处理。此视图返回事件日期晚于 1/1/2002 的以逗号分隔的项目 ID 列表。这些项目 ID 被指定给 strIDs 变量,然后逐一显示在消息框中。
<Script language="JavaScript"> function getIDs() { var arrIDs = new Array(); var strIDs="<ows:XML> <SetList>Events</SetList> <View> <ViewFields> <FieldRef Name="ID"/> </ViewFields> <ViewBody> <Fields> <Field/> <HTML><![CDATA[,]]></HTML> </Fields> </ViewBody> <Query> <Where> <Gt> <FieldRef Name="EventDate"/> <Value Type="DateTime">2002-01-01T00:00:00Z</Value> </Gt> </Where> </Query> </View> </ows:XML>"; arrIDs=strIDs.split(/,/); alert(arrIDs); } </Script>
注 如果您要在 CAML 视图中动态插入用户输入的数据,而不只是像上例中那样对值进行硬编码,则需要从解释器掩盖 CAML,以防止立即处理该视图。有关详细信息,请参阅使用 XMLHTTP 在 SharePoint Team Services 中发布命令。
添加个性化消息
为了获得当前用户的名称并显示个性化消息,以下代码示例针对 UserInfo 表执行查询,此表是数据库中的全局列表,该数据库包含虚拟服务器上所有小组 Web 站点的所有用户信息。
<ows:XML> <SetList>UserInfo</SetList> <View> <ViewFields> <FieldRef Name="Title"/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="ID"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <HTML> <![CDATA[<TABLE><TR><TD class="Greeting">Hello ]]> </HTML> <Field Name="Title"/> <HTML> <![CDATA[, welcome to the team Web site.</TD></TR></TABLE>]]> </HTML> </ViewBody> </View> </ows:XML>
此示例查询当前用户的 ID 与 UserInfo 表中的 ID 相匹配的情况,并按 ViewFields 元素的指定显示对应的 Title 字段值(在此例中为用户名)。CDATA 部分布置用于对齐页面上个性化问候的简单表。请注意,为了设置格式,可将自定义样式定义添加到 ows.css 并在 HTML 及其元素中实现。
列出服务器上的所有子站点
下例显示如何通过创建数据库中 Projects 表的视图来创建返回服务器上所有子站点链接列表的视图:
<ows:XML> <SetList>Projects</SetList> <View Name="ProjectsView"> <ViewFields> <FieldRef Name="Title"/> <FieldRef Name="HomePageID" Explicit="TRUE"/> </ViewFields> <ViewHeader> <HTML><![CDATA[<TABLE>]]></HTML> </ViewHeader> <ViewBody> <HTML><![CDATA[<TR><TD>]]></HTML> <HTML><![CDATA[<a target="_blank" href="]]></HTML> <LookupColumn Name="HomePageID"/> <HTML><![CDATA[">]]></HTML> <Field Name="Title"/> <HTML><![CDATA[</a></TD></TR>]]></HTML> </ViewBody> <ViewFooter> <HTML><![CDATA[</TABLE>]]></HTML> </ViewFooter> </View> </ows:XML>
HomePageID 字段是 DocMd 表(该表存储服务器上的所有 URL)的查找字段。此处,HTML target 属性设置为 _blank,以便当用户单击子站点链接时,该子站点会显示在新窗口中。
预填充输入框
要使用当前用户的名称和电子邮件地址来预填充表单,您可以创建一个返回此用户名的视图,然后将其指定给一个变量。使用 GetEmailFromUser 元素返回当前用户的电子邮件地址。
首先,添加一个 CAML 岛,它将此视图定义给包含该表单的页面(为了适应 MSDN Web 布局的需要,此代码示例已经“被截断”):
<ows:XML> <SetList>UserInfo</SetList> <View> <ViewFields> <FieldRef Name="Name"/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="ID"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <SetVar Name="UName" Scope="Request"><Field Name="Name"/></SetVar> </ViewBody> </View> </ows:XML>
请注意,此视图只用于返回当前用户的名称,此名称已指定给自定义 CAML 变量 UName。然后,您可以添加两个输入框,将适当的 CAML 指定给它们的 value 属性:
<input type="text" name="username" size="38" value="<ows:GetVar Name="UName"/>"> <input type="text" name="user_email" size="38" value="<ows:GetEmailFromUser HTMLEncode="TRUE"><UserID/></ows:GetEmailFromUser>">
在视图中嵌入视图
视图可以嵌入到其他视图中,以便从 SharePoint Team Services 数据库中的多个表返回值。在下例中,将两个视图嵌入到主页上的另一个框架视图中,以便根据当前用户是否有过期任务来显示不同的消息。
此示例包含 Tasks 列表的两个视图,一个用于在当前用户有过期任务的情况下返回具有特定格式的消息,另一个用于返回过期项目的视图。
<ows:XML> <SetList>Tasks</SetList> <View> <ViewFields> <FieldRef Name="AssignedTo"/> </ViewFields> <Query> <Where> <And> <Eq> <FieldRef Name="AssignedTo"/> <Value Type="Integer"> <UserID/> </Value> </Eq> <And> <Lt> <FieldRef Name="DueDate"/> <Value Type="DateTime"> <Today/> </Value> </Lt> <Neq> <FieldRef Name="Status"/> <Value Type="Choice">Completed</Value> </Neq> </And> </And> </Where> </Query> <ViewBody> <HTML><![CDATA[<TABLE><TR><TD class="Warning">Hello ]]></HTML> <LookupColumn Name="AssignedTo" HTMLEncode="TRUE"/> <HTML><![CDATA[, these items are now past due!</TD></TR> <TR><TD> <A href="mailto:Manager_Name@example.com" class="ResolveNow"> Please contact your manager</A> </TD></TR> <TR><TD>]]></HTML>
此框架视图可针对当前用户的 ID 等于 AssignedTo 字段值的情况以及截止日期在今天之前且状态不等于 Completed 的情况,查询数据库中的 Tasks 表。LookupColumn 元素用于将用户名称作为对用户的个性化警告的一部分返回。
在代码中的此处,可以插入 Tasks 列表的其他视图,以返回并显示过期项目。
<SetList>Tasks</SetList> <View> <ViewFields> <FieldRef Name="LinkTitle"/> <FieldRef Name="Priority"/> <FieldRef Name="Body"/> <FieldRef Name="DueDate"/> </ViewFields> <Query> <Where> <And> <And> <Lt> <FieldRef Name="DueDate"/> <Value Type="DateTime"> <Today/> </Value> </Lt> <Neq> <FieldRef Name="Status"/> <Value Type="Choice">Completed</Value> </Neq> </And> <Eq> <FieldRef Name="AssignedTo"/> <Value Type="Integer"> <UserID/> </Value> </Eq> </And> </Where> </Query> <ViewHeader> <HTML><![CDATA[<TABLE><TR>]]></HTML> <Fields> <HTML><![CDATA[<TH class="ms-vh">]]></HTML> <Field/> <HTML><![CDATA[</TH>]]></HTML> </Fields> <HTML><![CDATA[</TR>]]></HTML> </ViewHeader> <ViewBody> <HTML><![CDATA[<TR>]]></HTML> <Fields> <HTML><![CDATA[<TD class="ms-vb">]]></HTML> <Field/> <HTML><![CDATA[</TD>]]></HTML> </Fields> <HTML><![CDATA[</TR>]]></HTML> </ViewBody> <ViewFooter> <HTML><![CDATA[</TABLE>]]></HTML> </ViewFooter> </View> <HTML><![CDATA[</TD></TR></TABLE>]]></HTML> </ViewBody>
这在当前用户具有过期任务的情况下,完成了外部框架视图的 ViewBody 部分。ViewEmpty 部分可用于包含另一个视图,此视图可将另一则消息传送给没有过期任务的当前用户。
<ViewEmpty> <SetList>UserInfo</SetList> <View> <ViewFields> <FieldRef Name="Title"/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="ID"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <HTML> <![CDATA[<TABLE><TR><TD class="NoOverdues">Hello ]]> </HTML> <Field Name="Title"/> <HTML><![CDATA[, you have no past due items. Great work!</TD></TR></TABLE>]]></HTML> </ViewBody> </View> </ViewEmpty> </View> </ows:XML>
通过将定义添加到 /_layouts/styles/ows.css(如下所示),可以为上述属性定义样式:
.Warning { font-size: 14pt; color: red; font-weight: bold; font-family: verdana; } .ResolveNow { font-size: 12pt; color: red; text-decoration: underline; font-family: verdana; padding: 12px; font-weight: bold; } .NoOverdues { font-size: 12pt; color: green; font-family: verdana; padding: 12px; font-weight: bold; }
下例在框架视图的 ViewEmpty 部分中嵌入一个视图,以便将另一消息显示给访问主页的当前用户(这取决于他们是否接受了名为 TeamSurvey 的调查)。如果他们已经接受了调查,则 ViewBody 部分将显示个性化的欢迎消息。如果未接受调查,则 ViewEmpty 部分将显示一则警告,并提供此调查的链接(为了适应 MSDN Web 布局的需要,此代码示例已经“被截断”):
<ows:XML> <SetList>u_TeamSurvey</SetList> <View> <ViewFields> <FieldRef Name="Author"/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="Author"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <HTML><![CDATA[<TABLE><TR><TD class="DidSurvey">Hello ]]></HTML> <LookupColumn Name="Author" HTMLEncode="TRUE"/> <HTML><![CDATA[, thanks for taking the survey!</TD></TR></TABLE>]]></HTML> </ViewBody> <ViewEmpty> <SetList>UserInfo</SetList> <View> <ViewFields> <FieldRef Name="Title"/> </ViewFields> <Query> <Where> <Eq> <FieldRef Name="ID"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <HTML> <![CDATA[<TABLE><TR><TD class="Warning">Hello ]]> </HTML> <Field Name="Title"/> <HTML> <![CDATA[, you have not yet taken the survey! </TD></TR><TR><TD class="TakeNow"> <A href="http://[server_name]/[subweb_name]/Lists/ TeamSurvey/overview.htm"> Please take the survey immediately!</A> </TD></TR></TABLE>]]></HTML> </ViewBody> </View> </ViewEmpty> </View> </ows:XML>
您还可以将适当的样式定义添加到 ows.css 中。
.TakeNow { font-size: 12pt; color: red; text-decoration: underline; font-family: verdana; padding: 12px; font-weight: bold; } .DidSurvey { font-size: 12pt; color: green; font-family: verdana; padding: 12px; font-weight: bold; }
可以采取的更极端方法是让 ViewBody 部分作为空元素,并只使用 ViewEmpty 部分将用户重定向到此调查,而不让他们看到主页,如下所示:
<ows:XML> <SetList>u_TeamSurvey</SetList> <View> <ViewFields/> <Query> <Where> <Eq> <FieldRef Name="Author"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody/> <ViewEmpty> <SetList>UserInfo</SetList> <View> <ViewFields/> <Query> <Where> <Eq> <FieldRef Name="ID"/> <Value Type="Integer"><UserID/></Value> </Eq> </Where> </Query> <ViewBody> <HTML><![CDATA[<Script>window.parent.location = "http://[server_name]/[subweb_name] /Lists/TeamSurvey/overview.htm";</Script>]]></HTML> </ViewBody> </View> </ViewEmpty> </View> </ows:XML>
此处,ViewBody 部分只包含将调查的 URL 指定到 window.parent.location 的脚本块。
创建缩略图
您可以通过在 CAML 中嵌入 HTML 来创建包含图像的文档库的缩略图。下例假设存在一个名为 Image Gallery 的库,除了内置的 FileRef 和 Title 字段外,它还包含一个 Artist 字段。
<ows:xml> <SetList>u_ImageGallery</SetList> <HTML><![CDATA[<TABLE>]]></HTML> <View Name="Image Gallery"> <ViewFields> <FieldRef Name="FileRef"/> <FieldRef Name="Title"/> <FieldRef Name="Artist"/> </ViewFields> <ViewBody> <HTML><![CDATA[<tr><td>]]></HTML> <HTML><![CDATA[<a href="]]></HTML> <HttpHost URLEncodeAsURL="TRUE"/> <LookupColumn Name="FileRef"/> <HTML><![CDATA["><img src="]]></HTML> <HttpHost URLEncodeAsURL="TRUE"/> <LookupColumn Name="FileRef"/> <HTML><![CDATA[" width=50 height=50></a></td><td>]]></HTML> <Field Name="Title"/> <HTML><![CDATA[</td><td>]]></HTML> <Field Name="Artist"/> <HTML><![CDATA[</td></tr>]]></HTML> </ViewBody> </View> <HTML><![CDATA[</TABLE>]]></HTML> </ows:xml>
为图像文件的链接提供 URL 的 href 属性值是使用 CAML HttpHost 和 LookupColumn 元素构造的。LookupColumn 元素用于为列表的 FileRef 字段(即 DocMd 表中包含的图像文件 URL,它存储了服务器上所有站点的所有文档 URL)返回查找值。此视图中还显示了 Title 字段和 Artist 字段。
同一视图还可以与矢量标记语言 (VML) 集成来创建缩略图。您可以使用 CDATA 部分来构造 VML rect 和 imagedata 元素,以便两者均可以将图像显示为缩略图并提供图像文件的链接。
<ows:XML> <SetList Scope="Request">u_ArtDocs</SetList> <View Name="ThumbNailView"> <ViewFields> <FieldRef Name="FileRef"/> <FieldRef Name="Title"/> <FieldRef Name="Artist"/> </ViewFields> <ViewHeader> <HTML><![CDATA[<TABLE><TR><TD>]]></HTML> </ViewHeader> <ViewBody> <HTML><![CDATA[<TABLE cellpadding=20><TR><TD>]]></HTML> <HTML><![CDATA[<v:rect href="]]></HTML> <HttpHost URLEncodeAsURL="TRUE"/> <LookupColumn Name="FileRef"/> <HTML><![CDATA[" style="HEIGHT: 50px; LEFT: 10px; POSITION:relative; TOP:10px; WIDTH: 50px"> <v:imagedata src="]]></HTML> <HttpHost URLEncodeAsURL="TRUE"/> <LookupColumn Name="FileRef"/> <HTML><![CDATA["/></v:rect>]]></HTML> <HTML><![CDATA[</TD><TD class=ms-vb><BR>]]></HTML> <Field Name="Title"/> <HTML><![CDATA[<BR>]]></HTML> <Field Name="Artist"/> <HTML><![CDATA[</TD></TR></TABLE>]]></HTML> </ViewBody> <ViewFooter> <HTML><![CDATA[</TD></TR></TABLE>]]></HTML> </ViewFooter> <Query/> </View> </ows:XML>
rect 元素的 href 值(它为图像文件的链接提供 URL)是使用 CAML HttpHost 和 LookupColumn 元素构造的。
页面中需要包括下面的处理说明,以便 VML 正常工作。
其他阅读材料
有关 VML 的详细信息,请参阅 MSDN VML Reference。
有关 CAML 的详细信息,请参阅 SharePoint Team Services SDK 中的 CAML 参考。