Создаем портал в Sharepoint. Часть 2

В предыдущей части этой серии статей мы остановились на том, что создали веб манифест портала для отделений компании Contoso. Во второй части я продолжу рассмотрение процесса кастомизации создания сайтов и порталов в Sharepoint.

Итак мы создали веб манифест, описывающий структуру портала. Для удобства я продублирую его здесь:

<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.4518" _dal="1" -->
<!-- _LocalBinding -->
<portal xmlns="PortalTemplate.xsd">
  <web name="Home" siteDefinition="ContosoBranchSite#0" displayName="$Resources:ContosoBranch,Site_Home_DisplayName;" description="">
    <webs>
      <web name="Sales" siteDefinition="ContosoBranchSite#1" displayName="$Resources:ContosoBranch,Site_Sales_DisplayName;" description="" />
      <web name="IT" siteDefinition="ContosoBranchSite#2" displayName="$Resources:ContosoBranch,Site_IT_DisplayName;" description="" />
      <web name="HR" siteDefinition="ContosoBranchSite#3" displayName="$Resources:ContosoBranch,Site_HR_DisplayName;" description="" />
    </webs>
  </web>
</portal>

Для каждого подсайта портала в веб манифесте содержится отдельный <web> элемент. Также мы обратили внимание на атрибут siteDefinition элемента <web>, который указывает Sharepoint-у какое определение использовать для создание соответствующего сайта. В нашем случае их четыре:

  • ContosoBranchSite#0 – корневой сайт портала;
  • ContosoBranchSite#1 – подсайт Sales;
  • ContosoBranchSite#2 – подсайт IT;
  • ContosoBranchSite#3 – подсайт HR.

ContosoBranchSite здесь означает имя шаблона (template name), которое используется для создания сайта, и номер после # – идентификатор конфигурации (configuration id – один шаблон может иметь несколько различных конфигураций – см. ниже). Эти артефакты определяются в отдельном webtemp файле (не путайте с файлом webtempContosoBranchSitePortal.xml, который используется для портала. Сейчас мы говорим о webtemp файле для конфигураций подсайтов портала). Также как для портала, webtemp для подсайтов расположен в папке 12/Template/{lcid}/xml (lcid – идентификатор локали). В нашем случае это будет файл 12/Template/{lcid}/webtempContosoBranchSite.xml (для того чтобы избежать путаницы я советую держаться одного соглашения о наименовании. Т.о. если для портала у нас был файл webtempContosoBranchSitePortal.xml (т.к. в этом файле содержится шаблон с названием ContosoBranchSitePortal) то для подсайтов это будет файл webtempContosoBranchSite.xml, и в нем будет содержаться шаблон ContosoBranchSite). Содержимое файла webtempContosoBranchSite.xml следующее:

<?xml version="1.0" encoding="utf-8" ?>
<Templates>
  <Template Name="ContosoBranchSite" ID="10002">
    <Configuration ID="0" Title="Home" Description="" Hidden="TRUE" ImageUrl="/_layouts/images/stsprev.png" DisplayCategory="Contoso" />
    <Configuration ID="1" Title="Sales" Description="" Hidden="TRUE" ImageUrl="/_layouts/images/stsprev.png" DisplayCategory="Contoso" />
    <Configuration ID="2" Title="IT" Description="" Hidden="TRUE" ImageUrl="/_layouts/images/stsprev.png" DisplayCategory="Contoso" />
    <Configuration ID="3" Title="HR" Description="" Hidden="TRUE" ImageUrl="/_layouts/images/stsprev.png" DisplayCategory="Contoso" />
  </Template>
</Templates>

Мы определили шаблон с названием ContosoBranchSite. Для этого шаблона у нас есть 4 разных конфигураций, которые используются в ContosoBranchSitePortalWebManifest.xml для подсайтов портала (конечно вы можете использовать одну и ту же конфигурацию для различных подсайтов в веб манифесте, но для нашего примера мы рассмотрим наиболее общий случай, когда все сайты имеют разные конфигурации). Обратите внимание, что названия конфигураций (атрибут Title) в файле webtempContosoBranchSite.xml такие же, как название элементов <web> (атрибут Name) в веб манифесте портала ContosoBranchSitePortalWebManifest.xml. Это необязательное условие. Просто помните что в веб манифесте портала атрибут Name содержит URL подсайта, в то время как в файле webtemp для подсайтов атрибут Title – э то просто название конфигурации. Также обратите внимание на то, что мы определили конфигурации как невидимые (Hidden=”TRUE”) – это сделано для того, чтобы скрыть конфигурации для подсайтов из элемента управления site template picker на странице создания сайтов. Нам не нужно создавать сайты на основе этих конфигураций отдельно друг от друга. Вместо этого нам нужно иметь возможность создавать портал с указанными подсайтами за одну операцию.

