2007年8月27日,星期一

将自定义帮助页面添加到SharePoint很复杂!

我一直在想一阵的是如何扩展SharePoint帮助系统。前阵子我写过 如何在SharePoint中修改“系统”页面 通过有效地添加新页面-我使用的示例是:

  • 自定义的回收站页面,其中仅显示当前用户删除的项目
  • 一个自定义的“中央管理”页面,其中包含特定于我的虚拟组织的管理员的消息

当实现这样的自定义时,我认为能够添加自定义帮助以伴随新功能会很有用。因此,今天我着手研究SharePoint帮助系统,以了解如何执行此操作。不幸的是,到目前为止,我的回答是这很困难,而且我还没有弄清所有问题!但是,我想详细说明我发现的内容,希望它对某人仍然有用,或者知道的人可以发表评论或链接并完成拼图。

因此,明确地说,我在谈论如何添加自定义 应用 帮助页面-与WSS和MOSS SDK参考的2 .chm文件无关。在站点或中央管理页面中,应用程序帮助页面从顶部栏中的帮助图标链接到:

如您所料,此图标(及其后面的链接)由页面的母版页提供。单击该链接将调用一个名为TopHelpButtonClick()的JavaScript函数。 核心.js 打开帮助窗口-在大多数页面上都会传递“ NavBarHelpHome”参数,尽管值得注意的是,这些页面链接到除 默认 帮助页面会覆盖此值。由于所有页面都说中央管理器共享相同的母版页(并且JS调用位于母版页中,而不是实际页面中),因此core.js中的代码将检查该页面本身是否指定了替代。因此,各个页面可以使用以下脚本块覆盖母版页中指定的帮助位置:

<脚本 类型="文字/ javascript" 语言="的JavaScript">

       变种 navBarHelpOverrideKey = “ OSSCentralAdmin”;

</脚本>


然后,Core.js将使用此替代参数而不是'NavBarHelpHome'构建链接,这意味着页面可以轻松链接到自定义页面,而不是默认页面。为了链接到自定义帮助页面,您的页面将需要覆盖此值。

此处使用的值链接到存储在C:\ Program Files \ Common Files \ 微软 Shared \ 网页服务器扩展\ 12 \ TEMPLATE \ XML \ HELP中的一组映射文件中的值。对于上面显示的值,我们发现映射文件之一“ OssSearchAdmin_HelpKeymap.xml”包含以下内容:

 

<帮助图>

    <>OSSCentralAdmin</>

    <collectionId>MS.SEARCH.ADMIN。清单</collectionId>

    <contextId>MS.SEARCH.ADMIN.OSSCentralAdmin</contextId>

</帮助图>


此目录中的映射文件集都包含相似的条目,即,每个页面都有一个对应的条目,用于指定默认帮助页面的替代。由于这些文件似乎没有遵循任何命名约定,因此我敢冒险将任何具有正确架构的XML文件放入此处,帮助系统将其选中。当找到这些引用指向的内容时,事情变得很有趣!使用Visual Studio“在文件中查找”在“ 12”目录中进行的初始搜索不会产生任何结果,但是与大多数其他情况一样,值得进一步研究。在\\ 12 \ HCCab \ 1033 \目录中是一组.cab文件,这些文件存储SharePoint帮助系统中使用的帮助文件。在上面的示例中,“ MS.Search.Admin.HC.cab”文件是被引用的文件。在内部,我们看到许多文件,其中一个名为“ MS.SEARCH.ADMIN。清单.xml”,您会注意到该文件的值是 <collectionId> 在上面的映射中。一个.cab文件的内容如下:



到目前为止,快速回顾了一下-我们发现了如何覆盖显示的初始帮助页面,以及指定的键如何链接到打包为“ HCCab \”中cab文件的一组帮助文件。<localeId>' directory.

