officesharepoint:Office Space: SharePoint 的功能

  本文举例源代码或素材下载

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能目录

  “功能”是什么?

  功能结构

  功能部署和激活

  扩展功能

  自定义应用

  整理总结

  在上期 Office Space 专栏中我讨论了 Office Open XML 文件格式 我还特别介绍了如何使用由 Microsoft .NET Framework 3.0 提供打包 API 编写代码隐藏 ASP.NET 页从而为 Microsoft® Word 生成 .docx 文件 本期专栏中我将在上期已经介绍内容基础上继续探讨如何使用 Office Open XML 文件格式 我还将介绍如何将这些代码集成到既可在 Windows® SharePo® Services (WSS) 3.0 中部署又可在 Microsoft Office SharePo Server (MOSS) 2007 中部署业务解决方案中

  本月 Office Space 专栏重点是介绍将用于使用 WSS 和 MOSS 创建业务解决方案基本构造块 我会解释 WSS“功能”是什么并介绍如何生成个可自动创建网站WebSite内新列表和文档库 WSS“功能” 在这个过程中我会将个自定义应用页添加到该自定义业务解决方案中 其中包含了从 SharePo 列表中数据生成 Word 文档并将这些文档保存在 SharePo 文档库中所需 Visual Basic® 代码

  “功能”是什么?

  开发针对 WSS 和 MOSS 自定义业务解决方案时需要做件事是确切了解“功能”(这里所指不是功能集) 这里功能是指已添加到 WSS 3.0 中种新以开发人员为中心创新 基本上来说这提供用于定义网站WebSite元素机制这些网站WebSite元素可在目标网站WebSite或目标网站WebSite集合上下文中自动激活 功能可以定义元素类型包括列表例子、列表类型、菜单命令、页面模板、页面例子、事件处理和工作流 我在本专栏中所讨论举例涉及个名为 OfficeSpaceFeature 功能该功能用于创建列表和文档库并将自定义菜单项添加到标准 WSS“网站WebSite操作”菜单从而使用户能够导航到自定义应用

  任何功能都包含个在每个前端 Web 服务器文件系统专用 WSS 系统目录中创建目录 该功能目录包含个或多个基于 XML 文件(该文件使用协作应用标记语言 (CAML)) 按照惯例每个功能目录都包含个名为 feature.xml 清单文件此文件用于定义功能高级属性如其 ID 及其用户友好 Title

  除 feature.xml 文件外每个功能通常还都包含个或多个额外 XML 文件(例如 elements.xml)用于定义构成该功能实际元素 该目录还可能包含针对列表定义和页面模板等内容以及针对图像、级联样式表和 JavaScript 等资源其他类型文件举例中功能目录还包含了个用作文档库文档模板文件

  帮助您迅速了解功能个好思路方法是研究基本 WSS 安装所包含标准功能集 图 1 显示就是安装 WSS 后 FEATURES 目录外观个举例 可以看到每个功能都有自己目录 安装 MOSS 后FEATURES 目录将有很大相同其中将包含 100 多个功能

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能

  图 1标准 FEATURES 目录

  创建了包含构成功能所有文件目录后您必须使用 WSS 在服务器场级范围安装该目录 使用 WSS 安装某功能后即可使用个可通过“网站WebSite设置”页面访问管理页面在网站WebSite或网站WebSite集合上下文中激活该功能

  本专栏下载中包含了个名为 OfficeSpaceFeature Visual Studio® 项目其中包含了个同名功能 图 2 显示了个解决方案资源管理器视图借此您可以了解在通过创建 Visual Studio 项目来开发自定义 WSS 或 MOSS 功能时会涉及哪些类型文件 本专栏中举例是作为 Visual Basic DLL 项目创建 当然如果您愿意也可以使用 C# DLL 项目 集 DLL 中托管代码必须使用强名称进行编译并且必须安装在全局集缓存Cache (GAC) 中以便能够用于功能事件处理

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能

  图 2OfficeSpaceFeature

  功能结构

  在研究 feature.xml 文件的前要注意此功能文件必须部署在名为 FEATURES WSS 系统目录下它们各自专用目录中 FEATURES 目录位于名为 TEMPLATE 个 WSS 系统目录中如图 1 所示 鉴于功能部署要求有必要在用于开发 WSS 功能 Visual Studio 项目中创建个并行文件夹层次结构 这样可以更轻松地将功能文件复制到正确位置并在开发时对它们进行测试

  首先要将个名为 TEMPLATE 文件夹添加当前项目根目录中 然后在 TEMPLATE 中另外创建个名为 FEATURES 目录 最后在 FEATURES 目录中再创建个以功能项目名称命名目录这样项目和目录名称都是 OfficeSpaceFeature如图 2 所示

  现在我们来看 feature.xml 文件中 CAML 内容 feature.xml 文件用作功能清单您可以在此指定功能本身高级属性定义信息举例功能 feature.xml 文件如图 3 所示

  可以看到定义功能 Feature 元素包含 Id、Title、Description、Version、Scope、Hidden 和 ImageUrl 等多个属性 而您必须为 Id 属性创建新 GUID才能唯标识该功能 您可以使用用户友好文本创建功能 Title 和 Description 属性 这些属性在 WSS 管理页面上直接显示给用户WSS 管理页面用于激活和停用功能

  Scope 定义了可以激活和停用功能上下文 我正在创建功能范围等于 Web这意味着可以在网站WebSite上下文中激活和停用该功能 不过如果将 Scope 值指定为 Site则可以在网站WebSite集合范围内激活和停用功能 另外两个可用于定义功能范围是 WebApplication 范围和 Farm 范围

  可以看到Hidden 属性值为 FALSE 这意味着在服务器场内安装功能后可能需要激活该功能用户才能够看到它 如果将所创建功能 Hidden 属性值设置为 TRUE则该功能在显示给用户可用功能列表中将被隐藏 必须通过自定义代码或通过另个功能激活依赖项从命令行激活隐藏功能

  您可能已经注意到 ImageUrl 属性值指向了基本 WSS 安装中个图形图像 此图像在 UI 中将显示在该功能旁边

  图 3 中所显示 feature.xml 文件最后部分是 ElementManests 元素 该元素包含内部 ElementManest 元素这些元素会引用用于定义功能构成元素其他 XML 文件 在这种情况下只有个 ElementManest 元素使用位置属性来指向名为 element.xml 文件

  请注意在基于 CAML 文件(如 feature.xml 和 elements.xml)中添加和修改 XML 时需要添加对 XML 架构驱动 IntelliSense® 支持 TEMPLATE 目录中有个名为 XML 目录其中包含了若干个 XML 架构并且有个架构名为 wss.xsd如果将此架构文件和 feature.xml 和 elements.xml 等功能文件相关联Visual Studio 将提供 IntelliSense从而更容易创建自定义功能

  现在我们将详细探讨 element.xml 文件中内容 假定每当激活功能时您都需要例子化文档库则可以创建个类似于图 4 所示 elements.xml 文件

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能Figure4Elements.xml 举例文件

