在SharePoint中,文件的幽灵化(ghosting)是一种常见的技术,用于在不破坏现有内容引用的情况下更新页面布局或母版页。幽灵化文件是那些被SharePoint系统管理的文件,它们可以被轻松地更新或替换。然而,并非所有文件都可以被幽灵化,例如通过SharePoint Designer创建的文件。本文将介绍一种技巧,用于将非幽灵化文件转换为幽灵化版本,以及如何使用SharePoint Designer导出现有文件并将其添加到功能中。
幽灵化文件是指那些被SharePoint系统管理的文件,它们可以被轻松地更新或替换。幽灵化文件的一个关键特性是,它们可以被替换而不会破坏现有内容的引用。这使得它们成为更新SharePoint网站布局的理想选择。
非幽灵化文件是指那些不是由SharePoint系统管理的文件,它们不能被轻松地更新或替换。要将非幽灵化文件转换为幽灵化文件几乎是不可能的,除非直接修改内容数据库,这是不推荐的。一个替代方案是删除原始文件,并部署幽灵化版本以替代它。但是,这样做可能会遇到布局问题,因为现有内容可能仍然引用这些布局。
本文介绍的技巧可以克服这些问题,允许文件被无缝地替换为幽灵化版本。例如,将重新映射SharePoint发布模板中的ArticleLeft布局到一个通过示例功能部署的更新版本。这将改变幽灵化文件的位置,使其位于功能的位置,并允许通过升级新解决方案来部署ArticleLeft布局的后续更改。示例中在模板的页面标题中添加了单词"MODIFIED"。
首先,使用SharePoint Designer从SharePoint数据库中保存现有文件。然后,像第一次提供文件一样将其添加到功能中。对于布局,请确保还提供了原始文件的属性;否则,新布局将无法正确工作。
<?
xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Url="_catalogs/masterpage" Path="Layouts">
<File Url="ArticleLeft_Ghosted.aspx" Type="GhostableInLibrary" IgnoreIfAlreadyExists="true">
<Property Name="Title" Value="Modified Article page with image on left" />
<Property Name="MasterPageDescription" Value="The modified article page with image on left contains an image field and a rich text field." />
<Property Name="ContentType" Value="Page Layout" />
<Property Name="PublishingPreviewImage" Value="/_catalogs/masterpage/en-US/Preview Images/ArticleLeft.png, /_catalogs/masterpage/en-US/Preview Images/ArticleLeft.png" />
<Property Name="PublishingAssociatedContentType" Value=";#Article Page;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F200794813..." />
</File>
</Module>
</Elements>
接下来,重命名文件,以便最初可以将其部署在现有布局旁边。在示例中,文件被命名为ArticleLeft_Ghosted.aspx。
最后,添加一个功能接收器,使用以下代码覆盖目标文件与新的幽灵化版本。注意:此代码已简化以便于理解;请参阅示例以获取完整代码。
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite site = properties.Feature.Parent as SPSite;
PublishingWeb pubweb = PublishingWeb.GetPublishingWeb(site.RootWeb);
// get reference to newly provisioned file
SPFile file = site.RootWeb.GetFile("/_catalogs/masterpage/ArticleLeft_Ghosted.aspx");
if (file != null)
{
// overwrite the old layout with the ghosted version
file.MoveTo("/_catalogs/masterpage/ArticleLeft.aspx", true);
file.Update();
}
}