Sharepoint:如何更改新创建的子网站的默认页面布局?

时间:2010-11-16 02:03:29

标签: sharepoint sharepoint-2010

我正在开发一个拥有多个子网站的sharepoint 2010发布网站。我已经设置了一个自定义母版页和几个自定义页面布局。

我已经发现如何设置用于子网站中新创建的页面的默认页面布局(在/_Layouts/AreaTemplateSettings.aspx中找到),但我似乎无法弄清楚如何指定使用的默认页面布局在创建新的子网站时创建〜/ Pages / default.aspx。

现在它选择了WelcomeLinks.aspx,这不是我想要的。

仅当我通过代码部署自定义母版页/布局时,这是否可用?如果是,是否有人有任何好的示例?

感谢。

4 个答案:

答案 0 :(得分:4)

新创建的子网站的页面布局由网站定义决定。例如,如果使用带有工作流模板的发布站点创建子站点,则使用14 \ TEMPLATE \ SiteTemplates \ BLANKINTERNET \ XML \ onet.xml中的配置ID =“2”创建该站点。在该配置中是一个指向SubWebWelcome的模块部分:

<Module Name="SubWebWelcome" Url="$Resources:osrvcore,List_Pages_UrlName;" Path="">
    <File Url="default.aspx" Type="GhostableInLibrary" Level="Draft" >
        <Property Name="Title" Value="$Resources:cmscore,IPPT_HomeWelcomePage_Title;" />
        <Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/WelcomeLinks.aspx, $Resources:cmscore,PageLayout_WelcomeLinks_Title;" />
        <Property Name="ContentType" Value="$Resources:cmscore,contenttype_welcomepage_name;" />
    </File>
</Module>

如您所见,SubWebWelcome使用WelcomeLinks页面布局设置default.aspx。

如果您希望默认页面使用不同的页面布局,则有两个选项:

  1. 基于使用所需页面布局的BLANKINTERNET创建自定义网站定义。
  2. 继续使用开箱即用的网站定义,使用自定义代码(由功能装订或事件接收器启动),从WelcomeLinks更改页面布局。

答案 1 :(得分:3)

您不需要部署自定义页面布局,但需要使用代码。我们解决这个问题的方法是为WebProvisioned事件创建一个事件接收器,它将在创建一个新的SPWeb后触发。

您可以使用所需的页面布局更新新网站中的PublishingPage。这允许用户创建新的网页,但您可以设置每个新网站的默认页面布局。

这是事件接收者代码:

public override void WebProvisioned(SPWebEventProperties properties)
{
    try
    {
        if (PublishingWeb.IsPublishingWeb(properties.Web))
        {
            PublishingWeb curPubWeb = PublishingWeb.GetPublishingWeb(properties.Web);

            foreach (PageLayout curLayout in curPubWeb.GetAvailablePageLayouts())
            {
                if (curLayout.Name == "DefaultPageLayout.aspx")
                {
                    foreach (PublishingPage curPage in curPubWeb.GetPublishingPages())
                    {
                        curPage.CheckOut();
                        curPage.Layout = curLayout;
                        curPage.Update();
                        curPage.CheckIn("");
                    }
                    break;
                }
            }
        }
    }
    catch (Exception ex)
    {
        /* Handle exception here */
    }
}

这是注册事件接收器的代码(这可以在您的功能被激活时运行,也可以从PowerShell脚本或控制台应用程序运行一次):

using (SPSite topSite = new SPSite("[Site Collection URL]"))
{
    SPEventReceiverDefinition webEventDef = topSite.EventReceivers.Add();
    webEventDef.Name = "Web Adding Receiver";
    webEventDef.Synchronization = SPEventReceiverSynchronization.Synchronous;
    webEventDef.Type = SPEventReceiverType.WebProvisioned;
    webEventDef.SequenceNumber = 4001;
    webEventDef.Assembly = "MyCustomAssembly, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=123456789";
    webEventDef.Class = "MyCustomAssembly.CustomEvents";
    webEventDef.Data = "Adding publishingwebfeatures";
    webEventDef.Update();
}

答案 2 :(得分:1)

如果在网站上启用了发布功能,则应该像访问:

一样简单

网站设置,外观,欢迎页面和选择页面

答案 3 :(得分:0)

似乎当您将发布子网站添加到SharePoint时,它似乎不会继承父网站默认页面布局。更重要的是,即使您呼叫SetDefaultPageLayout传递true以重置所有子站点,此设置仍然不会坚持。

在构建我的整个站点结构(子网站)之后,我必须实现以下递归函数,以确保继承最顶层的默认页面布局,希望这有助于某人。

// Recursively update sub-webs to inherit the default page layout.
Action<PublishingWeb> updateWebRecursive = null;
updateWebRecursive = new Action<PublishingWeb>((parentWeb) =>
{
    PublishingWebCollection childWebs = parentWeb.GetPublishingWebs();
    if (!parentWeb.Web.IsRootWeb)
    {
        parentWeb.InheritDefaultPageLayout();
        parentWeb.Update();
    }
    foreach (PublishingWeb childWeb in childWebs)
    {
        updateWebRecursive(childWeb);
    }
});
updateWebRecursive(pubWeb);