清单文件显然是.cab中文件的索引如何链接的关键。顺便说一句,对于那些熟悉构建SharePoint解决方案包的人来说,这里使用的架构与那里使用的“ manifest.xml”文件完全无关。 查看这些清单文件中的一个文件的内容,让我印象深刻的第一件事是它看起来像系统生成的文件-一方面 父/子和链接关系很多 这将是复杂的 手工记录。摘录如下:

<?XML文件 ="1.0"?>

<救命Collection>

  <名称>SearchCentralAdmin</名称>

  <ID>MS.SEARCH.ADMIN。清单</ID>

  <更改日期>2006-10-13 21:53:57Z</更改日期>

  <创建日期>2006-10-13 21:53:57Z</创建日期>

  <作者>微软</作者>

  <>11.0.9413.2</>

  <lcid>1033</lcid>

  <默认HelpItem>搜索管理员HA10175815</默认HelpItem>

  <品牌形象 />

  <rootCategory>搜索管理员MSCH10176169</rootCategory>

  <反馈 节目="" />

  <救命Items>

    <救命Item>

      <ID>MS.ADARCH.ADMIN.HA10047848</ID>

      <父母>

        <父母 排序="4" ="真正">搜索引擎管理员CH10176336</父母>

        <父母 排序="4" ="真正">搜索引擎管理员CH10176336</父母>

      </父母>

      <relatedItemsPointingToMe>

        <项目 排序="1">MS.ADARCH.ADMIN.HA10047848</项目>

        <项目 排序="1">MS.SEARCH.ADMIN.ManageSearchService</项目>

        <项目 排序="1">MS.SEARCH.ADMIN.SearchServerSettings</项目>

      </relatedItemsPointingToMe>

    </救命Item>

    <救命Item>

      <ID>搜索引擎管理员HA10047852</ID>

      <父母>

        <父母 排序="6" ="真正">搜索管理员AD CH10176338</父母>

      </父母>

      <relatedItemsPointingToMe>

        <项目 排序="1">MS.SEARCH.ADMIN.LogSummary</项目>

        <项目 排序="1">MS.SEARCH.ADMIN.LogViewer</项目>

      </relatedItemsPointingToMe>

    </救命Item>


但是,要检查的一件事是在 <默认HelpItem> 确实是最初加载的页面 帮助窗口打开时。就是这样!

 

我不禁想到,已经使用了帮助文件生成器,可能有必要使用相同的方法来添加自定义帮助页面。 当我开始钻研时,我主要希望找到一些由 nDoc 要么 沙堡 某处,但似乎确实使用了一些我不熟悉的东西。 Robohelp也许?

 

如果有人能对此有所启示,我很想听听。同时,我注意到其他人通过传递自定义参数然后修改core.js来拦截该问题并打开一个完全自定义的帮助窗口,而不是直接插入现有的帮助系统,从而找到了解决该问题的替代方法。 Ragav Jagannathan关于他的方法的帖子可以在这里找到- http://ragavj.blogspot.com/2007/04/custom-help-window-can-be-opened-by.html。正如Ragav正确指出的那样,自定义core.js文件不受支持,因此在沿这条路线走之前,您应该仔细考虑。

[更新- 尼克·斯旺 MSN要我指出 在Central Admin网站上有一个文档库,其中包含帮助文件。有趣的是,这是存储在文件系统上HCCab文件夹中的同一组文件!很难从IIS日志中得知实际上已提取了哪些文件集,因为 它们似乎是通过动态加载的 '/_layouts/helpContent.aspx'和'/_layouts/help.aspx' pages. Interesting!]

 

张贴者 Chris O'Brien 15:19 11 comments 链接到这篇文章  

标签: ,

2007年8月19日,星期日

在新网站上自动设置自定义权限

