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

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

Этим постом я начну рассказывать о создании интернет сайта на основе MS SharePoint 2010. Первые посты будут посвящены использованию для этого бесплатной версии MS SharePoint Foundation 2010. В последних постах я опишу дополнительные возможности, получаемые при покупке платных версий SharePoint 2010 (Standart и Enterprise).

Начнем с минимальных исходных данных. Сайт будет под управлением MS SharePoint Foundation, а базы данных будут располагаться на MS SQL Server 2008 Express Edition. Оба этих продукта совершенно бесплатны, что не может не радовать.

SharePoint 2010 или другие CMS

Использование SharePoint 2010 для построения сайта имеет ряд неоспоримых преимуществ:

  • Интерфейсы, предназначенные для управления содержимым соответствуют тем, которыми пользователи пользуются ежедневно при работе с корпоративным порталом. Т.е. обучение пользователей не требуется;
  • Возможность использования бесплатного "толстого" Windows-клиента MS SharePoint Designer для управления сайтом;
  • Управление контентом в оффлайн режиме. Например, создали новость/статью/что_угодно, сидя в самолете, добрались до ближайшего Wi-Fi и опубликовали на сайте;
  • Возможность работать с содержимым сайта через MS Outlook;
  • Работа с библиотеками на портале как с обычными сетевыми дисками;
  • Возможность публикации информации на сайте с корпоративного портала SharePoint;

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

Анонимный доступ

Это первое, что надо задействовать на сайте под управлением MS SharePoint 2010. Перед началом разработки, т.к. есть здесь подводные камни. Например Linq-To-SharePoint не работает в режиме анонимного доступа. Для обхода этого придется писать "обертку". Описание самого процесса включения анонимного доступа есть на MSDN.

От портала к интернет-сайту

При брендинге SharePoint есть одна проблема - интерфейс SharePoint не создавался для использование его в качестве public-face. Поэтому надо адаптировать интерфейс SharePoint. Нам не понадобятся ни Ribbon, ни SiteActions. Например, ribbon абсолютно бесполезен для пользователя, имеющего права только на чтение (именно такими правами будут обладать анонимные пользователи): можно только отправить ссылку на текущую библиотеку/список по почте и подписаться на уведомления. И то и другое можно реализовать и без ribbbon'а. Также добавлю, что для подписки, пользователю придется делать "лишний" клик по закладке, а это очень плохо.

Представление рибона в SharePoint для пользователей с правами только на чтение

Представление рибона в SharePoint для пользователей с правами только на чтение

Ничего из этого нам не надо. Способов "отфильтровать" элементы управления несколько.

Security Trimmed Controls

Контрол SharePoint для отображения или сокрытия элементов, исходя из прав пользователей. На ASP.NET странице он выглядит вот так:

<Sharepoint:SPSecurityTrimmedControl runat="server" Permissions="ManageLists">
Контент, видимый пользователям, имеющим права, указанные в атрибуте Permissions
</SharePoint:SPSecurityTrimmedControl>

Можно обернуть все, что надо спрятать от посетителей в такие контролы. Этот способ мне не нравится, т.к. поддерживать решения, в которых используется такой подход дорого. Есть и ещё несколько минусов, но о них ниже.

Назад к SharePoint 2007

Можно понизить версию интерфейса с 4 на 3. После этого наш будущий сайт становится очень похож на SharePoint 2007: все элементы управления, мирно уживающиеся в одном месте (на рибоне), теперь "разлетелись" по всей странице. Впрочем, и большинство из них нам не понадобятся.

SharePoint 2010 с пониженной до 3 версией интерфейса

SharePoint 2010 с пониженной до 3 версией интерфейса

Я ни в коем случае не против нового интерфейса SharePoint 2010, а именно идеи собрать все элементы управления в одном месте. Данный подход (понижение версии интерфейса) ни в коем случае не ограничивает функционал SharePoint, т.к. версия интерфейса задается на уровне узла. Таким образом для удобства редакторов контента вполне возможно создать отдельный узел, где будут собраны все списки/библиотеки и ribbon будет функционировать. Помимо этого есть еще и возможность публиковать содержимое с внутреннего корпоративного портала. Тем не менее, неудобства обеспечена.

Здесь я прерву описание этого метода, т.к. далее всё сводится к одному: проблема и как её решать. Взять, например WYSIWYG-редактор: он будет работать только в Internet Explorer или придется встраивать сторонний редактор.

Динамическое представление сайта

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

Сначала сделаем два проекта:
проект-брендинг, который будет содержать две master-страницы (как минимум, если требования в сайту "хитрые", то можно и больше), стили и изображения нам необходимые:

Проект брендинга SharePoint 2010

Проект брендинга SharePoint 2010

