如何动态切换SharePoint发布页面的页面布局和母版页?

时间:2009-06-11 15:06:20

标签: sharepoint sharepoint-2007 publishing wcm

为了改善SharePoint WCM发布页面的编辑和显示体验,我希望能够在编辑模式下切换到一组特殊的Masterpage / PageLayout。

所以在/ _catalogs / masterpage中我希望:

MyMasterpage.master - 显示模式的母版页 MyMasterpage-edit.master - 编辑模式的母版页,仅在可用时使用 MyPageLayout.aspx - 用于显示模式的pagelayout MyPageLayout-edit.aspx - 编辑模式的页面布局,仅在可用时使用

当我在Pages库中创建一个新的发布页面时,我选择了MyPageLayout页面布局。

在渲染页面时,我想检测我是否处于编辑显示模式,就像服务器控件一样。此控件执行以下代码以确定呈现模式:

private void calculateShouldRender()
{
    SPControlMode contextualFormModeFromPostedForm = ConsoleUtilities.GetContextualFormModeFromPostedForm();
    if ((SPControlMode.Display == contextualFormModeFromPostedForm) && (PageDisplayMode.Display == this.PageDisplayMode))
    {
        this.shouldRender = true;
    }
    else if ((SPControlMode.Edit == contextualFormModeFromPostedForm) && (PageDisplayMode.Edit == this.PageDisplayMode))
    {
        this.shouldRender = true;
    }
    else
    {
        this.shouldRender = false;
    }
    this.Visible = this.shouldRender;
}

如果渲染模式为编辑,我想切换到MyMasterpage-edit.master materpage和MyPageLayout-edit.aspx页面布局。

我可以在由服务器控件控制的母版页和页面布局中进行大转换,但我想分割可靠性。 SharePoint Analist可以创建最佳的编辑模式页面,前端开发人员可以创建干净漂亮的显示模式页面,而不会造成任何编辑混乱。

关于如何实现这一目标的任何想法?主页切换似乎不是问题,我曾经写过blogpost。困难的事情似乎是页面布局的切换。

6 个答案:

答案 0 :(得分:1)

我认为如果你继续沿着这条路走下去,你会与SharePoint作斗争,我担心它也会成为一种支持噩梦,因为问题就变得不那么清楚,或者记得在两者中都做出改变(或者全部四个!)什么东西更新的地方。

您可以根据页面的编辑模式显示或隐藏控件,以便向用户显示的内容完全不同,但页面的所有代码仍然在一个位置。

调查editmodepanel。

<publishingwebcontrols:editmodepanel ID="Editmodepanel1" runat="server">
   <link id="Link2" rel=Stylesheet href="<% $SPUrl:~sitecollection/EditMode.css %>" runat="server" type="text/css" />
</publishingwebcontrols:editmodepanel>

我意识到这并不是你提出的要求......但是我觉得与SharePoint战斗是一场失败的战斗,你只需要用它的'方式'。

答案 1 :(得分:1)