这是三篇文章中的第三篇也是最后一篇文章,我将在此演示如何在网站创建过程中执行自定义处理。看到 “文章系列-具有网站定义的自定义权限” 有关文章系列的全文。具体来说,我想展示如何使用代码在创建网站时对其进行修改,以完成网站定义/网站模板通常无法完成的工作。在我使用的示例中,我在创建的网站上设置自定义权限。例如,假设您的组织正在以协作的方式使用SharePoint并且用户自己创建网站,则这种情况可能会有用,但是某些网站需要受到保护,以便将访问权限限制为特定用户。最终用户通常可能不了解SharePoint安全模型的详细信息,因此,如果我们能自动为他们解决这个问题,那就太好了。

解决方案

在上一篇文章中,网站定义-网站创建过程中的自定义代码', I 节目ed how it's possible to use a 特征 receiver 在 conjunction with the site definition to do pretty much 任何thing you might want to do as sites are created. Based on this approach, my solution 是 based around the following:



  • 自定义列表,用于存储网站集的根网站中的授权用户列表。此列表存储用户到他们在创建的站点中应具有的权限的映射。
  • 定制网站定义,通过复制现有定义(如SDK中所述)创建。
  • 特征 which doesn't have 任何 特征 elements defined, but 是 在tached to a 特征 receiver. A property 是 defined to pass 在 the 名称 of the 烫发issions list.
  • 功能接收者代码,该代码使用对象模型来迭代权限列表并向列出的每个用户授予适当的权限。

因此,让我们分解解决方案的每个元素。请注意,所有代码等都可以下载,并在文章末尾链接到该代码。首先,我们创建一个看起来像这样的列表(单击放大):



查看列表的编辑视图(如下所示),我们看到两个关键列是:

  • “用户”-人员或组数据类型
  • “权限级别”-选择数据类型,允许值为“所有者”,“贡献者”和“查看者”




If we are creating sites which are restricted we would probably want to secure the list so that curious users 能够not add themselves, and then gain access to 任何 future restricted sites which are created.


So that's the list. The site definition 在 my example doesn't do 任何thing special - it's just a copy of the 'BLANKINTERNET' definition to keep the example simple. However, '创建,部署和更新自定义网站定义”提供了有关您可以使用网站定义进行的各种自定义设置的更多信息。

特征被定义为引用我们正在创建的Feature接收器类。这样可以确保在激活功能后我们的自定义代码将运行。

<特征  标题="网站配置" ID="7C020FFF-FF42-4fe2-8A9B-9BCA0D5F8001" 描述= ="1.0.0.0" 范围="网页"

          ="真正" DefaultResourceFile="核心"

          接收器组件="COB.Demos.SiteDefinition,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = cd9b418c14cff42e"

          接收器类="COB.Demos.ProjectXSiteDefinition.SiteProvisioning" XML文件ns="http://schemas.microsoft.com/sharepoint/">

  <物产>

    <!-- 也可以通过作为属性传入并稍微修改代码来通过GUID检索列表 -->

    <属性 ="PermissionsListName" ="Project X权限" />

  </物产>

</特征>


“ 接收器组件”和“ 接收器类”属性具有指向包含我们的自定义代码的功能接收器类的值。还要注意,我们传入的值可以通过使用Feature属性在代码中检索。这可以用作对类中的值进行硬编码的一种更灵活的替代方法-在这种情况下,我们使用它以“授权用户”列表的名称传递,这意味着该功能可以在不同的需求中重复使用(这将使用不同的需求列表)。对代码和属性的细微调整将允许您根据需要使用列表GUID,但是请注意,如果在另一个SharePoint环境中重新创建列表,则列表GUID将有所不同。

因此,一切都很好,但是什么可以确保激活功能?自从上一篇文章以来,您已经失去了话题吧?当使用onet.xml文件的WebFeatures部分中的以下行的定义创建站点时,将自动激活功能,该文件指定站点定义包括:


<特征 ID="7C020FFF-FF42-4fe2-8A9B-9BCA0D5F8001">


最后,转到我们在功能接收器类中编写的代码:

使用 系统;

使用 微软.SharePoint;

 

命名空间 COB.Demos.ProjectXSiteDefinition

