显示带有标签的帖子 母版页. 显示所有帖子
显示带有标签的帖子 母版页. 显示所有帖子

2007年11月1日,星期四

母版页/页面布局部署为功能未更新

以来 将母版页和页面布局部署为功能 一直是该博客上评论次数最多的文章,而且一些张贴者似乎也遇到了同样的问题,我想写一篇简短的文章,其中提供一些我的经验信息。

因此,这是一个非标准的帖子,如果不影响您,请随时进行调整;-)

无论如何,我决定再做一些测试,看我是不是做错了什么,或者我做的事情是否与遇到问题的人不同。我的测试基本上是使用母版页和页面布局(通常与自定义内容类型相关联)建立一个发布站点,然后进行更新过程。这是我发现的:

  • 对文件(位于12文件夹外部)进行更新,然后XCOPYing这些文件以覆盖12 \ TEMPLATE \ 特征 \ MyFeature \目录中的文件,则成功更新了站点。 无需停用/激活功能。
  • 用一个 解决方案包 部署文件(使用功能时,这通常是我在服务器场环境中所做的事情)- 当我升级解决方案(stsadm -o upgradesolution)时,这再次正确更新了站点。这是可以预料的,因为在下面发生的事情与先前的测试完全相同。 (但是,我还注意到,即使解决方案升级完成后,目录有时也会消失,或者存在,但仍被另一个进程锁定,这意味着即使在Windows资源管理器中也无法访问文件-这有点恼人,但运行解决方案再次升级始终成功。)
  • 在导致对文件进行自定义(例如修改或什至只是使用SPD签出)后,通过功能/解决方案对文件进行的任何后续更新 出现在网站上(尽管可以在SPD中进行进一步的更新)。

简而言之,这就是我所期望的。假设尚未自定义文件,则任何更新文件系统上副本的内容都会导致对该站点的更新。如果它 具有 如果已经过自定义,则不会对文件系统进行更新(因为该文件现已添加到内容数据库中,并且不再使用文件系统版本)。如果您以前没有遇到过, 使用功能部署SharePoint文件时的注意事项-幻影/虚假主机 可能会有所帮助。

因此,我猜测如果覆盖Feature文件时母版页等没有更新,那是因为文件已经以某种方式进行了自定义。不幸的是,要发布文件并不容易-对于其他文件,SharePoint Designer在资源管理器视图中的文件旁边提供了一个方便的蓝点(如果已自定义文件),但是对于母版页/页面布局,这种情况不会发生。可以在下面的AllItems.aspx文件旁边看到蓝点(单击放大):



不幸的是,这也意味着恢复到文件系统上的文件也不是一件容易的事(我们不能像其他SharePoint文件一样,右键单击SPD中的文件并选择“重置为网站定义”)。因此,如果您确实想保留文件系统中引用的页面布局(例如,因为性能至关重要),但这会很麻烦,但是您最终处于这种状态。不过,可以使用API​​还原文件。我不需要自己执行此操作,但是要检查的属性是 SPFile.CustomizedPageStatus 如果返回 SPCustomizedPageStatus.Customized,然后 SPFile.RevertContentStream() 可以使用方法-这将导致SharePoint从今以后使用文件系统上的版本(尽管 请注意,您可能会丢失一些已进行的更新 after the file was 取消托管(自定义)-还原后,您需要将它们重新应用到文件系统文件。请记住,请勿为此使用SPD,否则您将回到开始的地方!)

到目前为止,(合理地)简单明了。

但是,一个海报(代尔彭特)有一个 interesting question about updating 页面布局 with 网页部分. As far as I can see, updating all page 实例s to have 网页部分 在Web部件区域 通过更新布局将是不可能的。这是因为如果使用Web部件区域,则Web部件与页面相关联 实例 而不是页面布局。确实,这可以成为体系结构的力量。它 可能会:

  • have default 网页部分 added to a zone when a page 实例 是 created from a page layout. This can be done by deploying the page layout 用一个 Feature, and using the AllUsersWebPart 标签。但是,这不会影响已经创建的页面。
  • add 网页部分 to all the pages by adding them directly to the page markup in SPD, rather than in a zone. Of course, this then means the settings for the web part can only be modified by the page designer in SPD, rather than site users.
  • 使用API​​遍历站点中的所有页面,以使用SPFile.GetLimitedWebPartManager()添加/修改Web部件。不用说,这是一种需要在生产中进行大量维护和计划的操作!

如前所述,由于这些问题,Web部件区域体系结构通常不是WCM网站开发等方案的最佳选择,因为在这里我们希望所做的更改能够应用于使用布局的所有页面。

希望这已经有用。与往常一样,如果您与此处详细介绍的经验有所不同,请发表评论,我一定很想听听。

[我也想对原始帖子的评论者(以及其他我一直反应缓慢的评论者)表示诚挚的歉意,因为我花了几周的时间才回来。与我的项目同时上线和搬家有关,希望现在可以恢复正常服务 ;-) ]

2007年9月9日,星期日

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

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

  • 网站具有完全定制的外观/导航
  • 用户将使用存储在文档库中的文件
  • 网站模板或定义用于创建具有相同内容/功能的多个网站
  • 自定义工作流可能用于支持业务流程(标准内容发布除外),可能还支持InfoPath表单

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

 

母版页开发方法

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

  • 使用“最小主页面” MSDN 要么 希瑟·所罗门
  • 修改default.master的副本(自定义团队网站的良好起点)
  • 修改blueband.master的副本(WCM站点的良好起点)

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

