Ana içeriğe atla

Sharepoint - Dinamik Olarak MasterPage Değiştirmek

Microsoft Sharepoint Server ve MOSS teknolojisi günümüzde portal sistemleri denince akla ilk gelen ve şirket yöneticilerinin aklına gelen ilk teknolojidir. Esnek yapısı ve alt yapı mimarisi ile geliştiricilerin işlerini kolaylaştıran araçları ile insanların ilgilisini çok kısa zamanda çekti ve çekmeyede devam edecektir. 

Bu yazımızda Sharepoint teknolojileri kullananan kurumlardan en çok istenen isteklerden birinin nasıl çözüleceğini incelemeye çalışacağız. Örneklemek gerekirse, bir kurumun içinde üç farklı çalışma grubu var yöneticinizin bu çalışma gruplarından hangisi sisteme girdiyse ona özel bir tasarım görünmesini istiyorum şeklinde isteği olabilir. Bu durumda bizim yapmamız gereken gerekli çözümleri üretip işi sonuca ulaştırmaktır.

Sharepoint Server ile MOSS üzerinde geliştirme yapılmaya başlandığında ilk olarak default.master ve CSS dosyası bizlerin kullanımına sunulmaktadır. Farklı kullanıcı gruplarından hangi grup girerse farklı bir masterpage 'in açılmasına olanak tanıyabilmek için ilk olarak bu masterpage 'leri sharepoint e uygun şekilde düzenlemek gerekmektedir. Şimdi masterpage 'leri sisteme dahil olan kullanıcı grubuna göre nasıl değiştirebileceğimizi incelemeye başlayalım.

ASP.NET Sayfasının İçerisinde MasterPage Nasıl Değiştirilir?

ASP.NET uygulama geliştiriciler sisteme dahil olan üyelere göre rahatlıkla masterpage ve sayfa içerisinde yer alan öğeleri değiştiebiliyorlar. Sisteme dahil olan kullanıcıları kontrol etmek için masterpage 'in içerisinde yer alan PreInit event 'ından yararlanmak gerekmektedir. Fakat unutulmaması gereken bir nokta var. Hazırlanmış olan uygulama da yalnızca üç beş tane asp.net sayfa olmayacak. Yüzlerce sayfa olacaktır. Bu durumda her sayfaya ve masterpage 'e PreInit olayını yakalamak ve belirteceğimiz kodları yazmak sistemi yavaşlatacak bir etken olacaktır. Bu sebepte her sayfa için taban bir sınıf oluşturup yapacak olduğumuz işlemleri bunun içerisinde yaparsak işlerimiz biraz daha kolaylayacaktır. Bu sebeple MyCustomBasePage isimli bir sınıf oluşturuyoruz ve Page sınıfından bu sınıfı türetiyoruz. Sonrasında ise, Page_PreInit olayına aşağıdaki kodları ekliyoruz.

public class MyCustomBasePage : System.Web.UI.Page
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (CurrentUser.UserType == UserType.Admin)
        {
            MasterPageFile = "~/MasterPages/AdminMaster.master";
        }
        else if (CurrentUser.UserType == UserType.NormalAuthenitcated)
        {
            MasterPageFile = "~/MasterPages/NormalAuthenticatedMaster.master";
        }
        else
        {
            MasterPageFile = "~/MasterPages/AnonymouskMaster.master";
        }
    }
}

Bu sınıfın içerisinde üç farklı kullanıcı grubu için master page ayarladık. Admin, Normal ve sistem tarafından tanınmayan kullanıcılara göre farklı masterpage ler çalışacak ve görsel olarak farklı bir görünüm ile karşılacaklardır.

Şimdi bu sınıfı oluşturduğumuza göre işimiz biraz daha kolaylaştı. Artık oluşturulan bütün sayfalardan MyCustomBasePage sınıfını kullanarak bu hazırlamış olduğumuz kontrolün aktifleşmesine olanak tanırız.

public partial class HomePage : MyCustomBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

Sharepoint İçerisinde MasterPage Nasıl Değiştirilir?

Ana mantık olarak web uygulamalarında her kullanıcı grubuna ya da değişik faktörlere göre masterpage 'i nasıl değiştrebileceğimizi biliyoruz. Biraz öncede incelemiştik. Harici bir sınıf oluşurulur ve sayfanın PreInit olayı yakalanılarak değişiklikler yapılabilirdi. Ancak Sharepoint içerisinde bu direk PreInit olayından yakalayabilmek dire mümkün değildir. Ancak bizden çözüm bekleniyor ve gerekli işlemleri yapmamız gerekmektedir. Sharepoint Sayfaları içerisinde PreInit olayını yakalayabilmek için HttpModule 'ün kullanılması gerekmektedir.

Asp.Net Pipeline Süreci

Asp.Net istek süreçleri pipeline mantığına göre işlemlerini sürdürmektedir. Aşağıdaki şekilde de göreceğiniz üzere her isteğe yanıt veren bir modül bulunmaktadır. İstekler yakalandıktan sonra gerekli modülün kullanılmasına olanak tanınır.



Genellikle istekler pipeline içerisinde yer alan modüller isteklere göre yanıt vermektedir. Eğer ki bir den fazla modüle istek yapılırsa da tek bir işleyici tarafında işlem yapılacaktır. Ancak bizim istediğimiz her modüle tek bir işleyicinin işlem yapmasıdır. Bu işlemide asp.net sayfasında PreInit olayı ile gerçekleştiririz.

HttpModule 'den yararlanarak PreInit Olayı İşlenmesinin Geliştirilmesi