{

    网站配置 : SPFeatureReceiver

    {

        上市 覆写 虚空 特征Activated(SPFeatureReceiverProperties 属性)

        {

            网页 currentWeb = 空值;

            网站 currentSite = 空值;

            目的 oParent = properties.Feature.Parent;

 

            //通过名称检索权限列表。

            sPermsListName = properties.Definition.Properties [“ PermissionsListName”]。值;

 

            //仅在使用网站定义在预期网站集中创建网站时才执行处理。

            如果 (properties.Feature.Parent 网页)

            {

                currentWeb = (网页)properties.Feature.Parent;

               currentSite = currentWeb.Site;

 

                清单 烫发sList = currentSite.RootWeb.Lists [sPermsListName];

 

                //确保将网络设置为使用唯一权限,我们不会从父网站复制现有权限。

                如果 (!currentWeb.HasUniqueRoleAssignments)

                {

                   currentWeb.BreakRoleInheritance();

                }

 

                前言 (清单Item 烫发 烫发sList.Items)

                {

                    sPermLevel =()烫发[“权限级别”];

 

                    SPFieldUserValue userValue =(SPFieldUserValue)perm.Fields [“用户”] .GetFieldValue(perm [“用户”] .ToString());

                    SP用户 用户= userValue.User;

                   setPermission(currentWeb,user,sPermLevel);

                }

 

               currentWeb.Update();

            }

        }

 

        私人的 虚空 setPermission(网页 currentWeb, SP用户 用户, sPermLevel)

        {

            SP集团 PermissionsGroup = 空值;

 

            开关 (sPermLevel)

            {

                案件 “所有者”:

                   PermissionsGroup = currentWeb.AssociatedOwnerGroup;

                    打破;

                案件 “游客”:

                   PermissionsGroup = currentWeb.AssociatedVisitorGroup;

                    打破;

                案件 “会员”:

                   PermissionsGroup = currentWeb.AssociatedMemberGroup;

                    打破;

                默认:

                    NotImplementedException(。格式(“组'{0}'尚未实现。”,sPermLevel));

                    打破;

            }

 

           PermissionsGroup.AddUser(用户);

      }

 

        上市 覆写 虚空 特征Deactivating(SPFeatureReceiverProperties 属性)

        {

        }

 

        上市 覆写 虚空 已安装功能(SPFeatureReceiverProperties 属性)

        {

        }

 

        上市 覆写 虚空 特征Uninstalling(SPFeatureReceiverProperties 属性)

        {

        }

    }

}


逐步执行代码,我们首先找到“授权用户”列表,告诉SharePoint我们不想继承正在创建的网站的权限,然后遍历列表添加 找到用户后,将其分配给网络的相应安全组。请注意,SPWeb对象具有允许您轻松引用“所有者”,“访客”组等的属性。这些属性将以“ [我的网站名称]所有者”的形式命名,因此避免了您必须进行任何讨厌的字符串连接这里。

关于此类与其他文件的位置如何匹配,我将其存储在同一VS项目中。在此示例中,我没有使用VSeWSS创建解决方案,但是正如我上次提到的那样,这可以使事情变得更加简单。我之所以不选择此处,是因为我想使用Feature属性传递列表名称,并且在当前版本中,VSeWSS没有灵活性来支持此功能。无论如何,在同一个VS项目中拥有该类意味着在编译项目时,将构建接收器程序集并将其输出到同一项目的bin目录中。然后,将传递给makecab.exe的.ddf文件将此dll和所有其他文件添加到为部署而构建的解决方案包(.wsp)中。您可以选择使用构建后类型的解决方案(MSBuild,构建后脚本等),通过直接XCOPY或使用STSADM命令将其自动部署到每次编译时的本地环境中。构建和部署SharePoint解决方案包的文章对此有更多信息。因此,我的总体项目结构如下所示:




