如何:创建自定义网站定义和配置
上次修改时间: 2011年2月2日
适用范围: SharePoint Foundation 2010
创建自定义网站定义时不会涉及到过程代码。它是一个完全的表述性开发任务。主要包括将 协作应用程序标记语言 (CAML) 标记添加至两个重要文件:一个 WebTemp*.xml 文件以及一个 Onet.xml 文件。在某些情况下,您还会创建一个或多个自定义网页。如果要确保自定义网站可供全球化,则还可以使用一个或多个资源 (.resx) 文件。
有时,自定义网站类型是内置列表类型、内容类型、栏类型及其他功能的重组,不同于任何内置网站类型。但往往,如果您的 Microsoft SharePoint Foundation 解决方案需要新的网站类型,它可能还包含一个或多个自定义内容类型、自定义字段类型、自定义列表类型、自定义 Web 部件、自定义移动 Web 部件适配器、自定义文档模板等。您应该首先完成所有这类辅助开发项目,以便可以在自定义网站定义的标记中引用这些元素。
设置项目
在 Microsoft Visual Studio 中,从项目模板的"SharePoint"|"2010"部分创建一个"网站定义"项目。使其成为服务器场解决方案,而不是沙盒解决方案。为其命名,该名称也将作为此网站定义的内部名称。用户无法看到此名称。按照惯例,网站定义名称全部使用大写字母,并且不含空格或其他字符。如果您的网站定义中将有多种配置,请记住该术语将充当一系列自定义网站类型的名称,因此它应适合该角色。在本主题中,提供的示例使用名称 RESEARCH。
备注
Visual Studio网站定义项目和此文档通常假定您只有一个网站定义;即 WebTemp*.xml 文件中有一个 Template 元素;但是,您可以有多个自定义网站类型,即网站定义内的多种配置。并且,您可以在同一 WebTemp*.xml 文件中包含多个网站定义。在这种情况下,您可能希望使用更加通用的名称为项目命名(例如,您的公司名称)。而且,如果同一 WebTemp*.xml 文件中有多个网站定义,则必须向每个网站定义的 Visual Studio 项目添加一个单独的 Onet.xml 文件并对每个网站定义执行"配置 Onet.xml 文件"下的步骤,因为每个网站定义必须有其自己的 Onet.xml 文件。您还需要确保解决方案包将每个网站定义部署到其自己的 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates 子目录中。每个这样的子目录必须与 WebTemp*.xml 文件中相应 Template 元素的 Name 属性具有相同名称。
网站定义项目中通常没有代码,也应该没有程序集;但默认情况下,对于每个项目,Visual Studio 总是会编译一个程序集。如果项目中没有代码,则该程序集不包含类,但同样在默认情况下,Visual Studio 会通过解决方案包部署该程序集。这意味着一个无意义的程序集将添加到全局程序集缓存中。因此,如果您没有向项目中添加了编译到程序集中的元素,您应禁用此默认的 Visual Studio 行为。否则,您的解决方案将部署无意义的程序集,这可能会对场管理员或调试 SharePoint 部署的人员造成困扰。在"解决方案资源管理器"中选择项目名称。随即会打开"属性"窗口。将"将程序集包含在包中"属性设置为"false"。
配置 WebTemp*.xml 文件
在"解决方案资源管理器"中打开 WebTemp*.xml 文件。在当前示例中,这是 WebTemp_RESEARCH.xml 文件。
提示 在执行此程序时打开内置的 WebTemp.xml 文件作为模型会有所帮助。该文件位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\lcid\XML\ 中,其中 lcid 为语言/区域性的数字 ID(例如 1033 表示英文)。您创建的文件将与该内置文件合并。请勿更改内置文件。您的自定义文件的名称必须 与模式 WebTemp*.xml 相匹配。
将 Template 元素的 ID 属性更改为 10000 或更大的值。这会确保您的 ID 不会与 Microsoft 产生的未来网站定义发生冲突。如果您的目标服务器场上有其他自定义网站定义,请确保每个定义都具有唯一的 ID。
Template 元素中有一个默认的 Configuration 元素。如果您的网站定义将具有多种配置;即如果它代表一系列相关网站类型,请复制该 Configuration 元素,以使该系列中您需要的每种自定义网站类型都有一个该元素。在当前的示例中,将会有两种配置。有关何时应在单个网站定义中包含多种配置的更多信息,请参阅在多个定义或多个配置之间进行选择。
将原始 Configuration 元素的 ID 属性保留为 0,但按顺序对制作的副本重新编号,从 1 开始。
将每个 Configuration 元素的 Title 和 Description 属性更改为适合您的自定义网站配置的值。这些名称和说明将在用户创建新网站时显示在用户界面 (UI) 中。
如果要在 UI 中显示自定义图像,在用户从您的自定义网站配置中创建网站时作为您的自定义网站类型的符号,请根据需要更改 ImageUrl 属性的值。
根据需要更改每个 Configuration 元素的 DisplayCategory 值。该值设定类别的名称,当用户创建网站时,网站配置会显示在 UI 中的该类别下。在许多情况下,可以使用用于 Template 元素的 Name 属性的相同字符串。也可以使用您的公司名称。您还可以使用内置字符串"协作"或"会议"。我们建议您使用"自定义"。默认情况下,"自定义"类别包含 Web 模板而不是网站定义配置,管理员可能希望保持该模式。
在所有 Configuration 元素中,Hidden 属性的值都应为 FALSE。
有关自定义 WebTemp*.xml 文件的详细信息,请参阅了解 WebTemp*.xml 文件和 Templates 元素(网站)。
以下是一个自定义 WebTemp_RESEARCH.xml 文件的示例。该文件使用两个配置元素定义不同的网站定义配置,一个用于"Research Collaboration"(研究协作)网站,另一个用于"Research Document Workspace"(研究文档工作区)网站。两个网站定义都将显示在 UI 中名为"Research & Development"(研发)的类别下。
<?xml version="1.0" encoding="utf-8" ?>
<Templates xmlns:ows="Microsoft.SharePoint">
<Template Name="RESEARCH" ID="10001">
<Configuration ID="0" Title="Research Collaboration site"
Hidden="FALSE" ImageUrl="_layouts/images/stsprev.jpg"
Description="This definition creates a site for the Research
team to create, organize, and share general information."
DisplayCategory="Research & Development">
</Configuration>
<Configuration ID="1" Title="Research Document Workspace" Hidden="FALSE"
ImageUrl="_layouts/images/dwsprev.jpg" Description="This
definition creates a site for Research team colleagues to
work together on specific documents."
DisplayCategory="Research & Development">
</Configuration>
</Template>
</Templates>
备注
在 Microsoft SharePoint Foundation 对象模型中,网站定义配置及其父网站定义由 Microsoft.SharePoint.SPWebTemplate 对象表示。该对象的 Name 属性在定义名称和配置 ID 之间放置一个"#"号将它们相连。因此,前面示例中的两种网站定义配置将命名为"RESEARCH#0"和"RESEARCH#1"。
配置 Onet.xml 文件
在"解决方案资源管理器"中打开 Onet.xml 文件。
因为您已选择创建网站定义而不是 Web 模板,所以您需要执行以下至少一个点符项,这些点符项无法通过 Web 模板执行。(有关创建自定义网站定义还是 Web 模板的详细信息,请参阅在自定义 Web 模板和自定义网站定义之间进行选择。)
注册一个自定义电子邮件页脚,它将显示在从您的自定义网站定义创建的网站所发送的电子邮件上。通过添加 ServerEmailFooter 元素作为 Project 元素的子元素来完成此操作。有关详细信息,请参阅 ServerEmailFooter 元素(网站)。
配置您的自定义网站类型以使用自定义文件对话框后处理程序或自定义外部安全提供程序。通过添加 Components 元素作为 Project 元素的子元素可以完成此操作。有关详细信息,请参阅Components 元素(网站) 及其子元素的主题。
注册自定义文档类型,以在从您的自定义网站定义创建的网站的文档库中使用。通过以下步骤完成此操作。
添加 DocumentTemplates 元素作为 Project 元素的子元素并添加 DocumentTemplate 元素作为 DocumentTemplates 元素的子元素。
将 DocumentTemplate 元素的 Path 属性设置为与您在自定义 WebTemp*.xml 文件中用于 Template 元素的 Name 属性值的相同名称。若要继续该示例,您将使用"RESEARCH"(研究)。
将 DocumentTemplate 元素的 Type 属性设置为值 10000 或更大,以确保其不会与 Microsoft 创建的未来文档模板发生冲突。
将 DocumentTemplate 元素的 DisplayName 属性和 Description 属性设置为适当值。
根据需要添加及设置 DocumentTemplate 元素的其他可能属性。有关详细信息,请参阅如何:向网站定义中添加文档模板、文件类型和编辑应用程序、DocumentTemplate 元素(网站) 和 DocumentTemplates 元素(网站)。
将 DocumentTemplateFiles 子元素添加到新的 DocumentTemplate 元素。然后,至少向其添加一个 DocumentTemplateFile 子元素,并设置其属性。有关详细信息,请参阅如何:向网站定义中添加文档模板、文件类型和编辑应用程序和 DocumentTemplateFile 元素(网站)。
针对您的自定义网站定义中包含的每个自定义文档模板,重复上述步骤。必须为每个 DocumentTemplate 元素指定不同的 Type 属性值。在后面的步骤中,您将注册用于您的网站类型的所有内置文档模板。
将 Project 元素的以下属性设置为适当值。(仅 Title 和 ListDir 为必需属性,ListDir 值可以是空字符串。)
ListDir
Revision
SiteLogoUrl
SiteLogoDescription
Title
请勿使用 UIVersion 属性。有关这些属性的详细信息,请参阅Project 元素(网站)。
如果您希望注册任何内置文档模板以在自定义网站上使用,可以通过以下步骤完成操作。
如果未在之前的步骤中完成此操作,请添加 DocumentTemplates 元素作为 Project 元素的子元素。
根据需要将 DocumentTemplate 元素从位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\SiteTemplates\sts\XML 中的用于标准团队网站的 Onet.xml 文件复制到您的 DocumentTemplates 元素。
将 Configuration 元素添加到 Configurations 元素,使 Configuration 元素的数目与在前面步骤中创建的自定义 WebTemp*.xml 文件中的数目相同。
将每个 Configuration 元素的 ID 属性设置为从 0 开始的连续数字。*对 Configuration 元素进行所有进一步的更改时,请记住 Onet.xml 中的配置只用于指定 WebTemp*.xml 中具有相同 ID 编号的配置的详细信息。*因此在后面的示例中,Onet.xml 中的配置 0 为 WebTemp_Research.xml 中的"Research Collaboration"(研究协作)网站配置提供详细信息,配置 1 指定"Research Document Workspace"(研究文档工作区)配置的详细信息。
设置每个 Configuration 元素的 Name 属性。Name 属性的值无需与 WebTemp*.xml 文件中对应配置的 Title 属性值匹配。按照惯例,前者是后者的缩写。在后面的示例中,您分别将配置 0 和 1 命名为"RC"和"RDW"。
在每个 Configuration 元素中,根据需要将 List 子元素添加到 Lists 元素中,以确保每个根据您的其中一种配置创建的网站在创建时自动包含所需的列表。(如果 Lists 元素最初是一个空元素标记 <Lists />,则将其分隔为开始标记和结束标记:<Lists></Lists>。)
对于任何内置列表类型,从 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates 的下级文件夹中的其中一个内置 Onet.xml 文件复制 List 元素。对于自定义列表类型,您必须构建一个 List 元素。例如,如果您定义具有 Type 属性 10001 的名为"My_Custom_List"的列表类型,则可以添加 <List Title="My_Custom_List" Type="10001" Url="Lists/My_Custom_List" FeatureId="guid"/> 以创建 Lists 元素。对于包含每个列表的列表定义的文件夹(包含 ASPX 文件、Schema.xml 及所有相关文件),Url 属性包含其 URL。如果指定了 QuickLaunchUrl 属性,则该属性包含列表的 AllItems.aspx 文件的完整路径,可使列表显示在"快速启动"区域中。有关在网站定义配置中注册列表的详细信息,请参阅 List 元素(网站)和构造块:列表和文档库。
在每个 Configuration 元素中,根据需要将 Module 子元素添加到 Modules 元素中,以确保根据您的其中一种配置创建的每个网站在创建时自动包含所需的文件。在配置中引用的每个模块均必须在主 Modules 元素中定义,该元素同样位于 Onet.xml 文件中,但在 Configurations 元素之外。有关在 Onet.xml 文件中注册模块的详细信息,请参阅 Module 元素(网站)和模块。
在每个 Configuration 元素中,根据需要在 SiteFeatures 和 WebFeatures 元素中添加 Feature 子元素,以确保每个根据您的其中一种配置创建的网站能够使用其所需功能自动创建,并且这些功能处于激活状态。使用 SiteFeatures 元素注册网站集范围内的功能。使用 WebFeatures 注册网站范围内的功能。您注册的功能(包括您创建的自定义功能)必须在基于您的网站定义配置创建网站时已部署到 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES 的子文件夹中。例如,您可以向您的配置中添加内容类型(如如何:向网站添加内容类型中所述)或添加栏类型(如如何:向网站中添加栏中所述)。若要注册 SharePoint Foundation 附带的任何内置功能,您可以从 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates 的下级文件夹中任何内置 Onet.xml 文件中的 SiteFeatures 和 WebFeatures 元素复制 Feature 元素。有关注册功能的详细信息,请参阅 WebFeatures 元素(网站)、SiteFeatures 元素(网站)。
下面是 Configurations 元素的示例,该示例延续了当前示例。
<Configurations> <Configuration ID="0" Name="RC"> <Lists> <List FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" Type="101" Title="$Resources:core,shareddocuments_Title;" Url="$Resources:core,shareddocuments_Folder;" QuickLaunchUrl="$Resources:core,shareddocuments_Folder;/Forms/AllItems.aspx" /> <List FeatureId="00BFEA71-6A49-43FA-B535-D15C05500108" Type="108" Title="$Resources:core,discussions_Title;" Url="$Resources:core,lists_Folder;/$Resources:core,discussions_Folder;" QuickLaunchUrl="$Resources:core,lists_Folder;/$Resources:core,discussions_Folder;/AllItems.aspx" EmailAlias="$Resources:core,discussions_EmailAlias;" /> <List FeatureId="00BFEA71-D1CE-42de-9C63-A44004CE0104" Type="104" Title="$Resources:core,announceList;" Url="$Resources:core,lists_Folder;/$Resources:core,announce_Folder;"> <Data> <Rows> <Row> <Field Name="Title">$Resources:onetid11;</Field> <Field Name="Body">$Resources:onetid12;</Field> <Field Name="Expires"><ows:TodayISO/></Field> </Row> </Rows> </Data> </List> <List FeatureId="00BFEA71-2062-426C-90BF-714C59600103" Type="103" Title="$Resources:core,linksList;" Url="$Resources:core,lists_Folder;/$Resources:core,links_Folder;" /> <List FeatureId="00BFEA71-EC85-4903-972D-EBE475780106" Type="106" Title="$Resources:core,calendarList;" Url="$Resources:core,lists_Folder;/$Resources:core,calendar_Folder;" QuickLaunchUrl="$Resources:core,lists_Folder;/$Resources:core,calendar_Folder;/Calendar.aspx" EmailAlias="$Resources:core,calendar_EmailAlias;" /> <List FeatureId="00BFEA71-A83E-497E-9BA0-7A5C597D0107" Type="107" Title="$Resources:core,taskList;" Url="$Resources:core,lists_Folder;/$Resources:core,tasks_Folder;" QuickLaunchUrl="$Resources:core,lists_Folder;/$Resources:core,tasks_Folder;/AllItems.aspx" /> </Lists> <Modules> <Module Name="Default" /> </Modules> <SiteFeatures> <Feature ID="00BFEA71-1C5E-4A24-B310-BA51C3EB7A57" /> </SiteFeatures> <WebFeatures> <Feature ID="00BFEA71-4EA5-48D4-A4AD-7EA5C011ABE5" /> </WebFeatures> </Configuration> <Configuration ID="1" Name="RDW"> <Lists> <List FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" Type="101" Title="$Resources:core,shareddocuments_Title;" Url="$Resources:core,shareddocuments_Folder;" /> <List FeatureId="00BFEA71-6A49-43FA-B535-D15C05500108" Type="108" Title="$Resources:core,discussions_Title;" Url="$Resources:core,lists_Folder;/$Resources:core,discussions_Folder;" QuickLaunchUrl="$Resources:core,lists_Folder;/$Resources:core,discussions_Folder;" /> <List FeatureId="00BFEA71-D1CE-42de-9C63-A44004CE0104" Type="104" Title="$Resources:core,announceList;" Url="$Resources:core,lists_Folder;/$Resources:core,announce_Folder;"> <Data> <Rows> <Row> <Field Name="Title">$Resources:onetid11;</Field> <Field Name="Body">$Resources:onetid12;</Field> <Field Name="Expires"><ows:TodayISO/></Field> </Row> </Rows> </Data> </List> <List FeatureId="00BFEA71-2062-426C-90BF-714C59600103" Type="103" Title="$Resources:core,linksList;" Url="$Resources:core,lists_Folder;/$Resources:core,links_Folder;" /> <List FeatureId="00BFEA71-EC85-4903-972D-EBE475780106" Type="106" Title="$Resources:core,calendarList;" Url="$Resources:core,lists_Folder;/$Resources:core,calendar_Folder;" QuickLaunchUrl="$Resources:core,lists_Folder;/$Resources:core,calendar_Folder;/Calendar.aspx" /> <List FeatureId="00BFEA71-A83E-497E-9BA0-7A5C597D0107" Type="107" Title="$Resources:core,taskList;" Url="$Resources:core,lists_Folder;/$Resources:core,tasks_Folder;" /> </Lists> <Modules> <Module Name="DWS" /> </Modules> <SiteFeatures> <Feature ID="00BFEA71-1C5E-4A24-B310-BA51C3EB7A57" /> </SiteFeatures> <WebFeatures> <Feature ID="00BFEA71-4EA5-48D4-A4AD-7EA5C011ABE5" /> </WebFeatures> </Configuration> </Configurations>
如果您希望为从您的网站定义配置中创建网站的用户自动打开一个特定页面,请为 Configuration 元素添加一个 ExecuteUrl 元素。通常,该元素用于打开您已创建的特定自定义应用程序页面,用户可在该页面上设置与您的自定义网站类型相关的特定选项。有关此元素的详细信息,请参阅ExecuteUrl 元素(网站)。有关自定义应用程序页面的详细信息,请参阅Application _layouts Page Type。
在 NavBars 元素中添加 NavBar 子元素可自定义根据您的自定义网站定义创建的网站中页面的导航区域。通常执行此操作的最简单方法是从 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates 的下级文件夹中的其中一个内置 Onet.xml 文件复制 NavBar 元素。(该 NavBars 元素基于网站定义中的任意 配置应用到网站)。有关此标记的详细信息,请参阅 NavBar 元素(网站)。
某些显示在会议或博客网站上的重要列表类型在将功能引入 SharePoint Foundation 前就已创建。这些列表类型在 MPS 和 BLOG 网站定义的 Onet.xml 文件中的 ListTemplate 元素中定义。如果您的自定义网站定义需要任何这些列表类型,请添加一个 ListTemplates 元素作为 Project 元素的子元素,然后从 MPS 和 BLOG Onet.xml 文件将所需的 ListTemplate 元素复制到其中。(*请勿添加任何自定义 ListTemplate 元素。*而应作为功能创建自定义列表,并在 Configuration 元素中 Lists 元素的 List 子元素中引用该功能,如前面步骤中所述。)有关列表模板标记的详细信息,请参阅 ListTemplate 元素(网站)。
将 Module 子元素添加到 Project 元素下的主 Modules 元素,以确保每次创建您的自定义类型的网站时,会自动向该网站提供所需的文件和"所有用户"Web 部件。您添加的任何新模块都必须在 Configuration 元素内的辅助 Modules 元素中引用。如果未在至少一个配置中引用某个模块,则不会使用该模块。若要注册 SharePoint Foundation 附带的任何内置模块,您可以从 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\SiteTemplates 的下级文件夹中的其中一个内置 Onet.xml 文件中复制相应的 Module 元素。有关模块标记的详细信息,请参阅 Modules 元素(网站)。
如果您希望根据您的定义创建的网站上的网页具有特定的自定义标头区域,请设置 Project 元素的 AlternateHeader 属性。有关详细信息,请参阅 Project 元素(网站)。
如果您希望根据您的定义创建的网站上的网页具有自定义 ECMAScript(JavaScript 或 Microsoft JScript 代码)功能(如自定义"编辑"菜单),请设置 Project 元素的 CustomJSUrl 属性。有关详细信息,请参阅 Project 元素(网站)。
如果要阻止 Microsoft SharePoint Designer 中特定类型的功能或其他设计器应用程序在根据您的定义创建的网站(如创建的备份或子网站)页面上工作,请设置 Project 元素的 DisableWebDesignFeatures 属性。有关详细信息,请参阅 Project 元素(网站)。
您可以通过在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\LCID\STYLES(其中 LCID 是语言/区域性的数字 ID,例如 1033 代表英语)中创建具有唯一名称的 .css 文件,来创建从您的定义中创建的网站所使用的自定义级联样式表 (CSS) 样式定义。将在该网站定义的 .aspx 页面内指定的默认 .css 文件的内容复制到此新文件中,并在新 .css 文件中添加或更新样式。使用 Project 元素的 AlternateCSS 属性指定新 .css 文件的路径。下面是一个示例。
AlternateCSS = "/_layouts/[%=System.Threading.Thread.CurrentThread.CurrentUICulture.LCID%]/styles/MyStyles.css">
自定义网站页面
双击"解决方案资源管理器"中的 Default.aspx 文件。您可以根据需要编辑该文件,包括将其指向自定义母版页。有关自定义网页的详细信息,请参阅网站和网页节点。
如果基于您的自定义网站类型的网站在创建时应自动包含其他类型的页面,请根据需要将其他 .aspx 页面添加到项目。通过在"解决方案资源管理器"中右键单击"网站定义"节点(不是项目名)并添加名为 custompage.aspx 的文件,执行此操作。以这种方式添加页面可确保其在解决方案包清单中注册并在部署解决方案时部署到适当位置。
如果作为解决方案的一部分包含自定义母版页,则必须以正确的方式将其添加到项目中,这样解决方案清单才能将其部署到正确位置。在"解决方案资源管理器"中右键单击项目名(不是"网站定义"节点),指向"添加",然后选择"SharePoint 映射文件夹"。
在"添加 SharePoint 映射文件夹"对话框中,选择"TEMPLATE\GLOBAL",然后单击"确定"。
在"解决方案资源管理器"中,右键单击"全局"节点并添加文件扩展名为 .master 的新文件。这会在"全局"节点中创建该新文件,并在解决方案包清单中注册它。
打开此新母版页并添加标记。有关自定义母版页的详细信息,请参阅母版页。
部署和测试网站定义
在"生成"菜单上选择"部署解决方案"。这会将所有文件自动部署到其适当位置,并回收该 Web 应用程序。
提示 如果您的开发环境是多服务器场而不是单服务器安装,Visual Studio 会将该解决方案添加到管理中心应用程序中的场解决方案库中,但不会部署它。请在管理中心中部署该解决方案。
根据您的自定义网站定义配置中的其中一种配置将网站添加到开发场。在用于新建网站的 UI 中,会显示新网站类型。在当前示例中,应在名为"研发"的类别中显示"研究协作网站"和"研究文档工作区"。
本地化自定义网站定义
有关如何创建自定义网站定义的本地化版本的信息,请参阅如何:创建自定义网站定义的本地化版本。