HttpModule den yararlanarak bir sınıf geliştirilirken System.Web.IHttpModule sınıfı miraslanarak kullanılır. IHttpModule 'in iki tane metodu vardır. Bunlar Dispose ve Init 'dir. Init metodu başlatıldığında diğer aktif olan Initleri iptal ederek kendisini kullanmaya başlayacaktır.

public class DynamicMasterPageModule : IHttpModule
{
    public void Dispose()
    {
    }
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }
    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
                Page page = HttpContext.Current.CurrentHandler as Page;
           if (page != null)
           {
               page.PreInit += new EventHandler(page_PreInit);
           }
    }
    void page_PreInit(object sender, EventArgs e)
    {
    }
}

Init metodunun içerisinde yer alan PreRequestHandlerExecute event 'ını yakalıyoruz. Asp.net sayfa başlarken bu olay tetiklenir. Sonrasıda açılacak olan sayfanın null olup olmadığının kontrolü sonrasında asp.net 'ten alışık oluğumuz PreInit olayının tetiklenmesi işlemini gerçekleştirebilmemize olanak tanınır.

Sharepoint MasterPage

Sharepoint 'in kendi varsayılan bir masterpage 'i vardır. Eğer bu masterpage üzerinde bir değişiklik ya da düzenleme yapmak istersek Sharepoint içeriğini görüntülemeye olanak tanıyan Sharepoint Designer içerisinde düzenleme yapmak gerekmektedir. Eğer ki oluşturulan ya da düzenlenen masterpage 'i kod tarafından çağırmak istersek Page.MasterPageFile özelliğini kullanmak gerekmektedir.

Page.MasterPageFile = "Masterpage 'in uygulama içerisindeki yolu";

Ancak dikkat edilmesi gereken bir nokta vardır. Masterpage sharepoint içerisinde farklı yerlerde bulıunabilir. Peki neden? Varsayılan sitenin içerisindeki olabilir, site koleksiyonunda olabilir gibi yerlerde olabilmektedir. Bunları örneklemek gerekirse,

"~site/MasterPageName.master"
Site klasörünün içerisinde yer alan masterpage 'in yolunu birden fazla masterpage olacağı için ~site/MasterPages/Masterpagename.master şeklinde güncellemelidir. MasterPage 'in yolunu adres çubuğunda görüntülemek için ise, http://sitecollection/site1 'in altında yer alan masterpage adresinden http://sitecollection/site1/masterpages/MyMaster.master yoluna göre güncelleriz.

"~sitecollection/MasterPageName.master"
Burada ise masterpage ~sitecollection yolunun içerisinden erişilebilmektedir. Ana sitenin yolu http://sitecollection iken http://sitecollection/MasterPageName.master yolu ile erişebilmek mümkündür.

Sharepoint İçerisinde Özel MasterPage Kullanımı

Eğer Sharepoint ile uygulama geliştirirken Sharepoint Designer yardımı ile yaparız. Özel bir masterpage oluşturmanın en kolay yolu var olan bir masterpage i tekrardan kopyalayarak yapıştırdıktan sonra gerekli düzenlemeleri yaparız.

Özel bir masterpage 'i oluşturduktan sonra diğer otomatik olarak bunun özel olarak oluşturulan bir masterpage olduğunu Sharepoint direkt anlamaz. Bu işlemi yapabilmek için Sharepoint Designer üzerinden de hazırlanan masterpage 'in üzerinde sağ tıklama yaparak bunu özel bir masterpage olduğunu belirten "Set as Custom Master Page" 'e tıklayarak belirtiriz.



Artık PreInit olayını yakaladıktan sonra web.config içerisinde MasterPage numarasını alıyoruz. Sonrasında eğer gelen sayfa numarası 1 ise custom1.master eğer gelen sayfa numarası 2 ise custom2.master 'ı aktif duruma getiriyoruz.


void page_PreInit(object sender, EventArgs e)
{
    Page page = sender as Page;
    string pageNo = ConfigurationManager.AppSettings["MasterPageNo"];


    if (page != null)
    {
        if (pageNo.Equals("1"))
            {
                page.MasterPageFile = "~masterurl/custom.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom1.master";
                }
            }
            else if (pageNo.Equals("2"))
           {
               page.MasterPageFile = "~masterurl/custom.master";
               if (SPContext.Current != null)
               {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom2.master";
               }

           }
           else
           {
                page.MasterPageFile = "~masterurl/default.master";
                if (SPContext.Current != null)
               {
                    SPContext.Current.Web.MasterUrl = "/_catalogs/masterpage/default.master";
               }
       }

}

web.config 'den gelen değere göre hangi masterpage 'in geleceği dinamik olarak görüntülenmektedir. Bu işlemi işinizi görecek şekilde güncelleyerek sorunlarınızı kolayca çözebilirsiniz.

Sonuç olarak bu yazımızda belirli kriterler doğrultusunda sharepoint server portal in masterpage 'ini dinamik olarak nasıl değiştirebileceğimizi incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Yorumlar

Bu blogdaki popüler yayınlar

SharePoint 2010 - Content Query for Blog Posts

I hope this post will help many of you feel comfortable with using the Content Query Web Part. In this post I will walk you through the process of creating a content query web part and configuring it to show custom field types. I will also give details on how to use XSLT to stylize and format the data being pulled. I will be using the following scenario as an example. Say that you had a site collection with a top level publishing site. This publishing site would display a the most recent blog posts from all blog sites within its own site collection. To solve this problem we will use a Content Query Web Part and a customized ItemStyle.xsl using XSLT. Please note that the “SharePoint Server Publishing Infrastructure” needs to be enabled at the site collection to display the content query web part. Step 1: Add a Content Query Web Part to Page Navigate to the site that you want the blog posts to show up and click on edit page. Under Editing Tools in the Ribb

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız. Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır. Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama. Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilind

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır. Link