Share via


Windows SharePoint Services 3.0: Создание и развертывание решений (часть 5)

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

Ассоциация кода с шаблоном задается в файле webtemp*.xml при описании конфигурации. Например, если мы хотим ассоциировать код с нашим шаблоном NMUPortal, то конфигурация будет выглядеть следующим образом:

<Configuration
  ID="1"
  Hidden="FALSE"
  Title="National Mining University Portal"
  Description="Create a National Mining University Portal"
  ImageUrl="/_layouts/images/BlankPrev.png"
  DisplayCategory="NMU Projects"
  RootWebOnly="true"
  SubWebOnly="false"
  ProvisionAssembly="NMUPortal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e1ffca03d8df0be6"
  ProvisionClass="NMUPortal.NMUPortalProvision"
  ProvisionData="My Title"/>

Тут используются свойства ProvisionAssembly, ProvisionClass, описывающие сборку и класс, который будет использоваться прри создании сайта. Сборка должна быть развернута в GAC. ProvisionData может содержать текстовыю строку, из которой код сможет извлекать параметры.

Основное требование к классу - он должен быть наследником от SPWebProvisioningProvider. Вот пример такого класса:

using System;
using Microsoft.SharePoint;

namespace NMUPortal
{
    class NMUPortalProvision: SPWebProvisioningProvider
    {
        public override void Provision(SPWebProvisioningProperties props)
        {
            props.Web.ApplyWebTemplate("NMUPortal#0");
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite siteCol = new SPSite(props.Web.Site.ID))
                {
                    using (SPWeb site = siteCol.OpenWeb(props.Web.ID))
                    {
                        site.Title = props.Data;
                        site.Update();
                    }
                }
            });
        }
    }
}

Фактически единственным методом для перегрузки является Provision. Тут Вы можете создавать новые сайты, заполнять списки данными из БД и т. д. Но для этого Вы должны выполнить два действия:

1). вызвать ApplyWebTemplate, который позволит все-таки применить какой-то из шаблонов к создаваемому сайту. Ведь Вы перегрузили метод Provision и теперь сайт, на основе выбранного шаблона, не будет создан автоматически. Самое важное в этом месте, это не сделать ошибку и не указать в качестве шаблона ту конфигурацию, к которой привязан Ваш код. Произойдет зацикливание. Поэтому заранее подготовьте конфигурацию для создания главного узла:

<Configuration
   ID="0"
   Hidden="TRUE"
   Title="National Mining University Portal"/>

Естественно эту конфигурацию нужно описать и в onet.xml.

2). Поскольку код выполняется под аккаунтом обычного пользователя, необходимо изменить контекст безопасности, дав коду административные права. Это можно сделать с помощью метода RunWithElevatedPrivileges, который в качестве параметров получает метод для выполнения в контексте администратора.

Замечание. При работе с SPSite и SPWeb классами используйте using или явно вызывайте Dispose.

Вот и все, что необходимо сделать для выполнения кода в момент создания сайта на основе шаблона.

В следующей части мы поговорим о локализации и ресурсах. На этом и закончим тему решений.