Давайте теперь вернемся к файлу webtemp портала и посмотрим в чем его отличие от webtemp файла для подсайтов. Главное отличие в том, что у портала мы указали следующие 3 атрибута:

  • ProvisionAssembly;
  • ProvisionClass;
  • ProvisionData.

Эти 3 атрибута (и, конечно, их значения) превращают сайт в портал. Я не буду повторять, что они означают, т.к. делал это в первой части. Другое отличие в том, что для шаблона подсайтов у нас есть 4 разных конфигураций, в то время как для портала – только одна.

Итак мы создали webtemp файл для подсайтов. Теперь настало время определить конфигурацию для каждого подсайта. Как я уже говорил в предыдущей части, конфигурации определяются в файлах onet.xml, которые расположены в папках /Templates/SiteTemplates/{TemplateName}/xml. В общем случае важно чтобы название папки {TemplateName} совпадало со значением атрибута Name элемента <Template> в файле webtemp (хотя возможно переопределить название папки с помощью атрибута SetupPath элемента <Template> – ниже я покажу пример такого переопределения). В нашем случае это будет файл 12/Templates/SiteTemplates/ContosoBranchSite/xml/onet.xml.

Как создать onet.xml файл с описанием кастомных конфигураций? Ответ зависит от ваших требований. Я предпочитаю скопировать стандартный onet.xml, который соответствует шаблону сайта, наиболее близкому к бизнес требованиям. Например вы можете использовать стандартные шаблоны Team site или Publishing site в качестве базовых шаблонов для будущих кастомизаций. Как я говорил в предыдущей части, для примеров мы будем использовать шаблон Publishing site (сайт публикации), т.к. он часто используется в реальной практике.

Но здесь есть одна проблема: в папке 12/Templates/SiteTemplates имеется множество стандартных onet.xml файлов. Как нам определить какой из них соответствует шаблону Publishing site? Я конечно мог бы сказать, что надо использовать такой-то файл из такой-то папки, но это не будет настолько полезным, как если бы вы знали как решать подобные задачи сами. Один из путей – это выполнить поиск на вхождение “Publishing site” по все файлам. Однако есть способ проще (к тому же указанный способ специфичный для определенного языка, так например для русского языка вам придется искать “Сайт публикации”). Если у вас уже есть сайт, созданный с использованием шаблона Publishing site, то вы можете определить его свойства с использованием объектной модели Sharepoint-а. Нас интересуют следующие свойства класса SPWeb:

Свойство SPWeb Соответствующий атрибут
WebTemplate Атрибут “Name” элемента <Template> в файле webtemp
WebTemplateId Атрибут “ID” элемента <Template> в файле webtemp
Configuration Атрибут “ID” элемента <Configuration> в файле webtemp и onet.xml

Для того, чтобы вывести эти свойства, вы можете воспользоваться простой консольной утилитой. Я использовал мой Resharper live template for Sharepoint utilities для создания этой утилиты:

class Program
{
    static void Main(string[] args)
    {
        if (args.Length != 1)
        {
            Console.WriteLine("Usage: exe <site_collection_url>");
            return;
        }

        using (var site = new SPSite(args[0]))
        {
            using (var web = site.OpenWeb())
            {
                Console.WriteLine("WebTemplate: {0}", web.WebTemplate);
                Console.WriteLine("WebTemplateId: {0}", web.WebTemplateId);
                Console.WriteLine("Configuration: {0}", web.Configuration);
            }
        }
    }
}

Для запуска приложения вам необходимо указать URL существующего сайта в командной строке. Вот результат выполнения для сайта, созданного на основе шаблона Publishing site:

WebTemplate: CMSPUBLISHING
WebTemplateId: 39
Configuration: 0

В папке 12/Template/{lcid}/xml есть только один файл, содержащий ссылку на CMSPUBLISHING: webtempsps.xml. После анализа его содержимого будет понятно что файл onet.xml для шаблона Publishing site расположен в папке 12/Templates/SiteTemplates/Publishing/xml:

