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.
Вот и все, что необходимо сделать для выполнения кода в момент создания сайта на основе шаблона.
В следующей части мы поговорим о локализации и ресурсах. На этом и закончим тему решений.
Comments
Anonymous
February 11, 2009
PingBack from http://blog.a-foton.ru/index.php/2009/02/12/windows-sharepoint-services-30-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b8-%d1%80%d0%b0%d0%b7%d0%b2%d0%b5%d1%80%d1%82%d1%8b%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%80%d0%b5%d1%88%d0%b5%d0%bd-5/Anonymous
January 21, 2010
The comment has been removed