проект-сайт, содержащий SiteDefinition:

Проект определения сайта SharePoint 2010

Проект определения сайта SharePoint 2010

Master-страницу для бэкофиса (v4.moderator.master) я взял стандартную без каких-либо изменений, дабы сохранить стандартный интерфейс и его функциональность для редакторов содержимого.

С другой стороны, master-страницу для посетителей сайта я упростил максимально, удалив из неё всё, кроме PlaceHolderMain и прочей мелочи. Убрал даже FormDigest. Насколько это оправдано я напишу в следующих постах. Получилось совсем немного (без директив):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="<%$Resources:wss,language_value%>" dir="<%$Resources:wss,multipages_direction_dir_value%>" runat="server" xmlns:o="urn:schemas-microsoft-com:office:office">
<head runat="server">
    <meta http-equiv="X-UA-Compatible" content="IE=8"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="Expires" content="0"/>
    <title id="onetidTitle">
        <asp:ContentPlaceHolder id="PlaceHolderPageTitle" runat="server"/>
    </title>
    <SharePoint:CssLink runat="server" Version="4"/>
    <script type="text/javascript">
    var _fV4UI = true;
    </script>
    <link rel="shortcut icon" href="/_layouts/images/favicon.ico"
        type="image/vnd.microsoft.icon" />
</head>
<body onload="if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();"     class="v4master">
  <form runat="server"
     onsubmit="if (typeof(_spFormOnSubmitWrapper) != 'undefined') {
        return _spFormOnSubmitWrapper();} else {return true;}">
    <WebPartPages:SPWebPartManager id="m" runat="Server" />
    <a id="HiddenAnchor" href="javascript:;" style="display:none;"></a>
    <div id="MSO_ContentDiv" runat="server">
        <a name="mainContent"></a>
        <asp:ContentPlaceHolder id="PlaceHolderMain" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    <input type="text" name="__spText1" title="text" style="display:none;" />
    <input type="text" name="__spText2" title="text" style="display:none;" />
</form>
</body>
</html>

Что касается страницы default.aspx в SiteDefinition, то она также проста. Здесь только несколько зон для веб-партов:

<asp:Content ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
    <SharePoint:ProjectProperty Property="Title" runat="server"/>
</asp:Content>
<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td valign="top" width="100%" colspan="2">
            <WebPartPages:WebPartZone runat="server"
                  AllowPersonalization="false" Title="TopZone" ID="TopZone"                Orientation="Vertical"
                  QuickAdd-GroupNames="Top" QuickAdd-ShowListsAndLibraries="false"/>
        </td>
    </tr>
    <tr>
        <td valign="top">
            <WebPartPages:WebPartZone runat="server"
                  AllowPersonalization="false" Title="LeftZone" ID="LeftZone"                 Orientation="Vertical"
                  QuickAdd-GroupNames="Left" QuickAdd-ShowListsAndLibraries="false"/> 
        </td>
        <td valign="top">
            <WebPartPages:WebPartZone runat="server"
                  AllowPersonalization="false" Title="RightZone" ID="RightZone"                 Orientation="Vertical"
                  QuickAdd-GroupNames="Right" QuickAdd-ShowListsAndLibraries="false"/> 
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <WebPartPages:WebPartZone runat="server"
                  AllowPersonalization="false" Title="BottomZone" ID="BottomZone"                 Orientation="Vertical"
                  QuickAdd-GroupNames="Bottom" QuickAdd-ShowListsAndLibraries="false"/> 
        </td>
    </tr>
</table>
</asp:Content>

Для обеспечения динамического переключения master-страниц, надо изменить директиву Page страницы, указав в качестве наследуемого наш новый класс FluentWebPartPage:

public class FluentWebPartPage : WebPartPage
{
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        if (IsAnonymous)
            SetAnonymousView();
        else
            SetModeratorView();
    }
 
    /// <summary>
    /// Изменение master-page
    /// </summary>
    /// <param name="url"></param>
    private void SetMasterPages(string url)
    {
        MasterPageFile = url;
    }
 
    private void SetAnonymousView()
    {
        SetMasterPages("/_catalogs/masterpage/v4.guest.master");
    }
 
    private void SetModeratorView()
    {
        SetMasterPages("/_catalogs/masterpage/v4.moderator.master");
    }
 
    /// <summary>
    /// Является ли пользователь анонимным
    /// </summary>
    private static bool IsAnonymous
    {
        get
        {
            if (SPContext.Current == null) return true;
            return SPContext.Current.Web.CurrentUser == null;
        }
    }
}

Сам класс унаследован от Microsoft.SharePoint.WebPartPages.WebPartPage. На событии OnPreInit мы проверяем, является ли пользователь анонимным и в зависимости от этого подставляем соответствующую master-страницу. Поведение этого класса может быть различно: можно проверять какие-нибудь права у пользователя, можно по умолчанию брать страницу из параметров данного сайта (MasterUrl или CustomMasterUrl) и т.д.