<Template Name="CMSPUBLISHING" ID="39" SetupPath="SiteTemplates\PUBLISHING">
   <Configuration ID="0" Title="Publishing Site" Hidden="FALSE" ImageUrl="/_layouts/1033/images/PublishingCollaborationSite.gif" 
       Description="A blank site for expanding your Web site and quickly publishing Web pages. Contributors can work on draft versions..."
       FilterCategories="PublishingSiteTemplate"
       SubWebOnly="TRUE"  DisplayCategory="Publishing"
       VisibilityFeatureDependency="F6924D36-2FA8-4f0b-B16D-06B7250180FA">
  </Configuration>
</Template>

Итак, нам нужно скопировать файл onet.xml из папки 12/Templates/SiteTemplates/Publishing/xml в нашу папку 12/Templates/SiteTemplates/ContosoBranchSite/xml. После этого наши подсайты готовы к кастомизации.

По умолчанию файл onet.xml для шаблона Publishing site содержит всего одну конфигурацию (не считая пустую конфигурацию с id=”-1”):

<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.2220" _dal="1" -->
<!-- _LocalBinding -->
<Project Revision="3" Title="Publishing Site" ListDir="Lists" xmlns:ows="Microsoft SharePoint">
 <NavBars>
    ...
 </NavBars>
    <ListTemplates>
    </ListTemplates>
    <DocumentTemplates>
        ...
    </DocumentTemplates>
    <BaseTypes>
    </BaseTypes>
    <Configurations>
        <Configuration ID="-1" Name="NewWeb"/>
        <Configuration ID="0" Name="Publishing"> 
            ...
        </Configuration>
    </Configurations>    
    <Modules>
        ...
    </Modules>
</Project>

Нам же нужно определить 4 разных конфигурации, так что минимальное изменение, которое необходимо сделать – это скопировать конфигурацию с идентификатором “0” четыре раза в нашем onet.xml и изменить их идентификаторы и названия, чтобы они соответствовали файлу webtempContosoBranchSite.xml:

<Configurations>
    <Configuration ID="0" Name="Home">
        ...
    </Configuration>
    <Configuration ID="1" Name="Sales">
        ...
    </Configuration>
    <Configuration ID="2" Name="IT">
        ...
    </Configuration>
    <Configuration ID="3" Name="HR">
        ...
    </Configuration>
</Configurations>

После этого мы уже может создавать сайты на основе конфигурации портала, подсайты которого будут созданы с использованием копии стандартного шаблона Publishing site. На текущий момент подсайты будут иметь абсолютно ту же функциональность, что и стандартные сайты публикаций, за исключением одной важной детали: мы создали их с помощью нашего специализированного шаблона, так что теперь мы свободны добавлять и изменять функциональность на этих сайтах, не затрагивая при этом стандартные шаблоны. Но это уже тема для следующей части статьи.

Реклама

Об авторе sadomovalex

Старший инженер, team lead, консультант. Работаю в стеке .Net. Последние несколько лет занимаюсь разработкой enterprise приложений под Sharepoint, чему и будет в основном посвящена тематика этого блога. Также активно использую и интересуюсь ASP.Net MVC, DDD, TDD, Agile. Активно участвую в жизни многих профессиональных сообществ, SPb .Net UG, SPb ALT.Net, rsdn, Finland SP UG и др.
Запись опубликована в рубрике Sharepoint. Добавьте в закладки постоянную ссылку.

2 комментария на «Создаем портал в Sharepoint. Часть 2»

  1. Когда же продолжение? Интересно как разворачивать данные подсайты уже локализованными для определенного языка.

  2. Альберт,
    вопрос локализации был частично рассмотрен в первой части — https://sadomovalex.wordpress.com/2010/10/02/create-portal-in-sharepoint-part-1. Суть в том, что webtemp файл с определением конфигурации портала создается в папке Template/{lcid}/xml, где {lcid} — идентификатор локали. После этого при установленном languag pack-е для языка {lcid}, ваш портал будет отображаться в списке доступных конфигураций при создании сайтов и сайт коллекций. Ну и про локализацию строк забывать не стоит: вместо захардкоженных литералов необходимо использовать ресурсные файлы и синтаксис Title=»$Resources:MyResource,Title», где MyResource — название ресурсного файла из папки {12|14|15}/Resources. Если посмотрите на определение какой-нибудь стандартной фичи из Templates/Features, увидите, как это сделано.
    Кстати такой способ провиженить порталы в Sharepoint 2013 считается устаревшим. Вместо web definitions сейчас принято использовать web templates — те же onet.xml, но провиженятся с помощью фичи в Template/Features, а не в Template/SiteTemplates. Web templates можно использовать как для on-premise установках, так и для O365.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s