Hiyerarşik Yapıdaki SharePoint 2007 Sitelerinin Dinamik Olarak Oluşturulması

Yazar: Timuçin DURSUN
Kategori: MS SharePoint
Eklenme Tarihi: 30.8.2007 09:56:25



SharePoint için dinamik site oluşturulmasıyla ilgili bir çalışma örneği...

Hiyerarşik Yapıdaki SharePoint 2007 Sitelerinin Dinamik Olarak Oluşturulması

Danışmanlık için gittiğim şirketlerde öncelikle oluşturacağımız SharePoint siteleri için site hiyerarşisini çıkarırız. Site hiyerarşisini tek tek elle oluşturmakdan sıkıldığım bir gün şimdi anlatacak olduğum küçük ve çok basit bir uygulama geliştirdim. Bu uygulamayı görsel bir arayüz ve daha kullanıcı dostu bir yapıya dönüştürüp dağıtımını çok yakında gerçekleştireceğim.

Şimdi gelelim uygulamamıza. SharePoint sitesi için gerekli hiyerarşik yapıyı bir XML dosyasında tutmanın daha kolay bir yol olacağını düşünerek yola çıkıyoruz. ASP.NET’deki SiteMaps yapısını bilenlere tanıtık gelecek bir yöntemle XML dosyası yapısını oluşturacağız. SharePoint sitesi içerisindeki hiyerarşiyi rekursif olarak XML dosyası içerinde oluşturduğumuzda aşağıdaki XML dosyasını elde etmiş olacağız.

Dosya Adı: sitehierarchy.xml

<?xmlversion="1.0" encoding="utf-8"?>
<
sites>

<site>

<name>X Firması Genel Müdürlüğü</name>

<site>

<name>X Firması Bilgi İşlem Birimi</name>

<site>

<name>IT</name>

</site>

<site>

<name>Development</name>

</site>

</site>

<site>

<name>X Firması İnsan Kaynakları</name>

</site>

</site>

<site>

<name>Y Firması Genel Müdürlüğü</name>

<site>

<name>Y Firması Muhasebe</name>

<site>

<name>Y Firması Müşavirlik</name>

</site>

<site>

<name>Y Firması Alım Satım</name>

</site>

</site>

<site>

<name>Y Firması Dış Kaynak</name>

</site>

<site>

<name>Y Firması İnsan Kaynakları</name>

<site>

<name>Y Firması Çalışanlar</name>

</site>

</site>

</site>

</sites>

Görmüş olduğunuz yapıda <sites> tagı root tagı göstermektedir. <site> tagı ise SharePoint içerisindeki tek bir siteyi ve <name> tagı bu sitenin adını gösterir. Bu yapı gerekli Attribute’lar ile dahada geliştirilebilir fakat örnek için basit tutmayı tercih ettim.

Aşağıdada bu XML dosyasını Parse edip SharePoint sitesinde dinamik olarak siteleri oluşturan kod yapısını görmektesiniz.

Dosya Adı: Program.cs

usingSystem;

usingSystem.Collections;

usingSystem.IO;

usingSystem.Text;

usingSystem.Xml;

usingMicrosoft.SharePoint;

/*

* Timuçin DURSUN

*/

namespaceSiteCreator