<Elements xmlns=”http://schemas.microsoft.com/sharepo/”>
 <ListInstance
  FeatureId=”00BFEA71-E717-4E80-AA17-D0C71B360101”
  TemplateType=”101”
  Id=”CustomerLetters”
  Description=”Letters sent to customers”   
  _disibledevent=>  Title=”Customer Letters”  
  Url=”CustomerLetters”>
 </ListInstance>
 <Module Name=”LetterTemplate” List=”101” Url=”CustomerLetters/Forms”>
  <File Url=”LetterTemplate.docx” Type=”GhostableInLibrary” />
 </Module>
 <!-- more elements to come... -->
</Elements>
  此处显示个元素(ListInstance 元素)用于创建列表或文档库例子 请注意ListInstance 包含了个 FeatureId 和 TemplateType用于指向特定列表类型和定义该列表类型功能 ID 在本例中我使用是标准 WSS 文档库类型其 TemplateType 标识符为 101用于创建标题为 Customer Letters 新文档库 ListInstance 元素下还有个 Module 元素它包含个内部 File 元素 此 File 元素用于为文档库提供文档模板 更准确地说此 File 元素为 WSS 提供了用于将功能目录中名为 LetterTemplate.docx 文件复制到 WSS 网站WebSite指令 这将使用户可以访问该文件

  尽管 elements.xml 中声明性逻辑为您创建 WSS 网站WebSite内元素提供了很大帮助但和此同时经常还需要辅以编程逻辑 例如我创建了个新文档库并提供个文件作为文档模板 但是若要将文档模板和文档库相关联还需要提供些针对 WSS 对象模型进行编程额外代码

  在我 feature.xml 文件中您会注意到 Feature 元素包含两个名称分别为 ReceiverAssembly 和 ReceiverClass 属性 这些属性被配置为指向个称为功能接收器托管类该托管类将提供事件处理 在安装或激活功能以及卸载或停用功能时将会激发功能接收器类中事件处理 通过创建从 SPFeatureReceiver 类继承类来创建功能接收器如图 5 所示

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能Figure5从 SPFeatureReceiver 继承

