Делаем сайт на SharePoint 2010. Брендинг Wiki-страниц

Сайт на SharePoint 2010. Брендинг
Сайт на SharePoint 2010. Оптимизация
Сайт на SharePoint 2010. Брендинг Wiki-страниц
Сайт на SharePoint 2010. Построение иерархии страниц

Небольшой пост-дополнение к брендингу интернет-сайта на SharePoint 2010. Сегодня я расскажу, как задействовать описанный механизм применения динамических master-страниц к вики-страницам сайта.

Страница для отображения Wiki-страниц

Страница, которая отвечает за отображение вики-страниц находится по адресу {SharePooint Folder}/TEMPLATE/DocumentTemplates/wkpstd.aspx. Чтобы подставлять master-страницу для посетителей интернет сайта понадобится свой класс (именоваться у меня проекте он будет FluentWikiEditPage), который будет проверять помимо анонимности пользователя шаблон текущего сайта. Последнее необходимо, чтобы не повлиять на поведение других сайтов/коллекции сайтов.

Проверять, является ли шаблон текущего сайта нашим, мы будем по его ID, который задается в CAML-определении сайта:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Templates xmlns:ows="Microsoft SharePoint">
  3.   <Template Name="ZhukBlog.InternetSite.SiteDefinition" ID="10000">
  4.     <Configuration ID="0" Title="Квантум Арт. Интернет сайт"
  5.                   Hidden="FALSE" ImageUrl="/_layouts/images/CPVW.gif"
  6.                   Description="" DisplayCategory="ZhukBlog">
  7.     </Configuration>
  8.   </Template>
  9. </Templates>

Весь код класса я приводить не буду, т.к. вскоре опубликую исходные коды демонстрационного проекта. Здесь важен только метод OnPreInit, в котором мы будем проверять шаблон сайта, используя свойство WebTemplateId объекта SPWeb:

  1. public class FluentWikiEditPage : WikiEditPage
  2. {
  3.     protected override void OnPreInit(EventArgs e)
  4.     {
  5.         base.OnPreInit(e);
  6.         var web = SPContext.Current.Web;
  7.         // Проверяем является ли шаблон сайта нашим по его ID
  8.         if (web.WebTemplateId != 10000) return;
  9.         if (IsAnonymous)
  10.             SetAnonymousView();
  11.         else
  12.             SetModeratorView();
  13.     }
  14.  
  15.     //...
  16. }

В остальном класс FluentWikiEditPage аналогичен классу FluentWebPartPage.

wkpstd.aspx в проекте Visual Studio

Чтобы заменить файл wkpstd.aspx в SharePoint, надо "замапить" папку {SharePooint Folder}/TEMPLATE/DocumentTemplates и скопировать туда исходный файл.

Теперь в файле wkpstd.aspx можно изменить директиву Page, чтобы страница была унаследована от нашего нового класса:

  1. <@% Page
  2. Language="C#"
  3. Inherits="ZhukBlog.InternetSite.Branding.FluentWikiEditPage,
  4. ZhukBlog.InternetSite.Branding,Version=1.0.0.0, Culture=neutral,PublicKeyToken=..."
  5. MasterPageFile="~masterurl/default.master"%>

Адаптация "гостевой" master-page под вики-страницы

Также необходимо модифицировать файл v4.quest.master нашего проекта.

Во-первых, вернуть на страницу часть ContentPlaceHolder элементов:

  1. <asp:ContentPlaceHolder id="PlaceHolderLeftActions"
  2.     Visible="false" runat="server" />
  3. <asp:ContentPlaceHolder id="PlaceHolderPageImage"
  4.     Visible="false" runat="server" />
  5. <asp:ContentPlaceHolder id="PlaceHolderPageDescription"
  6.     Visible="false" runat="server" />
  7. <asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead"
  8.     runat="server" Visible="false" />
  9. <asp:ContentPlaceHolder id="PlaceHolderMiniConsole"
  10.     runat="server" Visible="false" />
  11. <asp:ContentPlaceHolder id="PlaceHolderPageTitleInTitleArea"
  12.     runat="server" Visible="false" />

Здесь у всех указан атрибут Visible равным false. Задействовать эти контролы у себя на проекте или нет решайте сами.

Во-вторых, вики-страницы требует наличия контрола Ribbon на странице (в случае, если версия интерфейса = 4). Происходит это из-за некорректно написанного метода Microsoft.SharePoint.WebControls.SPPageStateControl.OnInit (часть метода):

  1.  if ((SPPageStateContext.ContextualWeb != null
  2.          && (SPPageStateContext.ContextualWeb.UIVersion >= 4))
  3.     {
  4.         this.RibbonTrimmer = new RibbonTrimmer(SPRibbon.GetCurrent(this.Page));
  5.     }

Не хватает здесь проверки на то, что Ribbon'а может и не быть на странице. Необходимый минимум для удовлетворения этих потребностей выглядит вот так:

  1. <SharePoint:SPRibbon runat="server" Visible="false" />

Результаты

Wiki-страницы теперь функционируют согласно общему требованию: функционал редакторов остается неизменным, посетители видят "минимум" SharePoint:

Интернет-сайт на базе SharePoint 2010 для модераторов (wiki-страница) Интернет-сайт на базе SharePoint 2010 для посетителей (wiki-страница)

Поделиться

Коментарии