显示带有标签的帖子 苔藓 . 显示所有帖子
显示带有标签的帖子 苔藓 . 显示所有帖子

2007年11月25日,星期日

第2部分:在SharePoint中混合发布/协作功能

几个月前,我写了一篇有关以下问题的文章 building sites which 是 not pure publishing 要么 collaboration solutions, but which mix 特征 of the two. I mentioned 在 the time that I would follow up on these 是 sues 和 any 其他s we came across 在 the 结束 该项目的 so here it 是 .

快速回顾一下,我们说,具有发布/协作功能的网站的特征可能是:

  • 网站具有完全定制的外观/导航
  • 用户将使用文档库,讨论,日历等。
  • site templates 要么 definitions 是 used to create several sites with the same 内容/functionality
  • 自定义工作流可能用于支持业务流程(标准内容发布除外),可能还支持InfoPath表单

    所以我们来掩盖 在像这样的项目中可能会遇到的一些问题:

    Look 和 feel of 系统 pages

    这是指您创建的页面会 很高兴使用您的自定义母版页,默认情况下,“ _ layouts”目录中的任何“系统”页均不会共享此外观,因为它们引用了单独的母版页“ application.master”,该母版页也存储在文件系统的“ _layouts”。通常会由于使用我们网站中的协作功能而看到此类页面,例如,当用户上传或编辑文件的元数据时, 开始工作流程等

    实际上,事实证明这比我预期的要少,因为:

    • a quick test showed that the use of a HTTP module to switch the 主 page of these pages works fine. Several people have 记录了这种方法,我注意到Ted Pattison提供了一个 Codeplex功能 对于那些不想为此编写自己的代码的人。 (注意:尽管未得到严格支持,但HTTP模块方法的思想是,它比修改随SharePoint安装的文件(例如'application.master')要好,并且如果需要与官方版本保持一致,可以通过开关禁用它支持。)
    • 我们的 client decided this 原为 a low priority item, that we may 要么 may not deal with further down the line

    关于这一主题,我看到微软自己发布了知识库文章 如何在SharePoint Server 2007和Windows 的SharePoint Services 3.0中的“布局”文件夹中自定义应用程序页面. Bizarrely, the proposed solutions 是 modifying the standard files but taking backups of the 要么 iginals, 要么 duplicating the 'layouts' virtual directory in IIS - the HTTP module idea 是 not mentioned. Without dwelling on this too much, this seems crazy to me 和 我不是唯一的一个。我仍然更喜欢HTTP模块解决方案,尽管一定要进行彻底的回归测试,但我会在需要它的项目中使用它。


    Use of InfoPath 使用表单身份验证entication

    这是将两种类型的功能融合在一起的有趣示例-协作解决方案可能很好地将InfoPath用于表单,但是发布站点通常使用表单auth以获得自定义/品牌登录体验。我们马上就遇到了问题 using InfoPath with forms auth - essentially the link to create 表单库中InfoPath表单的新实例将消失(示例链接如下所示[在此处启用Windows身份验证]):



  • 我花了一些时间才发现这与Central Admin中的“客户端集成”开关有关。对于表单身份验证站点,默认情况下将其设置为“关闭”,但对于Windows身份验证站点则默认为“打开”。不幸的是,解决该问题并不像轻按一下开关那样简单,因为该开关的作用是删除某些链接并禁用与浏览器集成在一起以进行链接处理的ActiveX控件。带开关 再次启用后,InfoPath链接将重新出现在内容类型上,但是当 一个链接,说,一个Word文档,浏览器 现在显示下载或保存文件的基本提示。这意味着 更复杂的“您要签出还是以只读方式打开”提示丢失,用户必须脱机使用文档并上载到SharePoint 在 the 结束 of editing,而不是能够直接保存回SharePoint资源库。换句话说,大多数人无法接受 for a 的SharePoint 2007协作解决方案。

    最后,我发现其他人处于相同的位置,但是在很短的时间内找不到解决方案。 Microsoft支持告诉我“他们不知道任何有关 这两个功能一起工作 因此,令人失望的结论是这两个功能不能很好地配合使用。我们的客户因此决定接受Windows身份验证(我们的身份验证存储区始终是AD 而不是SQL)。 然而, 实际上,我坚信可以给更多的时间进行这项工作-我认为前进的方法是修改网站设计,以在页面的标准内容中链接到InfoPath表单,而不是依靠SharePoint来完成。提供链接。提供的信息 如何:使用查询参数来调用启用浏览器的InfoPath表单  将在这里使用。我敢肯定,这一定是可能的,而其他人已经做到了,我很想听到任何人的来信。


    过度控制 没有出现在标准协作页面上

    我们的客户要求对搜索框进行一些自定义,然后在开发结束时遍历我们的错误列表,我意识到我们的自定义版本 was present 在我们创建的页面上,而不是现有列表中 页面,例如[MyList] /Forms/AllItems.aspx或类似的页面。鉴于这似乎很奇怪 所有页面都使用我们的自定义 master 并共享相同的标题!深入研究,这是由于SharePoint使用 委托控制 要加载搜索框.ascx文件并正确覆盖整个网站的控件,我们需要创建一个功能来指定 我们的 .ascx文件应优先于标准控件使用。如果我们直接替换了文件系统上的现有控件,则不需要这样做,但是在按顺序添加自定义文件时 为了避免对现有文件进行修改,这是多余的部分。在构建这种性质的站点时要注意的一个问题。


    概要

    我读了一些博客/讨论话题 本周早些时候暗示以这种方式自定义SharePoint几乎是不可能的,但是我们的项目(当然还有许多其他项目)证明事实并非如此。与这种功能平台通常一样,如果您了解SharePoint正在做的事情,也许会有更大的成功机会,但是对以协作为中心的网站进行广泛的自定义是固有的!

    2007年10月14日,星期日

    使用STSADM导出或内容迁移API进行部署

    有 focused on 部署使用 特征s 对于几篇文章, 早在五月,我写了一篇标题为 的SharePoint部署选项:功能还是内容部署?,它探讨了围绕 SharePoint项目的部署策略。可以使用多种方法 将SharePoint工件和内容从一个地方移动到另一个地方,我认为可以说部署方面仍然存在一定的混乱  适用于许多SharePoint开发人员。我当然不会声称获得所有答案,但是上周交付了另一个项目之后,似乎是回顾一些经验和交流的好时机。 reflect 在不同的方法上。

    不用说,就总体部署策略而言,最好的主意是 拥有一个!我看到许多来自 人们接近 在开发阶段结束时,询问他们应该如何将工作转移到  实时服务器。我发现离开部署直到 end of the project, is that none of the approaches are 完全地 直接(尤其取决于您的解决方案组成),等等 if your project 是  准时交货很重要 to 知道您可能需要执行哪些步骤。

    附带说明一下,让我们在这里阐明一些可能引起混淆的术语:

    • 内容部署-可用于移动内容的“路径和作业”功能, surfaced by 管理中心中的屏幕
    • 内容迁移API-基础API(有时称为PRIME),实际上用于两个STSADM导出 除了“管理内容和结构”工具以及从CMS2002迁移而来的内容部署(以略有不同的方式)

    这次,我决定使用内容迁移API来部署我们的解决方案,并且它可以正常工作 适合我们的情况。这与我过去完成的功能开发形成了对比,选择这种方法的主要原因是: 

    • 无需迭代部署 - 尽管我们的整体项目是分阶段进行的, 对于这个组件,我们能够 开发解决方案,然后部署我们开发环境中的所有内容。 (这种方法将 not work 对于后续部署,因为我们的客户在实时网站上生成的内容将在每次部署中被覆盖-有关更多内容,请参见下一篇文章。)
    • 保留对象GUID的能力 - 因为我们的项目大大简化了部署,因为 如果我们的列表在部署时被分配了新的GUID(与STSADM导出/导入一样),则引用这些列表的组件(ListViewWebPart,InfoPath表单等)将无法正确连接 the 部署 target. This would add a lot of "fix-up" steps to 部署 process if we were to use STSADM export.
    • 没有从源Central Admin到目标Central Admin的直接HTTP访问 - this 是 a prerequisite to use the Content Deployment functionality (paths 和 jobs) in Central Admin, but what we needed 原为 a file we could copy to the live 服务器. The 内容迁移API provides this ability 和 also gives a compression option for large amounts of data.
    • 自动 包含数据库 dependencies - as with STSADM export, (but not with 特征s), 的SharePoint will analyze 和 collect 所有 依存关系 such as fields, 内容 types, 主 pages etc. for us.

    该API使用起来相当简单,您可能已经看到 斯特凡的系列精彩文章 就此主题而言 - these serve as 一个很好的伴侣 MSDN文档.

    重要的是要记住,任何非数据库资产 (例如用户控件,程序集等)需要手动部署到目标环境-使用STSADM导出或 内容迁移API。就我们而言, the live environment 原为 a single server (and 版本控制将由我们的主要源代码控制系统处理),这些由XCOPY部署,因为 deployment using 解决方案包 在这里没有提供任何引人注目的优势。 

    在讨论文件系统文件时,请务必注意,在执行(例如)STSADM之后,如果在目标计算机上看到404错误, 导入,很可能您忘记了部署用户控件之类的东西。 404实际上来自引用的文件而不是实际的页面,因此请不要假定导入有问题 - a 检查“查看所有网站内容”,导入日志可能会确认所有网站页面均存在!

    希望这为您可能没有考虑的方法提供了一些思考的方法。我想我的主要意思是,尽管STSADM导出非常简单,但由于GUID更改,它可能无法完全解决所有部署难题。在接下来的文章中,我将提供更直接的部署策略比较(扩展“功能或内容部署”文章),并分享我的微型应用程序,该应用程序为内容迁移API提供了前端。

    [P.S. Sincere apologies to people who left 评论 whilst I 原为 on holiday which 是 still not published - I'll publish these 和 respond over the next few days.

    C。]

    2007年9月9日,星期日

    在SharePoint中混合发布/协作功能

    在创建SharePoint解决方案时,大多数情况下,需求通常会很好地映射到可用于创建新网站的现成网站定义之一。如果要创建品牌重磅的Internet / Intranet网站(WCM网站),我们可能会从“发布网站”模板开始。如果要在文档管理/协作方案中部署SharePoint,则可能会从“团队网站”模板开始,依此类推。当项目需求有效地结合了此功能时,它会变得有趣。这种站点的特征可能包括:

    • 网站具有完全定制的外观/导航
    • 用户将使用存储在文档库中的文件
    • site templates 要么 definitions 是 used to create several sites with the same 内容/functionality
    • 自定义工作流可能用于支持业务流程(标准内容发布除外),可能还支持InfoPath表单

    这样的要求带来了一些挑战,目前的我的项目就属于此类。在高层次上, 考虑到的是,在许多情况下,网站用户还将使用SharePoint提供的“系统”页面(例如, 使用文档库/列表, workflow etc.) 和 this doesn't happen in most WCM sites. This can lead to situations where there 是 a 差距 between the 网站“发布视图”的外观和感觉以及 'system' 是as. 我无意在此提供所有问题的答案,但我确实想讨论一些值得深思的问题。我可能会在项目结束时重新审阅这篇文章,并提供对问题和解决方案的更好的见解,但现在让我们介绍一些高层决策:

     

    Approach for 主 page development

    在这里开始开发的选项包括:

    • Using a 'minimal 主 page' from MSDN 要么 希瑟·所罗门
    • 修改default.master的副本(自定义团队网站的良好起点)
    • 修改blueband.master的副本(WCM站点的良好起点)

    这个决定部分取决于您要去的地方。由于我项目的目标是格式化 由CSS而不是布局表控制,以最小的母版页开始更有意义(出厂的页面布局使用表)。这是一个有趣的领域,因为要消除混合发布/协作网站中的表格,需要做很多工作(事实上,通常无法完全消除它们) 好处是有争议的。当然,网站用户将接触到的所有“系统”页面都使用布局表,因此我不确定会获得多少 by 只要 having some 使用CSS进行布局的页面。

    Other things to consider here 是 the usual questions of how to factor responsibility of 内容 items between the 主 page 和 页面布局, 如何定义内容类型等, but these 是 standard decisions in WCM site development so I won't cover them here.

     

    Use of Content Editor 网页部分 vs publishing RichHtmlField controls

    WCM开发的大多数人都知道,内容编辑器Web部件和Microsoft.SharePoint.Publishing.WebControls命名空间中的RichHtmlField控件提供的功能存在重叠,即它们都可以用于输入页面内容,例如文本/图像。不过,重要的是要考虑差异-RichHtmlField控件将其内容存储在列表项的列中, 页面,而CEWP是Web部件,因此将内容存储在Web部件中 storage 建筑。这很重要,因为如果要部署到其他环境 in your project plan 或正在进行的架构, 如果您使用字段控件,事情可能会更简单,因为此内容将随页面一起正确传播。

    Additionally, there 是 some URL fix-up 是 sues with using the CEWP 跨不同的环境,如 HawaiianAir.com撰写.

    总之,我建议 考虑将CEWP仅作为在非发布SharePoint网站中输入内容的一种方式。 

     

    Use of collaboration 网页部分 - in layouts 要么 in WebPartZones?

    同样,由于我们将协作功能混合到我们的网站中,因此我们可能需要使用某些Web部件 我们不会在直接的WCM网站中使用。 在我们的情况下,ListViewWebPart是某些区域的关键,并且用作允许用户从一个页面处理不同列表的一种方式。这里的第一个决定是 页面布局应包括 web parts 直接(通过在SharePoint Designer中添加它们)或 各个零件将位于的Web零件区域 稍后通过浏览器添加。 In 我更喜欢添加Web的大多数WCM方案 零件直接放置到页面布局中,因为最终用户将不会自定义/个性化它们(主要 Web部件区域的使用场景),并且当使用Web部件区域时,Web部件配置再次未存储在页面中,这会使部署更加复杂。 Using the 其他 直接从SPD添加的方法,配置存储在页面的实际HTML标记中, 因此会随页面布局本身一起移动。

    然而! ListViewWebPart有一些怪癖,这意味着并非总是可以直接从页面布局中使用。具体来说,仅可以将零件配置为使用当前Web的列表,并且 对于发布页面布局,这意味着 根网 因为这是母版页库的存储位置。由于我们的列表存储在子网站中,因此存在问题-使用DataView的其他解决方案也存在问题。另外,ListViewWebPart配置存储特定于其位置的值,这意味着配置XML不太便于移植(即,导出Web部件定义,修改,使用)。我想认为有可能随着时间的推移准确地确定哪些ID确实需要更改,但是a,我们没有时间在这个项目上。

    结果,在Web部件区域中使用ListViewWebPart实际上是这些中的最佳解决方案。 circumstances 据我所知。我们将在部署过程中多做几步,但这将比出现的替代方案花费更少的时间。

     

    Look 和 feel of 系统 pages

    如前面提到的, 对于WCM /协作站点,可能会有一个 disparity 网站主页面和用户将看到的“系统”页面的外观,即“ _layouts”目录中的页面。请注意,即使将站点和系统母版页都设置为指向您的自定义母版页,也会发生这种情况,因为这些页被设置为使用“ application.master”(也在“ _layouts”中的文件系统上),而这两个属性均不会影响。当然可以用您自己的版本替换'application.master',但这不是一个很好的解决方案,并且可能不受支持。 不幸的是,该体系结构似乎没有提供更改母版页的简便方法 used by “ _layouts”页面-您必须更深入地探讨实现方法。 许多.Net 2.0开发人员会知道 可以动态切换母版页 in .Net, 和  公平地说,这就是SharePoint对存储在母版页中的主页面的处理 gallery anyway. 我不知道该问题的真正解决方案,但是 Serge van den Oever博客上的讨论 当下s a viable approach using this technique. 

     

    So those 是 some of the 是 sues to consider. There 是 certainly 其他s, including navigation, CSS customization 标准样式(到 ensure collaboration 网页部分 与您的外观完美融合), 以及可能选择的身份验证机制。我将在以后的文章中介绍这些内容以及所有其他内容。

    2007年7月12日,星期四

    修改中'system'安全地在SharePoint中添加页面-带有示例代码

    In a 当下ation I gave recently I talked about modifying admin screens within 的SharePoint. By this, I mean 是as such as the site admin 是a 和 the 中央管理员 是a:

    网站管理员:


    中央管理员:



    Now, if your boss (or your users) asks you to add 要么 change functionality in these 是as, how would you handle that?

    好吧,您可能首先会看一下SharePoint如何实现这样的“系统”页面。然后,您会发现它们只是文件系统上12 \ TEMPLATE \ ADMIN文件夹中的标准.aspx文件。您还会发现,如果对这样的文件进行更改,则更改会立即反映在站点上-确保某些代码在经过编译的程序集中,这些程序集会被混淆(因此Reflector无效),但是否则没有神秘的抽象,没有缓存,就是这么简单。因此,更改功能或添加链接只是更改.aspx页的问题吗?

    这种方法的问题是不支持以这种方式修改核心文件。这是因为应用Service Pack或修补程序后,您的系统将处于不一致状态,并且充其量您的更改将被覆盖。因此,实现此类更改的更好方法是:

    • 采取 复印件 原始文件的
    • 修改副本以包括您的自定义
    • 创建一个SharePoint功能(包装在解决方案包[.wsp]中),以将自定义页面部署到12个配置单元中,并且 添加/修改SharePoint中的链接以指向您的自定义页面

    The 结束 result of this 是 that you have deployed your change without modifying any 原始文件的s, 和 是 therefore entirely supported. Additionally, because 特征s can be activated 和 deactivated with the click of a button, if you want to revert to the 要么 iginal functionality that's 所有 it 采取 s.

    Let's look 在 an example - I'll link to 所有 the code used here 在 the 结束 of the article. Imagine your users 是 asking you to change the Recycle Bin screen so that it 只要 displays items the 当前登录的用户 已删除-也许有手册 清理运动。并且还可以说,在练习完成之后,用户希望恢复到原始功能。 (现在请记住,我在这里演示的是 机制 进行这样的自定义,因此虽然在组织中不太可能进行此特定更改,但您可能 其他 有助于您的用户的自定义设置。)

    So, first we need to modify the functionality of the Recycle Bin page to add the filtering. 如前面提到的, we don't want to amend the 要么 iginal page, so we 采取 复印件 和 modify that. In my example, I'm adding a script block to the code in front (since I don't have access to Microsoft's source code for the code-behind) to effectively perform the filtering 在 the UI level, which 是 fine for this example. Once we've created the page we want to use, we're ready to create the 特征 和 解 to add 我们的 page to 的SharePoint.

    Let's start with the manifest.xml file for the solution - this 是 important because this 是 how we actually deploy 我们的 custom .aspx page to the appropriate place within the 的SharePoint files. (Remember 所有 this 是 available for download, the link 是 在 the 结束 of the article.)

    < XML文件 ns="http://schemas.microsoft.com/sharepoint/" 解决方案编号="AA7EF934-C993-4f91-8AF4-0FB1D45927FA">

      <功能清单>

        <特征Manifest 位置="COB.Demos.MyRecycleBinItems \ feature.xml" />

      </功能清单>

      <模板文件>

        <模板文件 位置="布局\自定义\ MyRecycleBinItems.aspx" />

      </模板文件>

    </>


    Notice what we 是 doing here 是 specifying that 我们的 custom .aspx page should be deployed to a 'Custom' subfolder within the 'LAYOUTS' directory. This 是 a good idea because it keeps 我们的 files separate from the core 的SharePoint files.

    然后,我们有一个相当标准的feature.xml文件,用于指定功能标识信息:

    <特征 XML文件 ns="http://schemas.microsoft.com/sharepoint/" ID ="29D8B365-6024-4b1a-84D2-FF789FE56355"

            标题="COB.Demos.MyRecycleBinItems"

            描述="Adds a custom page to the 现场 Settings 是a to show items in the Recycle Bin which were deleted by the current user."

            范围="现场 " =""

            ="1.0.0.0">

      <元素清单>

        <元素清单 位置="elements.xml"/>

      </元素清单>

    </特征>


    在这种情况下,我们指定功能在网站集级别范围内,因此我们将修改网站集中的所有网站。

    最后,我们有我们的Elements文件,该文件指定此功能所包含的内容。在这种情况下,关键是使用CustomAction元素-可用于在SharePoint中的某处添加链接(即动作)。

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

      <HideCustomAction ID ="HideDeletedItems"

                        HideActionId="删除的项目"

                        群组编号="现场 CollectionAdmin"

                        Location="Microsoft.SharePoint.SiteSettings" />

      <CustomAction ID ="MyDeletedItems"

                    群组编号="现场 CollectionAdmin"

                    位置="Microsoft.SharePoint.SiteSettings"

                    顺序="10"

                    标题="我的回收站物品"

                    权利="ManageWeb,BrowseUserInfo">

        < 网址 Action 网址 ="_layouts / custom / MyRecycleBinItems.aspx" />

      </CustomAction>

    </元素>


    让我们详细浏览该文件。您注意到的第一件事是我们正在使用'HideCustomAction'元素。您猜对了,它用于隐藏SharePoint UI中的链接。由于我们实际上是在替换链接,因此我们实际上 需要隐藏原始元素并提供我们的替换元素,这是通过将这两个元素一起使用来完成的。我们自己分配ID(如果我们想在其他地方引用此“ HideCustomAction”,则将使用此值),但是此标记的所有其他属性 必须与Microsoft为将链接添加到SharePoint而创建的功能中为此操作指定的内容相对应 首先。因此,以防万一,您还可以使用功能来实现SharePoint中的许多原始功能。查找这些值的方法是在12 \ Template \ 特征s文件夹中搜索。对于此特定操作,最可靠的搜索内容是页面的URL,因为任何“ CustomAction”标签都指定了URL。由于我们可以发现原始回收站页面的URL是'/_layouts/AdminRecycleBin.aspx',因此搜索该文件将找到包含原始链接详细信息的文件。然后将它们用于我们的“ HideCustomAction”标签。

    Next we specify 我们的 'CustomAction' tag, again using many of the same values since we 是 replacing an existing action rather than adding a new one. The values we change 是 for the link title 和 URL, to point to 我们的 replacement page. Note also you can declaratively specify what permissions levels 是 required to see this link.

    Once these files 是 made into a 解 package, deploying the 解 和 activating the 特征 has the following effects:

    网站设置页面上的链接已从原始链接(左侧)更改为我们的替换链接(右侧):


     在“ 12 \ Layouts”目录中创建了一个“自定义”文件夹,并且我们的自定义.aspx页(MyRecycleBinItems.aspx)已部署到该文件夹​​。当然,当用户单击链接时,修改后的页面具有仅显示他们已删除的项目的功能:



    The key thing of course, 是 that we've 'customized 的SharePoint functionality' without modifying any 要么 iginal 的SharePoint files - hence we 是 是 100% supported 和 can be confident 我们的 customizations won't cause any 是 sues for service packs etc.

    在同一行上,示例内容包含第二个示例-在这里,我们修改Central Admin中的“创建网站集”页面,以向SharePoint管理员显示指导消息。这样做的目的是鼓励他们停下来思考,甚至​​可以参考包含组织创建网站集政策的文档:


    Hopefully you might find this useful if you need to customize 的SharePoint in this way. The full set of files, plus the slides for the 当下ation I gave on this, 是 available 在 :

    http://sharepointchris.googlepages.com/customizingsharepointsupportedway

    In the next post, I'll be supplying some reference information which will help you make this type of modification in 其他 是as of 的SharePoint. An important aspect of 定制 的SharePoint in this way 是 knowing exactly where 和 how the 'CustomAction' tag can be used, so that's what we'll look 在 .

    2007年7月8日,星期日

    '自定义SharePoint受支持的方式'-幻灯片和示例代码现在可用

    The slides 和 code from my 当下ation 在 last week's UK 的SharePoint 用户组 meeting 是 now available - the topic 原为 '自定义SharePoint受支持的方式 - from 结束 user to admin interfaces'。幻灯片等将在某个时候出现在用户组网站上,但我也将其发布在:

    http://sharepointchris.googlepages.com/customizingsharepointsupportedway

    The 是as covered 是:

    • 创建网站定义(以及为什么即使对于创建的网站/网站数量有限的WCM场景,也可能是个好主意)
    • how to modify the site admin 和 中央管理员 是as of 的SharePoint, 无需修改任何附带的文件。我使用的示例(示例代码zip文件包含这些示例的所有代码/功能)是:

      -修改回收站以仅显示当前用户删除的文件

      -修改中央管理员中的“创建网站集”页面,以向服务器场管理员显示策略消息

    • using the 委托控制 to override the user controls used such as the 'My sites' link 和 the publishing console. (This assumes either default.master 是 being used 要么 you have added the controls to your 主 page/page layout using <的SharePoint:DelegateControl 暴动="服务器" 控制Id="MyControlID / >)。更多详细信息 我的DelegateControl帖子.

    Since the slide deck alone doesn't really convey the entire process, the next post will cover modifying the admin 是as of 的SharePoint in detail. Included will be the list of 是as where you can add/change links, 和 how to use a <CustomAction />功能中的说明来执行此操作。

    如果您需要对SharePoint功能进行自定义,则此技术背后的想法是在不更改核心文件的情况下进行更改,从而使SharePoint安装处于不受支持的状态。如果您需要进行此类更改,这非常重要!

    2007年7月4日,星期三

    使用功能部署SharePoint文件时的注意事项-幻影/虚假主机

    在之前的一些文章中,我谈到了如何将各种SharePoint工件部署为功能。特别是, 'Deploying 主 pages 和 页面布局 as a 特征讨论了部署这些类型的文件的想法(用于发布网站),但是该概念适用于将出现在某种SharePoint列表中某处的任何文件。除了“母版页库”之外,其他示例还包括将CSS / XSLT文件部署到样式库,将图像部署到图片库以及许多其他类似情况。

    有时,使用这种方法的人会发现文件更新可能很难应用。该过程涉及使用文件的新版本更新功能,然后重新安装并重新激活功能(通常,功能版本号会增加)。在某些情况下,文件更新成功,而在其他情况下,文件更新没有成功,但是没有错误。

    发生什么了?

    答案是,如果该文件已被“删除”,则该文件将不会被更新(因此,例如在浏览器中不会看到更改)。空灵的'放入数据库。

    <StartUnghosting说明>
    [无需过多讨论,对于这个概念的新手来说,这可能是一个令人困惑的术语,Microsoft如今使用的次数越来越少-替换术语是“定制的”,通常更容易理解。根据它们到达SharePoint的方式,许多文件最初只会存在于SharePoint前端Web服务器的文件系统上。但是,如果这样的文件是自定义的,例如它已签出并进行了编辑(通过UI,使用SharePoint Designer等)。SharePoint获取文件的副本(现已进行修改),并将其存储在内容数据库中,而不是将更改保存回文件系统中。这是取消宿主的过程。以后每当请求此文件时,都将返回数据库中的修改版本。此体系结构仅在绝对必要时才存储单独的文件副本,从而使SharePoint可以扩展到企业级。]
    <EndUnghosting说明>

    当使用功能在SharePoint中配置文件时,SharePoint会将文件复制到您指定的功能所在的位置,并将从该位置引用该文件。在许多情况下,它实际上可能是12 \ Template \ 特征s目录。因此,例如在母版页/页面布局等的情况下,当请求网页时,将从该位置检索这些资源。至少,如果未自定义文件,那就会发生这种情况。

    If the file has been customized 在 some point, what happens when the 特征 是 updated 是 that the file on the filesystem 是 updated 和 反映s the changes, but 的SharePoint 是 now returning the copy in the database 和 so the update 是 n't 反映ed on the site!

    因此,如果要使用功能作为SharePoint文档库(也称为“ GhostableInLibrary”)文件的持续部署策略,则应确保文件可以 只要 以这种方式进行修改。因此,不应通过SharePoint UI或SharePoint Designer修改文件。通常,在开发环境中不是这种情况,但可以在其他环境中强制实施。这意味着可以避免取消宿主,并且SharePoint将继续引用文件系统上的副本。

    其他注意事项:

    • 这种方法的另一个优点是,当收回解决方案时,文件也将被删除。
    • 即使没有实际更改的签入/签入操作也将导致SharePoint将文件视为自定义文件,然后从数据库而不是文件系统中检索文件。
    • 在SharePoint Designer中,可以通过右键单击文件并选择“还原为网站定义”来“取消自定义”文件。但是,这显然会导致您丢失对原始版本中文件所做的任何更改!

    So next time you 是 using a 特征 和 wondering why the file 是 n't being updated, consider if the file has been customized!

    2007年6月27日,星期三

    扩展内容查询Web部件

    我本来打算在Codeplex上放几个星期的东西是Content Query Web部件的扩展版本。这个特定的Web部件是许多SharePoint开发人员经常用于显示链接列表等的部件。但是,曾经使用它的任何人都可能会告诉您,他们第一次花了一个小时(或更长时间),想知道让控件显示以下内容:

    • 他们列表上的自定义列
    • 页面布局使用的内容类型上的自定义列(在WCM方案中)

    Since this doesn't happen 自动ally, it becomes apparent you have to tell the control the names of your custom fields. You might expect this to be exposed (like many 其他 things 是) by the control properties, but unfortunately it's not that simple. There 财产(CommonViewFields), 但是工具部分没有提供用于输入值的UI。这意味着只能通过更深入地挖掘并使用其.webpart文件更改CQWP的定义来提供该值。

    这涉及从使用Web部件的页面导出Web部件,修改 CommonViewFields XML中的元素,然后将.webpart文件重新导入到Web部件库中。然后可以将这个新定义添加到您的页面,然后您将获得正确的结果。

    嗯为什么它又不是控件上的属性?!

    So this 原为 the extension I 原为 going to implement. As it goes, 斋斋 击败了我,并提供了其他启动功能。下图显示,现在您所要做的就是在工具部分中输入字段名称:

    Ishai在这里写道 http://www.sharepoint-tips.com/2007/06/adding-custom-fields-to-enhanced.html。可以从以下网站下载他的“扩展内容查询Web部件” http://www.codeplex.com/ECQWP.

    如果您定期使用CQWP,绝对值得一看。

    2007年6月25日,星期一

    UK 的SharePoint 用户组 - 自定义SharePoint受支持的方式

    The UK 的SharePoint 用户组 是 meeting this Thursday (28th 六月 ) 在 the Microsoft campus in Reading. There 是 two sessions, one of which I'm 当下ing:

    支持的方式自定义MOSS– from 结束-user to admin interfaces

    的SharePoint开发人员应注意的关键概念之一是,通常不支持对核心出厂文件的修改。本课程探讨如何实现用户可能要求的自定义类型,而无需修改原始文件。涵盖的方面包括自定义网站定义,修改网站管理/中央管理区域以及更改SharePoint控制与DelegateControl体系结构一起使用的用户控件。该会话包含演示,还包含一些快速提示,这些提示是进行其他常见自定义的最佳方法的最佳方法,这些未在详细示例中显示。

    演讲者:克里斯·奥布莱恩

    ..并且:

    Groove:一种强大的协作工具,现已成为Office 07的一部分。

    在本次会议中,我们将回顾基本功能,然后使用最新的Microsoft模板(包括问题跟踪和文档审阅)展示Groove如何不仅是一种工具,而且是交付功能的平台。我们还将研究Groove和SharePoint如何有效地协同工作。

    演讲者:待定

    If you're in the 是a 和 would like to register, simply leave your name on the following thread over 在 the UK 用户组 site:

    http://suguk.org/forums/thread/3534.aspx

    I'll be posting my slides 和 sample code after the event. The 内容 on 定制 the site admin/central admin 是as will probably make it's way into separate posts for clarity.

    2007年6月20日,星期三

    使用委托控件

    When starting to build 苔藓 sites, many developers will start the page template development process by analyzing the shipped 主 pages 和 /or using the 'How to create a minimal 主 page' MSDN文章。尽管非常有用,但为简单起见,不幸的是,本文中的示例未包含SharePoint团队在default.master中实现的某些功能,特别是对页面加载控件使用委托控件。我认为这很遗憾,因为许多不花时间专门研究它的开发人员可能因此不知道Delegate 控制的强大功能。

    那是什么

    本质上,委托控件提供了一种替代方法,可以以常规方式将用户控件和服务器控件添加到.aspx页。通过这种方式,我的意思是通过从开发环境中的工具箱中拖动或通过手动添加适当的标记来将控件添加到页面。相反,使用Delegate 控制,我们要做的就是添加标记以实例化Delegate 控制实例,然后 使用功能 to specify separately which control should actually be loaded. What this effectively gives us 是 the ability to control what controls 是 used on a page without having to directly modify 和 redeploy 主 pages/page layouts. This extra level of abstraction can be quite powerful, since any 功能范围 可以与委托控件一起使用。我会回到这一点,但到目前为止还没有足够的理论。使用方法如下:

    首先,我们需要在页面上使用Delegate 控制声明。看起来像这样:

    <的SharePoint:DelegateControl 暴动="服务器" 控制Id="页头">

    </的SharePoint:DelegateControl>


    在此阶段,唯一需要注意的是ControlId属性-我们创建的功能将使用它来替代实际的用户/服务器控件。

    然后,我们有了feature.xml文件,在其中指定功能详细信息(包括作用域):

    <特征 XML文件 ns="http://schemas.microsoft.com/sharepoint/" ID ="373042ED-718D-46e2-9596-50379DA4D522"

    标题="COB.Demos.DelegateControls"

    描述="Specifies which user control should be used for the 'PageHeader' 委托控制 used on the site 主 page. The replacement user control 是 stored in the CONTROLTEMPLATES目录。" 范围=" 农场 "

    =""

    ="1.0.0.0">

    <元素清单>

    <元素清单 位置="elements.xml"/>

    </元素清单>

    </特征>


    As always, the 'instructions' for the feature 是 in the element manifest:

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

    <!-- 使用比默认值低100的序列号,以便加载我们的自定义控件 -->

    <控制 ID ="页头" 顺序="90" 控制Src="〜/ _ControlTemplates / COBPageHeader.ascx" />

    </元素>

    这是我们指定实际使用哪个控件的地方。除了指定路径外,关键的是'Sequence'属性包含的值比其他任何值都低 <控制> instructions for this control (i.e. ID of 'PageHeader'). This 是 especially important when we 是 overriding an existing Delegate 控制 created by Microsoft - here the default value 是 100 所以你的顺序 必须 低于此值即可加载您的控件。

    除了创建和激活此功能外,实际的.ascx文件还必须存在于指定的位置。可以将其手动复制到CONTROLTEMPLATES目录,但是更好的主意是将该功能包装为解决方案,因为解决方案包也可以部署文件。要将.ascx文件与解决方案一起部署,您的解决方案清单文件应类似于:

    < XML文件 ns="http://schemas.microsoft.com/sharepoint/" 解决方案编号="E8694626-60F8-4d07-9140-8F9F634020DE">

    <功能清单>

    <!-- 注意,这是cab文件中的位置! -->

    <特征Manifest 位置="COB.Demos.DelegateControls \ feature.xml" />

    </功能清单>

    <模板文件>

    <模板文件 位置="CONTROLTEMPLATES \ COBPageHeader.ascx" />

    </模板文件>

    </>

    现在,这些文件都将通过makecab.exe以通常的方式打包为解决方案(.wsp)。部署解决方案后,文件将被复制到服务器场中所有Web前端的正确位置,并且激活该功能后,SharePoint将知道从此以后应使用以下任何委托控件加载“ COBPageHeader.ascx” ID 为“ 页头”。

    那有什么好呢?

    好吧,有两件事:-

    • 现在,我可以覆盖页面应加载的控件,而无需返回,编辑模板并重新部署
    • By using a 功能范围d 在 'Web', I can effectively use a different page header for different 是as of my site without requiring different templates 要么 code. (Note I've not tested this extensively, but since the <控制> 元素可以在范围Web,站点,WebApplication或Farm中使用,这应该是完全可行的。)
    • 我可以使用任何标准的.Net用户控件或服务器控件,因此对于熟悉Jan Tielen的SmartPart的任何人,它都提供类似的功能。

    在功能方面,我还要强调两点:

    • 可以通过页面上的声明将参数传递给控件。要阅读这些内容,控件的实现应在控件树上遍历以获取值。一个例子是:
    • <的SharePoint:DelegateControl 暴动="服务器"

      控制Id="页头" MyParam="我的价值">

      </的SharePoint:DelegateControl>

    • 通过增加 允许多人="真正 " 在声明中,您可以使Delegate 控制加载多个用户/服务器控件。
    • 如前面提到的, many of the controls used on default.master 是 loaded using the Delegate 控制. These include global links such as My 现场 /My Links 和 the publishing console. So using this approach, 定制 the publishing console 是 a simple matter of providing a replacement .ascx 和 creating a feature as described here!

    Hopefully this has given some insight as to why you should consider using it on your templates. As a final thought, how about combining with a web part so that you can simply re-use existing ASP.Net user/server controls as 网页部分?

    2007年6月12日,星期二

    It's 6pm - where 是 your virtual machines?

    I mentioned last time that I'd share a couple more of my 的SharePoint-related highlights from Tech Ed. On a general note, despite the fact this 原为n't my first Tech Ed I'm still amazed 在 the scale - 一种n estimated 14,000 people in total apparently. Incredible when you think the team can feed 14,000 people in one hour in one room! As my colleague remarked, even Jesus 只要 managed 5,000 ;-)

    无论如何,我上次没有提到的事情:


    虚拟机管理器

    -Microsoft增强了有关使用虚拟机管理器 2007(System Center系列的一部分)管理虚拟机的故事。我知道其他产品具有很多此功能,但让我们面对现实吧,因为对于我们许多人来说,目前对虚拟机的管理已扩展到Virtual Server 2005管理网站。我喜欢的一些东西是:

    • 包括元数据的虚拟机的“库”-包括具有可用作构建模块的模板机的设施
    • 快速的“物理到虚拟”转换
    • Intelligent Placement tool - 一种nalyzes 所有 your physical hardware you have 所有 ocated to virtual machines 和 provides a 建议 关于在何处放置新VM。这基于它收集的信息(硬件分析等),但是可以对参数进行加权,例如处理器,内存,磁盘空间等。
    • 可以从物理设备中委派VM的启动(等)功能,而无需授予他们对物理机的远程访问权限或其他VM管理功能


    的SharePoint开发思路

    -在其他方面,我对SharePoint开发有一个有趣(准确的感觉)角度-虽然当前的开发人员经验通常很痛苦,但这与 工具 而不是 平台. 泰德·帕蒂森 谈到在开始SharePoint开发的.Net开发人员中经常出现的“拒绝,愤怒,接受”周期。另一方面,SharePoint 2003开发人员认为,相比之下,一切都很顺利;-)请记住,在.Net世界中,该工具(Visual Studio)是与平台(.Net)并行开发和发行的。在SharePoint 2007世界中,由于某种原因(可能有与Office客户端应用程序同时发布的压力)并非如此,因此这些工具可能比客户端落后了18个月。因此,很可能有一段时间,您会回过头来嘲笑没有使用MS开发的工具来生成功能文件/解决方案包的想法。


    -使用来自以下位置的DataView Web部件的一些有趣示例 达斯汀·米勒。仅此一项就可以使您在SharePoint中构建复合应用程序很长的路要走。大多数SharePoint开发人员已经开始采用这种想法(使用WSS作为开发平台,而不是在ASP.Net中从头开始构建),但是对于许多相当简单的应用程序来说,这可能是未来。一些功能包括:-

    • 显示来自SQL,XML或Web服务的数据
    • 无需代码即可连接完全不同的数据源(至少需要一个字符串值[或其他“可连接”类型”进行连接)
    • 实施内联编辑(la DataGrid)
    • 执行条件格式(如果x == 1则显示a,否则显示b)
    • Use in a connected way with 其他 网页部分

    ..全部没有代码。确实很酷。请注意,控件使用XSLT渲染,也可以对其进行自定义以获取所需的输出。同样令人印象深刻的是,SPD实际上允许在设计视图中进行渲染的在线编辑,并提供迷你向导来帮助进行条件格式化,从而提供了帮助。然后由该工具编写基础XSLT。

    所以不是 所有 对SharePoint开发不利;-)

    2007年6月6日,星期三

    技术教育上的SharePoint内容

    这周在奥兰多的一些不错的SharePoint内容,这很好,这完全是我在这里的原因;-)以为我会讲一些我所听到的吸引我注意的事情:-

    • 更新 虚拟服务 解决了我和其他人遇到的一些问题,特别是在某些情况下它不够灵活。下一版本将允许在打包到.wsp文件之前编辑生成的文件(manifest.xml,功能部件和元素定义)。这将允许您添加功能接收器定义或修改生成的XML。 CTP将于7月上市。
    • 聆听MS在其内部MOSS部署中的经验,该经验被认为是世界上最大的。 d'ya如何管理在130个Web前端上运行的134,000个网站集?
    • 有关SharePoint部署的非常有趣的“参与”会话(请参阅我的 功能与内容部署后) 被带领 安德鲁·康奈尔. This 是 an 是a of 的SharePoint close to my heart (though I'm by no means saying I have 所有 the answers) so it 原为 good to have a beer afterwards with Andrew 和 continue the discussion. I'll be writing about this more soon.

    总的来说,很高兴看到许多SharePoint专家在这里讲话。即将对SharePoint实施者有用的信息的完整摘要:-)

    2007年5月30日,星期三

    装订功能

    One aspect of 特征 I wanted to cover quickly 是 the relationship 的SharePoint 特征s have with 网站定义. 现场 definitions 是 created by a developer 和 subsequently 被...使用 site owners to create new sites. Much of this facility 是 also available by the 'Save site as template' functionality, though there 是 some minor differences. Additionally the 'Save site as template' functionality 是 removed on 的SharePoint publishing sites (or 在 least the link in 现场 Settings 是 via a HideCustomAction feature element), due I think, to some site information/functionality which 的SharePoint cannot properly save into a .stp file. So developers often create 网站定义 as part of their customization, 和 it's a process well-documented in the WSS SDK.

    If you have created a site definition, there 是 several ways of using 特征 with it. These 是:-

    1. 根据定义创建站点,然后将功能部件部署到该站点。
    2. 在使用功能定义创建网站之前,请将其包括在网站定义(onet.xml)中。
    3. 使用功能装订将功能与网站定义相关联。

    由于第一个选项并未真正将功能与网站定义相关联,因此我们将重点介绍选项2和3。

    2.在网站定义中包含功能

    This option should be used if the site definition has not yet been deployed, 和 no sites have yet been created from it. The section of the onet.xml file where 特征 是 associated with the site definition contains may look something like:

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

        <网站功能>

            <特征 ID ="C85E5759-F323-4EFB-B548-443D2216EFB5" />

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

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

        </网站功能>

        <Web功能>

            <特征 ID ="00BFEA71-DE22-43B2-A848-C05709900100" />

            <特征 ID ="00BFEA71-E717-4E80-AA17-D0C71B360101" />

        </Web功能>

        <模组>

            <模组 名称 ="" />

        </模组>

    </组态>


    ID 值当然是功能GUID。 网站功能元素包含在使用网站定义创建网站集时应激活的功能,而WebFeatures元素包含在使用定义在网站集内创建标准网站时的功能。

    3.使用功能装订将功能与网站定义相关联

    This option should be used when the site definition 是 already in use (and sites have been created). This 是 because there 是 risks in modifying a site definition once it has been deployed, since the site definition files on the filesystem 是 used for pages which 是 ghosted (not modified).

    To use 特征装订, you first need the feature(s) you wish to link to the site definition - these should be created in the normal way. The, you should create a 2nd feature which does the actual stapling. Sample values for the various files 是 shown below:

    The manifest.xml file if you 是 wrapping your feature in a solution:

    <? XML文件 ="1.0" 编码方式="utf-8"?>

    < XML文件 ns="http://schemas.microsoft.com/sharepoint/" 解决方案编号="26E1A1D9-7BB2-4e76-888E-B20184B16E3B">

      <功能清单>

        <特征Manifest 位置="COB.Demos.FeatureStapling \ feature.xml" />

      </功能清单>

    </>

    定义功能“标题”信息的feature.xml文件:

    <? XML文件 ="1.0" 编码方式="utf-8" ?>

    <特征 ID ="4AF9999A-0517-4224-9ED3-D2F9F87D92E2"

            标题="COB.Demos.FeatureStapling"

            描述="Staples a set of 特征 to custom 网站定义. The 特征/site definitions 是 defined in stapling.xml."

            ="1.0.0.0"

            范围=" 农场 "

            =""

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

      <元素清单>

        <元素清单 位置="stapling.xml" />

    </元素清单>

    </特征>


    最后,stapling.xml文件中的核心功能定义:

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

      <特征SiteTemplateAssociation ID ="F6924D36-2FA8-4f0b-B16D-06B7250180FA" 模板名称="MySiteDefName#0" />

      <特征SiteTemplateAssociation ID ="94C94CA6-B32F-4da9-A9E3-1F3D343D7ECB" 模板名称="MySiteDefName#0" />

      <特征SiteTemplateAssociation ID ="02464C6A-9D07-4F30-BA04-E9035CF54392" 模板名称="MySiteDefName#0" />

    </元素>



    特征SiteTemplateAssociation元素将功能GUID映射到站点定义-请注意,TemplateName属性值的格式为<SiteDefName>#<ConfigurationID>。显然,这提供了一定程度的灵活性,并允许您使用站点定义的不同配置来做相当复杂的事情。

    最后要注意的是,特征装订不会影响已经从站点定义创建的任何站点,只会影响后续站点。唯一的方法是在站点上单独激活功能,尽管显然,STSADM脚本可以帮助您针对多个站点激活多个功能。


    2007年5月22日,星期二

    的SharePoint部署选项:功能还是内容部署?

    [更新07/05/07-在此明确重点放在WCM网站上,并在结论上添加了更多详细信息]

    Today I want to document some of my thoughts on 部署 in 苔藓 - this article 是 intended to provide a starting point for analysis of the different ways to deploy 的SharePoint artifacts between environments, particularly with regards to WCM sites rather than team/collaboration scenarios. At a high level, the options 是:

    • 创建工件作为特征/解决方案
    • 使用SharePoint的内容部署框架
    • 在每个环境中手动重新创建工件

    Interestingly, the message from Microsoft 和 其他 respected sources 原为 initially that 特征/solutions 原为 the way to go. This seems to have changed recently with Microsoft's white paper on 的SharePoint中基于团队的开发。我建议您仔细阅读本文,但摘要是:

    • an authoring environment 是 provided where developers will create artifacts such as lists, site columns, 内容 types, 主 pages etc. directly (N.B. this 是 probably the same environment where your client does 内容 authoring using approved 主 pages/page layouts)
    • artifacts 是 created directly using the 的SharePoint UI 和 SPD rather than using 特征
    • 应使用SharePoint解决方案将程序集部署到此环境(和最终生产环境)中,以利用解决方案框架的能力将其一步部署到多个WFE
    • Content Deployment用于将所有内容(程序集和配置设置除外,请参见上文)获取到生产环境
    • alternatively, the authoring environment can be the production environment if required - use 版ing/content approval to control what the 结束-user site consists of (I recommend having separate environments - I think this 是 preferable to developing 主 pages/page layouts in production)

    完成了创建具有功能的整个网站的过程后,我可以理解为什么指南将避免使用这种技术来简化一些事情。从本质上讲,我认为功能开发的复杂性/开销无法适用于所有MOSS项目,这需要太多的工作。另外,正如我之前指出的那样,更新文件存在一些问题,这些文件最初是使用原始功能之一进行配置的。但是,我也看到了白皮书中建议的方法的一些局限性:

    • the integration environment doesn't make too much sense when you consider that some of the code being developed may require the 的SharePoint artifacts (site columns, lists etc.) to be 当下. If they 是 not created until the authoring environment, this type of code will fail/cannot be tested here.
    • 部署 process effectively means that full integration happens fairly late in the process. The authoring environment 是 the first environment where 所有 code 和 artifacts will be 当下, 和 this 是 just one step away from production. In comparison to an architecture which consists of dev/QA/staging (UAT)/production environments, 和 thus has more than one opportunity to test integration 和 部署, this may pose extra risk.
    • 一种更少的测试环境。与上一点一样,某些组织使用内部质量检查环境进行测试,然后使用单独的环境进行客户端UAT。

    额外的环境可以解决其中的一些问题,但这确实意味着要处理更多的内容部署工作,而且这并不总是那么简单。

    Despite this, my thinking 是 that the optimum 部署 strategy for a WCM site makes use of both 内容部署 和 solutions/features. The former 是 used to deploy most 的SharePoint artifacts (including 主 pages, layouts etc.), but the latter 是 used for assets which 是 mainly based on the filesystem:-

    • 组件
    • Web部件定义(尽管它们在数据库中)
    • 配置设置
    • 网站定义(包括功能装订)
    • 委托控件

    (我将在即将发表的文章中处理最后2个项目)。

    我认为这是最好的,因为功能框架特别适合 供应, 但对于正在进行的网站管理而言却不太理想。这就是为什么WCM站点和团队站点之间有所区别的原因。在团队站点中,最初为站点提供了一组功能和默认内容,然后,正在进行的管理实际上仅限于开发新的功能(因此功能很适合此要求),并且用户添加了内容/文档。 WCM网站通常需要非常仔细的功能(和内容)生命周期管理,并且 我认为功能框架不能很好地满足此要求。

    特别欢迎对此主题发表评论!