Imports Microsoft.SharePo
Public Class FeatureReceiver : Inherits SPFeatureReceiver
 Public Overrides Sub FeatureActivated( _
   ByVal properties As SPFeatureReceiverProperties)
  ‘*** fires when feature is activated
 End Sub
 Public Overrides Sub FeatureDeactivating( _
   ByVal properties As SPFeatureReceiverProperties)
  ‘*** fires when feature is deactivated
 End Sub
 Public Overrides Sub FeatureInstalled( _
   ByVal properties As SPFeatureReceiverProperties)
  ‘*** fires when feature is ed
 End Sub
 Public Overrides Sub FeatureUning( _
   ByVal properties As SPFeatureReceiverProperties)
  ‘*** fires when feature is uned
 End Sub
End Class
  在举例中我只提供了 FeatureActivated 事件处理代码 这些代码使用 WSS 对象模型将文档模板和 Customer Letters 文档库相关联 在该事件处理此关联是通过获得对当前网站WebSite SPWeb 引用然后获得对目标文档库 SPDocumentLibrary 引用而实现 这样就可以通过 Update 思路方法来修改 DocumentTemplateUrl 属性并保存所做修改如下所示:

Public Overrides Sub FeatureActivated( _
  ByVal properties As SPFeatureReceiverProperties)
 Dim site As SPWeb = CType(properties.Feature.Parent, SPWeb)
 Dim libLetterTemplates As SPDocumentLibrary
 libLetterTemplates = CType(site.Lists(“Customer Letters”), _
  SPDocumentLibrary)
 Dim templateUrl As String = _
  “CustomerLetters/Forms/LetterTemplate.docx”
 libLetterTemplates.DocumentTemplateUrl = templateUrl
 libLetterTemplates.Update
End Sub


  功能部署和激活

  创建 feature.xml 文件和 elements.xml 文件的后接下来需要安装我功能以便进行测试 安装我功能需要 4个步骤 首先必须将名为 OfficeSpaceFeature.dll 集文件安装到 GAC 中 然后必须将 OfficeSpaceFeature 目录复制到 WSS 系统 FEATURES 目录 再下步是运行 Stsadm.exe以便使用 WSS 来安装功能 最后需要在 WSS 网站WebSite上下文中激活该功能

  可以通过在我 OfficeSpaceFeature 项目根目录中创建个名为 .bat 批处理文件并添加图 6 中所示命令行指令自动执行前 3步 如果我愿意也可以通过使用 Stsadm.exe 实用工具运行 ActivateFeature 操作来自动执行第 4步 但是我没有在举例中这样做我想让您了解手动激活功能过程用户将在 WSS 用户界面中完成这些操作

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能Figure6用于实现自动安装命令

@SET TEMPLATEDIR=”c:Program FilesCommon FilesMicrosoft Shared
         web server extensions12TEMPLATE”
@SET STSADM=”c:Program FilesCommon FilesMicrosoft Shared
       web server extensions12binstsadm.exe”
@SET GACUTIL=”c:Program FilesMicrosoft Visual Studio 8
       SDKv2.0Bingacutil.exe”
Echo Installing OfficeSpaceFeature.dll in GAC
%GACUTIL% - bindebugOfficeSpaceFeature.dll
Echo Copying source files to WSS TEMPLATE directory
xcopy /e /y TEMPLATE* %TEMPLATEDIR%
Echo Installing feature with WSS
%STSADM% -o feature -filename OfficeSpaceFeaturefeature.xml -force
Echo Restarting IIS worker process
IISRESET
  在将指令添加到 .bat 文件的后我对 Visual Studio 进行了配置使它在我每次重新生成 OfficeSpaceFeature 项目时运行该文件 配置过程是:先转到“项目属性”中“生成事件”选项卡然后添加以下生成后事件命令行指令:

cd $(ProjectDir)
Install.bat
  第行用于将当前目录更改为项目目录当前目录 第 2行用于运行批处理文件以便将功能文件复制到正确位置然后使用命令行 Stsadm.exe 实用工具 InstallFeature 操作来安装功能

  现在已经正确地安装了该功能接下来就可以在网站WebSite上下文中激活它了 通过导航到“网站WebSite设置”页面您可以在 WSS 或 MOSS 服务器场中任何网站WebSite中激活该功能 在“网站WebSite管理”部分下单击名为“网站WebSite功能”链接此时您应进入如图 7 所示个页面 请注意装有 MOSS 服务器场中功能会比只装有 WSS 服务器场中功能多很多

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能

  图 7激活和停用网站WebSite功能

  OfficeSpaceFeature 标题和描述会显示在“网站WebSite功能”页上因此可以轻松找到 OfficeSpaceFeature 并单击“激活”按钮 此时当前网站WebSite应提供在 elements.xml 中使用声明性逻辑定义所有元素 接下来WSS 会从 GAC 中加载接收器创建接收器类个例子并执行接收器类 FeatureActivated 思路方法

  我举例相当简单 不过如果希望您也可以在 FeatureActivated 中更加复杂地组合声明性 CAML 元素和 WSS 对象模型代码

  扩展功能

  如果仔细检查 elements.xml 文件您会发现另个 ListInstance 元素 该元素用于通过内置 WSS Contacts 列表类型创建名为 Customers 列表 该 ListInstance 还介绍说明了如何向列表添加几个默认项从而提供某些举例客户数据

  至此我已经介绍了如何使用声明性 CAML 逻辑来创建列表和文档库 现在我需要指出您也可以在针对 WSS 对象模型进行编程功能激活事件中使用自定义代码创建列表或文档库

  举例功能在 FeatureActivated 事件处理中包含代码可用于从名为 Letter Templates 标准 WSS 自定义列表类型创建另个列表 从标准 WSS 自定义列表类型创建新列表时该列表会自动包含个名为 Title 字段代码还会创建个名为 Body 该列会使用 WSS 对象模型来添加些列表项这些列表项提供必要数据作为创建 Customer Letters 模板相应代码如图 8 所示

