【问题标题】:Sharepoint: How do I change the default page layout for newly created subsites?Sharepoint:如何更改新创建的子网站的默认页面布局?
【发布时间】:2011-05-10 14:05:45
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: sharepoint sharepoint-2010


    【解决方案1】:

    新创建的子网站的页面布局由网站定义确定。例如,如果您使用 Publishing Site with Workflow 模板创建子站点,则该站点是使用 14\TEMPLATE\SiteTemplates\BLANKINTERNET\XML\onet.xml 中的 Configuration 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 更改页面布局。

    【讨论】:

      【解决方案2】:

      您不需要部署自定义页面布局,但确实需要使用代码。我们解决此问题的方法是为 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();
      }
      

      【讨论】:

        【解决方案3】:

        如果网站上启用了发布功能,它应该很简单:

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

        【讨论】:

          【解决方案4】:

          似乎当您将发布子网站添加到 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);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-06
            • 1970-01-01
            • 2010-10-21
            相关资源
            最近更新 更多