Результат

В результате мы оставляем функционал и интерфейс нетронутым для редакторов контента и полную свободу действий для создания интернет-сайта на базе SharePoint.

Интернет-сайт на базе SharePoint 2010 для модераторов

Интернет-сайт на базе SharePoint 2010 для модераторов

Интернет-сайт на базе SharePoint 2010 для посетителей

Интернет-сайт на базе SharePoint 2010 для посетителей

В следующем посте я расскажу про дальнейшую оптимизацию с целью уменьшить размер страниц, т.е. ускорение загрузки.

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.

Смотрите также

Новый сайт группы SharePoint. Как это работает

Новый сайт группы SharePoint. Как это работает

SharePoint 2019 Preview

SharePoint 2019 Preview

Управление большими списками/библиотеками в SharePoint

Управление большими списками/библиотеками в SharePoint

SharePoint 2013/2016. Настройка хлебных крошек

SharePoint 2013/2016. Настройка хлебных крошек

SharePoint 2016. Кастомизация меню SuiteBar

SharePoint 2016. Кастомизация меню SuiteBar

SharePoint 2016. Кастомизация SuiteBar

SharePoint 2016. Кастомизация SuiteBar

Домашняя страница сайта SharePoint

Домашняя страница сайта SharePoint

Презентация и скрипты со встречи сообщества по SharePoint и Office 365

Презентация и скрипты со встречи сообщества по SharePoint и Office 365

PowerShell DSC. SharePoint

PowerShell DSC. SharePoint

PowerShell DSC. Сертификат для шифрования пароля

PowerShell DSC. Сертификат для шифрования пароля

PowerShell DSC. Учетные записи

PowerShell DSC. Учетные записи

Встреча сообщества по SharePoint и Office 365

Встреча сообщества по SharePoint и Office 365

SharePoint 2016. QR-code

SharePoint 2016. QR-code

Возможности SharePoint 2010/2013/2016

Возможности SharePoint 2010/2013/2016

Gmail IIS SMTP relay

Gmail IIS SMTP relay

SharePoint 2016. Извещения мозаикой

SharePoint 2016. Извещения мозаикой

Сертификация SharePoint по-новому

Сертификация SharePoint по-новому

SharePoint. Получение списка сайтов

SharePoint. Получение списка сайтов

Планирование фермы SharePoint

Планирование фермы SharePoint

Обзор SharePoint Education. Часть 3

Обзор SharePoint Education. Часть 3

SharePoint Excel Services. Отображение диаграммы на странице

SharePoint Excel Services. Отображение диаграммы на странице

SharePoint 2016 Release Candidate

SharePoint 2016 Release Candidate

Обзор SharePoint Education. Часть 2

Обзор SharePoint Education. Часть 2

Обзор SharePoint Education. Часть 1

Обзор SharePoint Education. Часть 1

SharePoint 2013 Образование. Установка и настройка

SharePoint 2013 Образование. Установка и настройка

SharePoint 2016 IT Preview

SharePoint 2016 IT Preview

SharePoint и SMS. Часть 2. Регистрация OMS-сервиса

SharePoint и SMS. Часть 2. Регистрация OMS-сервиса

SharePoint и SMS. Часть 1. Создание OMS веб-сервиса

SharePoint и SMS. Часть 1. Создание OMS веб-сервиса

SharePoint Day: 14 декабря, Москва

SharePoint Day: 14 декабря, Москва

RuSUG 17.10.2013. Презентация с моего доклада о новом поиске в SharePoint 2013

RuSUG 17.10.2013. Презентация с моего доклада о новом поиске в SharePoint 2013

SharePoint 2013 Ribbon API. Версии 14.3 и 15.4

SharePoint 2013 Ribbon API. Версии 14.3 и 15.4

Встреча RuSUG 17-го октября

Встреча RuSUG 17-го октября

SharePoint 2013. Служба ServiceDesk за 8 часов либо правильный проект

SharePoint 2013. Служба ServiceDesk за 8 часов либо правильный проект

SharePoint 2010/2013. Локализация данных

SharePoint 2010/2013. Локализация данных

Список возможностей SharePoint 2013

Список возможностей SharePoint 2013

SharePoint 2013. Типы полей

SharePoint 2013. Типы полей

SharePoint 2013 Enterprise Search. Часть 2. Создание обработчика контента

SharePoint 2013 Enterprise Search. Часть 2. Создание обработчика контента

SharePoint 2013 Enterprise Search. Часть 1. Логическая архитектура

SharePoint 2013 Enterprise Search. Часть 1. Логическая архитектура