{

class SXParser

{

private static XmlTextReader rd;

private static SPSite site;

private static SPWeb currentWeb;

public static void Main(string[] args)

{

SXParser parser = new SXParser();

// Parse edilicek XML dosyası

rd = new XmlTextReader("sitehierarchy.xml");

// Site hiyerarşisinin oluşturulacağı Web Application lokasyonu

site = new SPSite("http://mossdev");

// Root Site Collection açılıyor

currentWeb = site.OpenWeb();

// Parse işleminin yapılacağı Methoda XML stream yollanıyor.

parser.ParseURL(rd);

}

void ParseURL(XmlTextReader reader)

{

try

{

// 1033 ingilizce dil koduna göre Sitedeki Template bilgileri alınıyor.

SPWebTemplateCollection Templates = site.GetWebTemplates(1033);

// STS#1 Blank Site template seçiliyor. Oluşturulan sitelerde bu template kullanılacak.

SPWebTemplate siteTemplate = Templates["STS#1"];

SPWeb newWeb = null;

while (reader.Read())

{

switch (reader.NodeType)

{

case XmlNodeType.Element:

// okunan XML tagı name oldugunda bir okuma işlemi daha yapılarak tag icindeki veri alınıyor.

// Sonrasında web sitesi oluşturuluyor.

if (reader.Name == "name")

{

reader.Read();

newWeb = currentWeb.Webs.Add(reader.Value, reader.Value, "", 1033, siteTemplate, true, false);

// burada oluşturulan site için ekstra konfigurasyon bilgisi girebilirsiniz.

// örneğin sitenin gruplarını oluşturabilirsiniz. Kullanıcıları tanımlayabilirsiniz

// bunu yapmak için tabiki XML yapısını geliştirmeniz gerekmektedir.

newWeb.Update();

currentWeb.Update();

Console.WriteLine("Oluşturulan Web Sitesi:" + newWeb.Title);

}

break;

case XmlNodeType.EndElement:

if (reader.Name == "name")

{

// bir name tagı kapanırsa yeni site varsayılan site konumuna geliyor.

currentWeb = newWeb;

}

if (reader.Name == "site")

{

// site tagı kapanırsa varsayılan site bir üst seviyeye çıkıyor.

// hiyerarşinin uygulanabilmesi için rekursif yapıda bu yönteme

// dikkat ediyoruz.

currentWeb = currentWeb.ParentWeb;

Console.WriteLine("Üst siteye geçildi:" + currentWeb.Title);

}

if (reader.Name == "sites")

{

// sites tagı kapanırsa tüm XML okunduğu anlamına geldiği için

// burada işlemimiz sonlanıyor.

Console.WriteLine("İşlem tamamlandı...");

}

break;

default:

break;

}

}

}

catch (XmlException e)

{

Console.WriteLine("Hata: " + e.Message);

}

}

}

}

Kod bloğunun içerisinde bulunan açıklamaların dışında burada birkaç ayrıntıyada değinmek istiyorum. Bu kod bloğu SharePoint 2007 Serverın kurulu olduğu serverda çalışmaktadır. Kodda görmüş olduğunuz gibi “Microsoft.SharePoint” namespace kullanılmaktadır. Unutmayın bu namespace içeren Microsoft.SharePoint.dll assembly’sini projenize import etmelisiniz. Ayrıca alt siteleri oluşturmak istediğiniz SharePoint siteniz üzerinde uygulamayı çalıştıracağınız bilgisayarın yetkili olması gerekiyor. Yetki alamayacağınız sistemlerde yetkili olan başka bir kullanıcıyı impersonate yöntemi ile kullanıp alt siteleri oluşturabilirsiniz.

Yukarıdaki koda gelirsek. Küçük bir XML parser içeriyor aslında. Bunun dışında “Microsoft.SharePoint” namespace içerisinde bulunan nesne kütüphanelerini kullanarak SharePoint sitesine bağlanıyoruz. Bağlandığımız SharePoint sitesi içerisinde XML dosyası rekursif okunarak kökden dallara doğru siteleri oluşturup sonrasında tekrar köke dönüyoruz. Burada rekursif yapı XML dosyasında bulunuyor. Aslında tüm iş XML readerın döngüye alınması diyebiliriz. Hiyerarşik SharePoint sitelerini dinamik olarak oluşturmak için çok basit bir uygulama olmasına ragmen bazı durumlarda dakikalarınızı kurtarabilirsiniz.

Bir makalenin daha sonuna gelmiş bulunuyoruz. Sonraki makalede görüşmek dileğiyle...

Timuçin DURSUN


Timuçin DURSUN

İlgilendiği konular öncelik sırasına göre C#,ASP.NET,ADO.NET,ADO.NET Entity Framework,LINQ,SOA and Distributed Systems,NUnit,NHibernate(Object-relational mapping), Design Patterns, WPF, SilverLight-WPF/E. http://www.timucindursun.com sitesinden yazar hakkında ayrıntılı bilgi alabilirsiniz.
Bu makaleye ilk yorum yapan siz olun.

Yorumunuz