Office Space: SharePo<img src='/icons/59381int.gif' /> <img src='/icons/59381de.gif' />功能Figure8创建列表和添加新列

Dim template As SPListTemplate = site.ListTemplates(“Custom List”)
Dim listLetterTemplatesID As Guid
listLetterTemplatesID = site.Lists.Add(“Letter Templates”, “”, template)
Dim listLetterTemplates As SPList = site.Lists(listLetterTemplatesID)
listLetterTemplates.Fields.Add(“Body”, SPFieldType.Text, True)
listLetterTemplates.OnQuickLaunch = False
listLetterTemplates.Update
Dim LetterTemplate As SPListItem
LetterTemplate = listLetterTemplates.Items.Add
LetterTemplate(“Title”) = “Initial Greeting”
LetterTemplate(“Body”) = “Thanks for your recent erest in Litware.”
LetterTemplate.Update
LetterTemplate = listLetterTemplates.Items.Add
LetterTemplate(“Title”) = “Follow Up”
LetterTemplate(“Body”) = “Thanks for your recent purchase.”
LetterTemplate.Update


  自定义应用

  了解功能概念以及如何使用功能很重要但还需要了解个用于设计和开发 WSS 和 MOSS 解决方案基本构造块 WSS 体系结构支持种特殊类型即应用 标准“网站WebSite设置”页 (tings.aspx) 就是应用个典型例子 对于每个前端 Web 服务器都部署tings.aspx 页但它可以通过 WSS 服务器场中任何网站WebSite进行访问

  应用页部署在前端 Web 服务器文件系统上作为物理文件其所在目录路径为:

%PROGRAMFILES%common filesmicrosoft shared
  web server extensions12TEMPLATELAYOUTS
每当 WSS 提供新 Web 应用它都会将实际 LAYOUTS 目录映射到名为 _layouts 虚拟目录 利用这映射方案以及些附加处理逻辑WSS 运行时使用户可以在服务器场内任网站WebSite上下文中访问各个应用 例如假定 WSS 服务器场中有 3个可通过以下 3个 URL 访问区别网站WebSite:http://Litwareinc.com
http://Litwareinc.com/sites/Vendors
http://Litwareinc.com:1001/sites/Accounting
  通过将 _layouts 目录中某应用相对路径添加到网站WebSite URL 末尾即可访问该应用 例如可以使用以下任何个 URL 访问“网站WebSite设置”页:

http://Litwareinc.com/_layouts/tings.aspx
http://Litwareinc.com/sites/Vendors/_layouts/tings.aspx
http://Litwareinc.com:1001/sites/Accounting/_layouts/tings.aspx
由于服务器场级应用页只有个版本因此可将其编译为个 DLL 并次加载到内存中 您始终都不用担心区别网站WebSite某个应用页会有区别版本 此外应用页不易受到来自有权限自定义网页用户攻击 因此WSS 不会禁止这些用户包含内联代码   WSS 团队(Team)广泛使用应用页来提供用于设置和管理网站WebSite及其内部元素众多标准功能 WSS 还支持为自定义业务解决方案自定义应用 本月专栏举例中包含了个名为 LetterGenerator.aspx 自定义应用其部署和 LAYOUTS 目录中任何其他应用部署没有什么区别

  请注意LetterGenerator.aspx 不直接部署在 LAYOUTS 目录中而是部署在 LAYOUTS 目录中个名为 OfficeSpace 目录中 最好是在 LAYOUTS 目录中创建您自己目录来承载自定义应用这样可以避免任何可能命名冲突

Tags:  sharepointserver sharepoint2007 sharepoint officesharepoint

延伸阅读

最新评论

发表评论