因此,对于部署,这意味着一切都在一个包中- 在部署时,程序集会在功能激活过程运行之前命中GAC,这意味着功能接收器代码已到位并将成功执行。部署后,可以使用站点定义,并可以从中创建新站点。如果我们继续创建站点,那么如果我们查看不同的安全组,则会看到已根据存储在“授权用户”列表中的配置数据添加了适当的用户。

车主组:



访客组:


就是这样了!现在,我们有了解决方案,使我们能够通过网站定义“打包”自定义权限。显然,我们可以将权限映射存储在其他存储中,例如数据库表或XML文件,但是在所有条件都相同的情况下,我强烈建议使用SharePoint列表存储此类数据。为您提供了用户界面,可以应用安全性以确保标准用户不知道列表的存在。

我使用的所有文件都可以从以下位置下载 http://sharepointchris.googlepages.com/sitedefinitionwithcustompermissions.

在使用文件方面,您可以按照以下过程使用该技术:

  • 从我提供的列表模板创建授权用户列表-'PermissionsListTemplate.stp'
  • 将您的用户和权限映射添加到列表中
  • 将站点定义文件添加到VS项目中的适当位置,并根据需要修改onet.xml文件等。
  • 如果已添加文件,请修改.ddf文件以包括这些文件并重建解决方案包
  • 使用STSADM部署软件包(zip中包含.bat文件),然后根据定义创建站点!

Hopefully this series has been some use. While the approach 是 certainly useful 在 my scenario of rolling out a site definition used to create automatically secured sites from, 在 general terms you 能够 use the technique to do 任何 custom processing you want 在 the site creation process. If there are 任何 queries please leave a comment!

2007年8月12日,星期日

网站定义-网站创建过程中的自定义代码

这是三篇文章系列中的第二篇,我的目的是展示如何使用您自己的API代码自定义网站创建过程(称为网站配置)。完整的介绍和系列内容可以在以下位置找到: http://sharepointnutsandbolts.blogspot.com/2007/07/article-series-custom-permissions-with.html。我正在使用的示例自定义如下: any 使用定义创建的网站 应该使用一组特定的权限,而不是简单地遵循继承父网站权限的默认行为。由于无法使用标准的网站定义来完成此操作(就像您可能要执行的许多其他操作一样),因此需要使用API​​。

但是,今天 重点不是我的示例的权限细节,而是更多 how generally to 添加您自己的代码,该代码将在网站配置过程中运行。最好的是,如果您了解SharePoint功能,则实际上非常简单。

有许多原因可能导致您有理由在网站配置过程中使用API​​。本质上,如果你 在onet.xml文件中找不到使用CAML模式进行操作的方法,可能是您不得不 write code. Hence, 想想你几乎容易 能够 在onet.xml文件中执行 and reverse the list in 要么der to work out scenarios which require code, but some examples which spring to mind 任何how are:

  • 更改网站的自定义母版页
  • 创建一个站点列以从列表中获取数据(请参阅我的功能接收器上的文章,该文章位于 在Codeplex上创建查找字段的功能)
  • 向网站添加定制的唯一权限(本系列文章中的示例)
  • 设置网站属性 from 任何 kind of dynamic lookup

简而言之,有很多方案。


使用VSeWSS创建网站定义

如果您曾经用以下方法创建网站定义 Windows 的SharePoint Services的Visual Studio扩展,您会注意到它给您的VS项目包含一个名为SiteProvisioning.cs的文件。内部是一个事件处理程序方法,您可以在其中添加自定义代码,该代码将在根据定义创建站点时执行。该类如下所示:

命名空间 COB.Demos.SiteDefinition

{

    上市 部分的 ProjectXSiteDefinition

    {

        /// <summary>

        /// 在此处定义您自己的功能激活操作代码

        /// </summary>

        上市 虚空 激活(SPFeatureReceiverProperties 属性)

        {

            //我的代码在这里。

        }

    }

}

 