SharePoint Ribbon. Создание многоуровневого меню

SharePoint Ribbon. Создание многоуровневого меню

SharePoint Ribbon. Использование ColorPicker'а

SharePoint Ribbon. Использование ColorPicker'а

Разработка для SharePoint. Как это было и как это будет

Разработка для SharePoint. Как это было и как это будет

SharePoint. История социализма за 10 лет

SharePoint. История социализма за 10 лет

SharePoint 2013 Preview

SharePoint 2013 Preview

Использование штрихкодов в SharePoint 2010

Использование штрихкодов в SharePoint 2010

Unable to locate the xml-definition for FieldName

Unable to locate the xml-definition for FieldName

SharePoint 2010. Апрельский накопительный пакет обновлений

SharePoint 2010. Апрельский накопительный пакет обновлений

Не удалось найти XML-файл в указанном расположении

Не удалось найти XML-файл в указанном расположении

Служба синхронизации профилей пользователей. Ошибки

Служба синхронизации профилей пользователей. Ошибки

Делаем сайт на SharePoint 2010. Построение иерархии страниц

Делаем сайт на SharePoint 2010. Построение иерархии страниц

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

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

Делаем сайт на SharePoint 2010. Оптимизация

Делаем сайт на SharePoint 2010. Оптимизация

Обработка большого количества элементов в SharePoint

Обработка большого количества элементов в SharePoint

Получение уникальных значений поля списка

Получение уникальных значений поля списка

DeskWork 5. Функциональность (продолжение)

DeskWork 5. Функциональность (продолжение)

Сокрытие информации о пользователе создавшем/изменившем элемент

Сокрытие информации о пользователе создавшем/изменившем элемент

Error : Code blocks are not allowed in this file

Error : Code blocks are not allowed in this file

SharePoint Client Object Model. Управляемый код

SharePoint Client Object Model. Управляемый код

Использование контрола HtmlEditor. Часть 3

Использование контрола HtmlEditor. Часть 3

SharePoint 15 SDK

SharePoint 15 SDK

PeopleEditor и Internet Explorer 9

PeopleEditor и Internet Explorer 9

Использование контрола HtmlEditor. Часть 2

Использование контрола HtmlEditor. Часть 2

Использование контрола HtmlEditor. Часть 1

Использование контрола HtmlEditor. Часть 1

Пропадающий контрол выбора представления списка

Пропадающий контрол выбора представления списка

Развертывание библиотеки документов с файлами

Развертывание библиотеки документов с файлами

Отключенные учетные записи и PeoplePicker

Отключенные учетные записи и PeoplePicker

Пропадающий TextBox в Telerik Reporting

Пропадающий TextBox в Telerik Reporting

Длительные операции в SharePoint. Request timed out

Длительные операции в SharePoint. Request timed out

Длительные операции в SharePoint. Изнутри

Длительные операции в SharePoint. Изнутри

Длительные операции в SharePoint. Снаружи

Длительные операции в SharePoint. Снаружи

DeskWork. Версия 5.1

DeskWork. Версия 5.1

DeskWork 5. Часть 2. Функциональность

DeskWork 5. Часть 2. Функциональность

DeskWork 5. Часть 1. Установка

DeskWork 5. Часть 1. Установка

SharePoint 2010. Random ListItem

SharePoint 2010. Random ListItem

Custom ListDefinition. Отключаем диалоги

Custom ListDefinition. Отключаем диалоги

SharePoint 2010 UpdatePanel. Request Notification

SharePoint 2010 UpdatePanel. Request Notification

Получение размера вложений SPListItem'а

Получение размера вложений SPListItem'а

SharePoint 2010. Переопределение форм типа содержимого

SharePoint 2010. Переопределение форм типа содержимого

SharePoint 2007/2010. Привязываем EventReceiver к типу содержимого

SharePoint 2007/2010. Привязываем EventReceiver к типу содержимого

Изменяем appSettings в config-файле

Изменяем appSettings в config-файле

SharePoint 2010. Добавляем сборку в пакет

SharePoint 2010. Добавляем сборку в пакет

SharePoint 2007/2010. The security validation for this form is invalid

SharePoint 2007/2010. The security validation for this form is invalid

SharePoint 2010. JavaScript IntelliSence

SharePoint 2010. JavaScript IntelliSence

SharePoint 2010. Локализация SiteDefinition

SharePoint 2010. Локализация SiteDefinition

SharePoint 2007. Получение данных из нескольких списков и узлов

SharePoint 2007. Получение данных из нескольких списков и узлов

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. База данных содержимого

SharePoint 2007. База данных содержимого

SharePoint 2007. Проверка на наличие элемента в списке

SharePoint 2007. Проверка на наличие элемента в списке