Как динамически переключать PageLayout и MasterPage страницы публикации SharePoint? - PullRequest
1 голос
/ 11 июня 2009

Чтобы улучшить как редактирование, так и отображение страниц публикации SharePoint WCM, я бы хотел иметь возможность переключаться на специальный набор Masterpage / PageLayout в режиме редактирования.

Итак, в / _catalogs / masterpage я хочу иметь:

MyMasterpage.master - главная страница для режима отображения MyMasterpage-edit.master - мастер-страница для режима редактирования, используется только при наличии MyPageLayout.aspx - разметка страницы для режима отображения MyPageLayout-edit.aspx - разметка страницы для режима редактирования, используется только при наличии

Когда я создаю новую страницу публикации в библиотеке страниц, я выбираю макет страницы 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 и страницу MyPageLayout-edit.aspx.

Я мог бы сделать большой переход на главной странице и макете страницы, управляемых серверными элементами управления, но я хотел бы разделить обязанности. Аналитик SharePoint может создавать оптимальные страницы в режиме редактирования, а разработчик внешнего интерфейса может создавать чистые и красивые страницы в режиме отображения без всяких проблем с редактированием.

Есть идеи, как этого добиться? Переключение мастер-страниц не кажется проблемой, я однажды написал об этом blogpost . Трудной вещью кажется переключение разметки страницы.

Ответы [ 6 ]

1 голос
/ 22 июля 2009

Я однажды написал функцию переключения макетов страниц в зависимости от разных критериев. Разница была в том, что макет страницы изменялся во время создания сайта, а не в режиме просмотра или редактирования. Код для изменения макета страницы выглядит следующим образом:

    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
                    }
                }
            }
        }
1 голос
/ 11 июня 2009

Я думаю, что вы будете сражаться с SharePoint, если продолжите идти по этому пути, я боюсь, что это также станет чем-то вроде кошмара поддержки, так как становится менее понятно, где лежат проблемы, или не забывают вносить изменения в оба (или все четыре!) места, когда что-то обновляется.

У вас могут быть элементы управления, которые могут отображаться или скрываться в зависимости от режима редактирования страницы, поэтому то, что показывается пользователю, полностью отличается, но весь код страницы все еще находится в одном месте.

Изучите панель редактирования.

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

Я понимаю, что это не совсем то, о чем вы спрашивали ... но я считаю, что борьба с SharePoint - это проигрышная битва, вам просто нужно работать "своим путем".

0 голосов
/ 27 февраля 2011

Окончательный ответ на этот вопрос теперь «запекается» в продукт, который мы называем DualLayout for SharePoint! Наш подход решает весь ваш кошмарный дизайн SharePoint WCM:

  • Представление дополнительного представления для конечного пользователя, кроме просмотра и редактирования WCM
  • Никогда не конфликтуйте между стилями SharePoint и вашими собственными стилями
  • Сделать скудным и иметь в виду "просматривать" главные страницы и макеты страниц, которые не влияют на главные страницы WCM и макеты страниц
  • Создание сверхлегких страниц для конечного пользователя, удаление всего беспорядка, характерного для SharePoint
  • Повышение производительности страниц, поскольку у нас есть только минимальный набор элементов управления для отображения в представлении конечного пользователя

Проверьте это на http://www.macaw.nl/Het+Bedrijf/Producten/Macaw+DualLayout+for+SharePoint.aspx, см. Сообщения в блоге в блоге этой страницы для получения подробной справочной информации.

0 голосов
/ 14 июня 2009

Пытаетесь снова подчинить SharePoint своей воле? ;)

Я чувствую твою боль. Я использую 2 способа получить похожее поведение:

Контейнерный элемент для условного рендеринга частей страниц, я думаю, как вы и предлагали. Сначала мне нужно было скрыть части страницы, когда какое-то поле имело определенное значение, поэтому html не отображался. См. элементы управления оболочкой . Сам элемент управления очень прост, ему требуется класс [ParseChildren (false)] для своего класса, а метод рендеринга не вызывает базовый рендер, если условие не выполняется. Вы можете расширить это для отображения совершенно другой страницы для редактора и дизайнера, хотя все это все равно будет находиться на одной странице. Я полагаю, вы могли бы убрать часть, используемую аналитиком, и поместить ее в свой собственный пользовательский контроль, но это не очень поддерживаемо.

Во-вторых, страница формы, например, «/Pages/Forms/EditForm.aspx?ID=1», дает четкое представление обо всех полях на странице публикации. (Я использую элемент управления для всех макетов страниц, который обеспечивает доступ к этой и текущей библиотекам страниц одним щелчком мыши и отображает используемый тип контента и макет страницы. Очень полезно при создании сайтов WCM.)

0 голосов
/ 12 июня 2009

Конечно, для этого потребуется создать подкласс Microsoft.SharePoint.Publishing.PublishingLayoutPage и использовать его для отображения содержимого фактической PublishingLayoutPage, необходимой в зависимости от «режима редактирования».

Как изменить мастер-страницу ... ек.

0 голосов
/ 12 июня 2009

Мой текст был слишком длинным для поля для комментариев, поэтому я отвечаю на Эйдена так, как будто это ответ, но мой вопрос остается!

Привет, Эйдан! Я рассматриваю SharePoint как платформу, на которой можно строить свои решения. И я думаю, что решение WCM, созданное Microsoft поверх платформы, является слабым. Я знаю, что мой путь не является стандартным способом SharePoint, но стандартный способ просто не работает. Сочетание режима редактирования и отображения приводит к (выберите ваш выбор): - стандартные сайты публикации SharePoint, которые выглядят одинаково, но работают нормально в режиме редактирования - сайт, который очень редактируемый, но очень простой по внешнему виду - великолепно выглядящий сайт в режиме отображения, который практически невозможно редактировать У нас много противоречий между таблицами стилей, необходимыми в режиме отображения, с таблицей стилей MOSS WCM. Мы написали все виды компенсирующих таблиц стилей, чтобы заставить его работать, но это неприятно. Это большой недостаток - вставлять код со стилями на вашу страницу, чтобы сделать редактирование возможным, это должно было быть сделано полностью за пределами страницы, которую вы редактируете. Например, в iframe, который может отображаться как плавающее окно в верхней части редактируемой страницы. Но это не так. А потом я даже не упомянул проблемы, которые возникают у вас, когда на вашей странице есть вкладки или элемент управления аккордеоном.

Мы нацелены на действительно интерактивные сайты Web 2.0, где необходимо сделать много управления контентом. Получение режима редактирования прямо в режиме SharePoint просто не работает.

Оптимальный опыт редактирования является ключевым. Так почему бы не использовать мастер-страницу и макет страницы, оптимизированные для редактирования, чтобы все редактируемые элементы были доступны понятным и согласованным способом. Но тогда вам все еще нужен режим отображения. Это можно сделать с помощью отдельного сайта, который использует только данные, созданные в SharePoint. Это может быть сайт ASP.NET, или если вы хотите использовать полный контроль над HTML MVC. Я не собираюсь идти по этому пути, потому что он имеет большое значение для навигации, безопасности, повторного использования элементов управления, использования веб-частей и т. Д.

Я думаю, что вы получаете лучшее из обоих миров, если используется masterpage / pagelayout, оптимизированный для редактирования, а другая пара masterpage / pagelayout используется для отображения только с минимальным набором кода в pagelayout.

Так что .. продолжайте получать ответы, пожалуйста!

...