我曾经写过一个功能来根据不同的标准切换页面布局。不同之处在于,页面布局在网站创建期间更改,而不是在查看或编辑模式下。更改页面布局的代码如下:

    private void SetPageLayout(SPWeb web, string pageName, string pageLayoutName)
    {
        PageLayout layout = null;
        PublishingPage page = null;
        SPFile pageFile = null;
        bool checkedOut = false;

        try
        {
            PublishingWeb publishWeb = PublishingWeb.GetPublishingWeb(web);
            // verify that the requested pageLayout is available
            foreach (PageLayout pl in publishWeb.GetAvailablePageLayouts())
            {
                if (pl.Name.Equals(pageLayoutName, StringComparison.OrdinalIgnoreCase))
                {
                    layout = pl;
                    break;
                }
            }
            // got my layout
            if (layout != null)
            {
                page = null;
                foreach (PublishingPage pubPage in publishWeb.GetPublishingPages())
                {
                    if (pageName == pubPage.Name)
                    {
                        page = pubPage;
                        break;
                    }
                }
                // got my page
                if (page != null)
                {
                    pageFile = page.ListItem.File;

                    page.CheckOut();
                    checkedOut = true;

                    page.Layout = layout;
                    page.Update();

                    page.CheckIn("changed the page-layout to " + pageLayoutName);
                    checkedOut = false;

                    pageFile.Publish("");
                    // If required, approve the page
                    try
                    {
                        pageFile.Approve(string.Empty);
                    }
                    catch
                    {
                        // Page doesn't need to be approved
                    }
                }
            }
        }

答案 2 :(得分:0)

我的文字对于评论框来说太长了,所以我回答Aiden就好像这是一个答案,但我的问题仍然存在!

嗨Aidan,我将SharePoint视为一个可以构建解决方案的平台。我认为微软在平台上构建的WCM解决方案很薄弱。我知道我的方式不是直接采用SharePoint标准方式,但标准方式不起作用。结合编辑和显示模式导致(选择你的选择): - 标准的SharePoint发布网站,它们看起来很相似,但在编辑模式下工作正常 - 一个非常可编辑但外观非常基本的网站 - 在显示模式下看起来很棒的网站,几乎不可能编辑 我们在显示模式下需要的样式表与MOSS WCM样式表之间存在很多冲突。我们确实编写了各种补偿样式表以使其正常工作,但这是一个痛苦的***。在页面中使用样式注入代码以使编辑成为可能是一个主要缺陷,这应该完全在您正在编辑的页面之外完成。例如,在iframe中,可以在您正在编辑的页面顶部显示为浮动窗口。但这种情况并非如此。然后,当你在页面上有标签或手风琴控件时,我甚至没有提到你遇到的问题。

我们的目标是真正具有互动性的Web 2.0网站,其中必须完成大量内容管理。以SharePoint方式直接获取编辑模式不起作用。

最佳编辑体验是关键。那么为什么不使用优化的母版页和pagelayout进行编辑,以便以清晰一致的方式访问所有可编辑元素。但是你仍然需要显示模式。这可以使用仅使用SharePoint中生成的数据的完整单独站点来完成。这可以是一个ASP.NET站点,或者如果你想完全控制html MVC可以使用。我不这样做,因为它在导航,安全性,控件重用,Web部件的使用等方面有很多含义。

如果使用针对编辑进行了优化的母版页/ pagelayout,我认为你可以获得两个世界的最佳效果,另外两个母版页/ pagelayout仅用于在pagelayout中使用最少的代码集进行显示。

所以......请保持答案!

答案 3 :(得分:0)

当然这需要继承Microsoft.SharePoint.Publishing.PublishingLayoutPage并使用它来呈现实际的PublishingLayoutPage的内容,具体取决于“编辑模式”。

如何更改母版页... ek。

答案 4 :(得分:0)

尝试再次将SharePoint弯曲到您的意愿? ;)

我感觉到你的痛苦。我正在使用两种方法来获得类似的行为:

一个容器控件,用于条件渲染部分页面,我想像你建议的那样。最初,当某个字段具有特定值时,我需要它来隐藏页面的某些部分,因此没有呈现html。见wrapper controls。 控件本身非常简单,它的类需要一个[ParseChildren(false)],如果不满足条件,render方法不会调用基础渲染。 您可以扩展它以向编辑器和设计者显示完全不同的页面,尽管它们仍然存在于同一页面中。我想你可以去除分析师使用的部分,并把它放在自己的用户控件中,但这不是很容易维护。

其次,表单页面,例如“/Pages/Forms/EditForm.aspx?ID=1”,提供了发布页面上所有字段的清晰视图..没有设计可以阻碍。 (我在所有页面布局上使用一个控件,提供对此页面库和当前页面库的单击访问,并显示所使用的内容类型和页面布局。在构建WCM站点时非常有用。)

答案 5 :(得分:0)

这个问题的最终答案现在被“烘焙”到我们称之为DualLayout for SharePoint的产品中!我们的方法解决了所有SharePoint WCM设计的噩梦:

  • 除了WCM编辑和显示视图
  • 之外,还为最终用户引入了其他视图
  • 永远不要在SharePoint样式和您自己的样式之间发生冲突
  • 制作精益和意味着“查看”主页和页面布局,不会干扰WCM母版页和页面布局
  • 为最终用户制作超轻页面,删除所有特定于SharePoint的页面混乱
  • 提高页面的性能,因为我们只有一组最小的控件要在最终用户视图中呈现

http://www.macaw.nl/Het+Bedrijf/Producten/Macaw+DualLayout+for+SharePoint.aspx查看,请参阅该页面博客论文中的博文,了解详细背景信息。