这里还要考虑的其他问题是如何在母版页和页面布局之间考虑内容项责任的常见问题, 如何定义内容类型等, 但是这些是WCM网站开发中的标准决策,因此在此不做介绍。

 

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

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

此外,使用CEWP还存在一些URL修复问题 跨不同的环境,如 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 other 直接从SPD添加的方法,配置存储在页面的实际HTML标记中, 因此会随页面布局本身一起移动。

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

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

 

系统页面的外观

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

 

因此,这些是要考虑的一些问题。当然还有其他内容,包括导航, CSS customization 标准样式(到 ensure collaboration 网页部分 与您的外观完美融合), 以及可能选择的身份验证机制。我将在以后的文章中介绍这些内容以及所有其他内容。

2007年4月28日,星期六

部署母版页和页面布局为一项功能

这是我的系列文章中的第四篇,该系列文章如何创建常见的SharePoint网站工件作为功能。上次我们考虑将内容类型部署为功能。

现在,我们已经拥有内容类型和已部署的所有支持工件,我们可以集中精力部署对网站的工作方式产生真正影响的事物-主页和页面布局。我还将在即将发布的文章中介绍Web部件的部署。

基本前提是:

  • 使用SharePoint Designer(SPD)开发母版页/布局
  • 将每个文件保存到文件系统(而不是母版页库),准备添加到功能中。不幸的是,SPD在执行此操作时实际上会弄乱超链接和一些控件引用-特别是使用'〜/ _controltemplates /'路径对用户控件的引用。最好的解决方案是将最终文件的内容复制到记事本中,并将文件保存到同名文件系统中。
  • 创建功能的feature.xml和元素清单文件。文章结尾显示了一个元素清单文件的示例,该文件可部署2个母版页和3个页面布局。

让我们来谈谈下面示例中使用的值。在模块级别(要部署到SharePoint中特定位置的文件集合),我们指定URL以及文件应仅部署到根网站还是网站集中的所有网站。在文件级别,母版页的属性非常简单:

  • 'IgnoreIfAlreadyExists'-如果我们要覆盖此名称的现有文件,则应为true,否则为false。
  • 对于在文档库中存在的文件,例如在SharePoint发布站点中存在的页面,样式库或母版页库库,“类型”-应为“ GhostableInLibrary”。

对于页面布局,情况稍微复杂一些。在这里,我们需要指定以下内容:
  • “ ContentType”-指定文件是页面布局还是母版页。使用值'$ Resources:cmscore,contenttype_pagelayout_name;'以指定表示页面布局选项的SharePoint内部字符串。
  • 'PublishingPreviewImage'-创建页面时在列表框中选择此布局时要显示的URL可访问图像文件的路径。
  • 'PublishingAssociatedContentType'-在这里我们指定布局应与哪种内容类型相关联。这意味着布局将自动具有此绑定并且可以使用。 请注意,如果忽略此值,则默认情况下,您的布局将与发布功能中的基本“页面”内容类型相关联。这意味着您添加的任何自定义列将不可用。此属性的值应采用';#形式<Content type name>;#<Content type ID;#>。所以一个真实的例子是'; #Welcome Page;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4;#'。


以这种方式将文件部署到SharePoint的另一个有趣方面是,不可能(AFAIK)通过单独的功能“ B”更新从功能“ A”部署的文件。这很有意义,但是如果您要使用功能更新公用文件(例如itemStyle.xsl(由Content Query Web部件使用)),则会遇到麻烦。由于该文件最初是由PublishingResources功能而不是您的自定义功能配置的,因此无法使用。

我还看到了更新页面布局的问题,这些页面布局与通过UI而非功能创建的内容类型相关联。

因此,既然我们已经部署了列表,站点列,内容类型和母版页/页面布局,我们就可以使用这些布局创建页面并将内容添加到站点。

Next time I'll talk about options around deploying 网页部分.

这是前面提到的XML示例:

<?xml version="1.0" encoding="utf-8"?>
<elements xmlns="http://schemas.microsoft.com/sharepoint/">
<module name="MasterPagesModule" url="_catalogs/masterpage" rootwebonly="True" path="">
<file url="cScape.master" ignoreifalreadyexists="TRUE" type="GhostableInLibrary"></file>
<file url="accessible.master" ignoreifalreadyexists="TRUE" type="GhostableInLibrary"></file>
</module>
<module name="PageLayoutsModule" url="_catalogs/masterpage" rootwebonly="True" path="">
<file url="AdvancedSearchLayout.aspx" ignoreifalreadyexists="TRUE" type="GhostableInLibrary">
<property name="ContentType" value="$Resources:cmscore,contenttype_pagelayout_name;"></property>
<property name="PublishingPreviewImage" value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png"></property>
<property name="PublishingAssociatedContentType" value=";#Welcome Page;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4;#"></property>
</file>
<file url="HelplineHomeLayout.aspx" ignoreifalreadyexists="TRUE" type="GhostableInLibrary">
<property name="ContentType" value="$Resources:cmscore,contenttype_pagelayout_name;"></property>
<property name="PublishingPreviewImage" value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png"></property>
<property name="PublishingAssociatedContentType" value=";#RNIB Welcome;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4007AC2318FCE0E474eADE554A22E4B6135;#"></property>
</file>
<file url=" 家 Page.aspx" ignoreifalreadyexists="TRUE" type="GhostableInLibrary">
<property name="ContentType" value="$Resources:cmscore,contenttype_pagelayout_name;"></property>
<property name="PublishingPreviewImage" value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleLinks.png"></property>
<property name="PublishingAssociatedContentType" value=";#RNIB Welcome;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4007AC2318FCE0E474eADE554A22E4B6135;#"></property>
</file>
</elements>