所有这些背后的管道都很有趣。乍一看,方法签名看起来像功能接收者,但实际上不是。但是,检查VS项目(您至少需要用F5生成一个项目才能生成文件)表明,VSeWSS实际上已经在后台创建了一些功能。这些文件可以在VS项目的bin \ Debug \ solution文件夹下找到(默认情况下是隐藏的-您需要在Visual Studio Solution Explorer中执行“显示所​​有文件”)。如果您进一步研究以确切了解VSeWSS的功能,则会发现以下内容:

  • 2 已创建功能-1部署了'default.aspx'文件,另一个没有'elements'文件,但已连接到功能接收器-这是 与VS项目相同的程序集中的类。如果您检查GAC,您的确会在此找到该程序集。
  • 在“ 网页功能”元素下的onet.xml文件中添加了类似于以下内容的行:

    <特征 ID="67b2507c-8822-41dc-b939-3d8f34b5ad13" />


    值得注意的是,这是连接到功能接收者的功能的ID。
  • 在包含功能接收器的程序集上使用Reflector显示,主事件处理程序方法执行了一些处理,然后调用 激活 上面显示的方法,即VSeWSS为您提供的位置,以添加您自己的代码以在创建网站时执行。该代码实际上包含在VS项目中的SiteProvisioning.Internal.cs文件中。 (如果您对这里的所有代码到底在做什么感到好奇,就我所知,答案是,当使用VSeWSS项目模板创建网站定义时,没有任何答案。但是,在Solution Generator时也可以找到此代码用于提取网站定义-在这种情况下,需要完成一些修正,这就是所使用的代码。)

因此,总而言之,VSeWSS将创建一个隐藏的功能添加到onet.xml的“ 网页功能”部分,以便在 定义用于创建网站*。 Feature连接到Feature接收器,该接收器调用您的自定义代码所在的OnActivated方法。

*(注意 如果该定义用于创建网站定义, 根网站也被创建 自动执行,因此功能也会 然后被激活。另请注意,该功能必须已经 已安装 在服务器场中以这种方式激活它)。

我们可以从中得出的结论是,在站点供应过程中没有“特殊位置”可注入自定义代码,但这可以通过使用功能接收器来完成。因此,如果您不想使用VSeWSS创建网站定义,则可以使用这种技术将自定义代码添加到网站创建过程中。

就该代码的外观而言,“ Hello World”示例可能是:

上市 虚空 激活(SPFeatureReceiverProperties 属性)

{

     网页 currentWeb = 空值;

     网站 currentSite = 空值;

     目的 oParent = properties.Feature.Parent;

 

     如果 (properties.Feature.Parent 网页)

     {

         currentWeb = (网页家长

        currentSite = currentWeb.Site;

     }

     其他

     {

         currentSite = (网站家长

        currentWeb = currentSite.RootWeb;

     }

 

     currentWeb.Title = “在以下位置设置供应代码” +  DateTime.Now.ToString();

    currentWeb.Update();

}


希望这可以说明编写在定义中创建的站点上设置属性的代码非常简单。一般而言 网页 目的 是 the entry point, and 任何 property which 能够 be modified 能够 be modified 使用 the API. So, this 是 a pretty powerful technique which 能够 be used 在 many scenarios.

如果您有这种要求,我绝对建议您使用VSeWSS简化流程。当然,也可以手动将所有内容打包并打包到解决方案中,但是该工具确实节省了大量麻烦。但是,与VSeWSS一样, 这个价格是有一定灵活性的。作为我的示例代码 the final 文章将显示,有时将数据传递到 Features by 使用 功能属性,很遗憾,VSeWSS不支持此功能。因此,在有用的情况下,以下链接提供了一个zip文件,其中包含使用上述技术的解决方案/功能, 没有 使用VSeWSS:

http://sharepointchris.googlepages.com/customcodewithsitedefinitions

在下一篇也是最后一篇文章中,我将介绍在创建网站时使用API​​修改网站权限的细节。希望明确的是,这是 结合此处详细介绍的技术,最终结果是可以根据功能自动激活特定功能,从而自动设置特定权限 创建网站时。

2007年8月5日,星期日

创建,部署和更新自定义网站定义

这是三篇系列文章中的第一篇,我们将讨论自定义网站定义,尤其是如何在网站创建过程中运行自己的自定义代码。如果您需要使用API​​进行任何自定义(超出站点定义通常可以完成的范围),则此技术很有用。在我的系列文章中(有关完整系列文章的内容,请参见 http://sharepointnutsandbolts.blogspot.com/2007/07/article-series-custom-permissions-with.html), I use the example of creating a site definition with specific 安全 烫发issions 'attached' - so that when 任何 sites are created 使用 the definition, specific 烫发issions are applied which are 不同 到父站点的权限(这与默认值不同,默认值是默认值,新站点将继承父站点的权限)。可以在链接到前面的介绍性文章中找到更多背景信息。

在本文中,我们将从网站定义基础知识开始- 我还将在最后的链接中提供本文中使用的文件集。。从根本上讲,自定义网站定义是可以从中创建新SharePoint网站的模板。可以将自定义内容打包到定义中,以便自定义内容自动出现在通过模板创建的站点中。考虑以下有关网站定义的信息:

  • 它们是通过复制现有的(例如,即用的)网站定义并添加自定义项来创建的
  • XML文件(尤其是onet.xml文件)指定网站定义的内容(即.aspx页,图像,Web部件,功能[以SharePoint功能的形式])
  • 它们提供了与网站模板(.stp文件)类似的功能-有关网站定义和网站模板之间差异的讨论,请参见 http://msdn2.microsoft.com/en-us/library/aa979683.aspx
  • 可以使用SharePoint解决方案包(.wsp文件)部署网站定义,因此无需将文件手动复制到SharePoint场中的每个Web服务器。

WSS 3.0 SDK中详细记录了创建站点定义的过程,网址为 http://msdn2.microsoft.com/en-us/library/ms454677.aspx,因此我实际上不在这里介绍,但会鼓励您关注该链接。但是,我将快速浏览onet.xml文件中的一些关键元素,以复习可以使用网站定义进行的操作。例如,让我们提取一个onet.xml文件用于发布(为清楚起见,请注意,这仅是一个摘录-完整版本可在本文结尾的链接中找到):

<组态 ID="0" 名称="空白互联网">

  <网站功能>

    <特征 ID="A392DA98-270B-4e85-9769-04C0FDE267AA">

      <!-- 发布先决条件 -->

    </特征>

    <特征 ID="7C637B23-06C4-472d-9A9A-7C175762C5C4">

      <!-- ViewFormPagesLockDown -->

    </特征>

    <特征 ID="F6924D36-2FA8-4f0b-B16D-06B7250180FA">

      <!-- Office 的SharePoint Server发布 -->

    </特征>

  </网站功能>

  <网页功能>

    <特征 ID="00BFEA71-4EA5-48D4-A4AD-305CF7030140" > </特征>

    <特征 ID="22A9EF51-737B-4ff2-9346-694633FE4416">

      <!-- 出版 -->

      <物产 XML文件ns="http://schemas.microsoft.com/sharepoint/">

        <属性 ="ChromeMasterUrl" ="〜SiteCollection / _catalogs / masterpage / BlueBand.master"/>

        <属性 ="WelcomePageUrl" ="$ Resources:cmscore,List_Pages_UrlName; /default.aspx"/>

        <属性 ="PagesListUrl" =/>

        <属性 ="AvailableWebTemplates" ="* -ProjectX#0"/>

        <属性 ="AvailablePageLayouts" ="ThreeColumnLayout.aspx"/>

        <属性 ="AlternateCssUrl" = />

        <属性 ="简易出版" ="" />

      </物产>

    </特征>

  </网页功能>

  <模组>

    <模组 名称="登录页面" />

    <模组 名称="图片" />

    <模组 名称="首页" />

  </模组>

</组态>


  • 组态元素表示要与选定定义一起使用的设置,从而允许在定义之间重用设置组,以提高灵活性
  • 网站功能 / 网页功能-指定当定义分别用于创建网站集或子网站时应自动激活哪些功能。 这是我们创建网站定义系列的总体目标的关键,该网站定义将自定义的唯一权限应用于由此创建的网站。
  • 发布功能的AvailableWebTemplates属性-可用于限制可用于从该定义创建的网站内创建子网站的网站定义。例如,这有助于防止内容创建者将团队网站添加到面向公众的.com网站上。在这里,我指定只能将配置为'0'的'ProjectX'定义用于子站点。
  • 发布功能的AvailablePageLayouts属性-可用于限制可以在根据此定义创建的网站中使用哪些页面布局。同样,这对于控制网站的外观很有用。
  • 模块-模块是在创建网站时自动添加的一组文件。请注意,也可以使用来指定默认情况下应将哪些Web部件添加到Web部件页面。 AllUsersWebPart 元件。


部署网站定义


但是,我真正要关注的是如何将网站定义打包到解决方案中以简化部署。当部署到多个环境(例如,测试,分段,生产)和/或部署到包含多个SharePoint 网页服务器的服务器场时,这通常最有用。如果您没有此要求,则可能需要考虑更简单的手动复制XML文件的过程,如WSS SDK中所述。

在开始之前,让我强调一下 Windows 的SharePoint Services(VSeWSS)的Visual Studio扩展 是用于创建和部署自定义网站定义的有用工具,如果您尚未满足此要求,我建议您对其进行研究。但是,我在这里说明“手动”方式以期希望对螺母和螺栓有所了解。

因此,要手动将这些文件打包为解决方案,我们按照SDK的说明获取自定义的onet.xml和webtemp * .xml文件,然后将这些文件放置在与第12章中找到的现有站点定义文件类似的文件夹结构中夹。我建议创建一个Visual Studio项目作为对这些文件进行分组的最佳方法(VSeWSS也遵循这种方法)。这意味着您应该以如下形式结束:



请注意,我们还有一个.ddf文件,该文件与makecab.exe一起用于构建解决方案包-请参阅有关 构建和部署解决方案包 有关完整过程的详细信息,请点击此处。有效地,我们需要通过将.ddf文件作为参数传递给makecab.exe来构建解决方案,然后运行STSADM -o addsolution和STSADM -o deploysolution命令以部署到目标SharePoint网站。

完成此操作后,在“创建站点”屏幕上,我们应该看到新模板出现:



用户现在可以使用此定义来创建站点,这些站点将自动具有我们预先指定的所有功能和外观。如果随后需要将定义部署到其他环境,则是在其中复制.wsp文件并运行STSADM命令的简单情况。现在,我们可以很好地创建具有与之关联的自定义权限的网站定义。

本文中使用的文件集位于 http://sharepointchris.googlepages.com/creatinganddeployingcustomsitedefinition

更新现有的网站定义


最后,简要介绍一下更新定义。这里需要格外小心,因为您经常会想要更新已使用该定义创建的网站正在使用的文件-这可能会破坏事情!通常 定义是可以的,但是修改/删除内容可能会导致问题。

因此,一种好的技术是复制现有定义,添加更新并部署以供新站点使用,而且 隐藏早期版本 因此无法继续使用。这是通过从TEMPLATE \删除webtemp * .xml文件来完成的\ XML目录。由于已经在TEMPLATE \ SiteTemplates中保留了实际的定义(onet.xml等),因此从早期版本的定义中提供的所有站点都将继续正常运行。

还请记住,可以将新功能装订到现有站点定义(仅影响已创建的新站点,而不影响现有站点),这对于避免必须更新站点定义本身很有用。看到我的文章 特征装订 更多细节。

这就是网站定义的基础知识。本系列的下一步-如何超越简单的网站定义:添加自定义代码,这些代码将在创建网站时执行!