Sharepoint Web Part Personalization

25. Şubat 2009

Standart Sharepoint kurulumlarında kişiselleştirme aktif olarak gelir. Bu sayede yönetici olarak sizin oluşturduğunuz shared view (paylaşımlı görünüm) ü kullanıcılar istediği web partları ekleyebilir, yada mevcut web partların yerini değiştirebilir. Bu işlem için tek ihtiyaç duyulan şey kullanıcınızın "Personalization Permission" larının doğru ayarlanmış olmasıdır.
 
Bu işlem için aşağıdaki adımları kullanabilirsiniz.
  1. Web Part Personalization da yetkili olmasını istediğiniz kullanıcı veya grupların yetki türlerini not alın veya bu kullanıcılar için yeni yetki seviyeleri (permission level) yaratın.
  2. Site Collection ana sayfasındayken Site Actions>Site Settings>Advanced Permissions menüsüne gidin.
  3. Burada Settings>Permission Levels menüsünü tıklayın.
  4. 1. adımda not aldığınız Permission Level'ları sırayla açın ve en altta yer alan "Personalization Permissions" seçeneğinde gerekli web part özelleştirmeleri yetkisini verin.

Artık sözkonusu kullanıcı ve gruplarınız Sharepoint sitenizin en üstünde yer alan ve "Welcome ....." şeklinde çıkan menüde "Personalize this page" menüsünü görebiliyor olacaksınız.

Kullanıcılar bundan sonraki site girişlerinde otomatik olarak personalize edilmiş sayfa görünümü gelecek karşılarına. Ama isterlerse yine aynı menü aracılığı ile Shared View'e de geçiş yapabilecekler.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint



Almanac 2008

24. Şubat 2009

Microsoft MVP'lerinden Burak Selim Şenyurt'un hazırlamış olduğu ve içerisinde Burak Selim Şenyurt tarafından yayınlamış tüm makalelerin PDF formatında bulunduğu Almanac 2008 yayınlandı. Zaman içerisinde eklenecek yeni makalelerle de sürekli güncel tutulacak olan Almanac'ı indirmek için tıklayınız.

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Duyurular



Interface'ler Aslında Ne İşe Yarar

21. Şubat 2009

Bana hem eğitimler sırasında hem de bireysel olarak o kadar çok soruldu ki sanıyorum bu konuda birşeyler mutlaka yazmam lazım. Interface kavramının ne olduğunu buradaki yazıda anlatmaya çalışmıştım. Ancak buradaki yazı sadece genel olarak interface kavramını anlatıyor ve bir iki örnek ile konu bitiyordu.

Anladığım kadarı yazı biraz eksik kalmış. Çünkü interface'ler sadece eğlence olsun ya da işi uzatsın diye yazılmaz. En önemli özelliği standardizasyondur. Bu konuyu örnekleyerek devam edelim...

 

Örneğin aşağıdaki gibi bir sınıfımız var.

 

public class ToplamaIslemi
    {
        public int IslemYap(int x, int y)
        {
            return x + y;
        }
    }

Bu basit sınıfımızı örnek olarak hazırladığımız Console uygulamasında aşağıdaki gibi çağırıyoruz.

static void Main(string[] args)
        {
            ToplamaIslemi toplama = new ToplamaIslemi();
            int sonuc = toplama.IslemYap(10, 20);
            Console.WriteLine(sonuc.ToString());
        }

Ve sonuç aşağıdaki gibi oluyor.

 

Bu örnekte ben sınıfın içinde IslemYap isimli bir metod olduğunu biliyordum ve doğrudan sınıf örneği üzerinden bu metodu çağırdım. Peki ya benim çağıracağım sınıfın bu metodu içerip içermediğinden emin değilsem? Yani anlatmak istediğim, modüler bir uygulama geliştirdiniz ve geliştirilen modülün çalışabilmesi için bazı metodları ve özellikleri olması gerekiyor ki sizin uygulamanız ile uyumlu çalışabilsin ama bundan nasıl emin olacaksınız ve bu metodlara nasıl erişeceksiniz.

 

Bu durum da interface'ler size büyük kolaylık sağlar. Örneğin şöyle bir interface hazırlayalım.

interface IMatematikselIslem<T>
    {
        T IslemYap(T x, T y);
    }

Generic özelliğine sahip olan bir interface tanımladık, böylece istediğimiz veri türünü kullanabiliriz. Şimdi  Çarpma, Çıkarma ve Bölme işlemleri için birer sınıf yazalım.

public class CarpmaIslemi : IMatematikselIslem<int>
    {
        public int IslemYap(int x, int y)
        {
            return x * y;
        }        
    }
    public class CikarmaIslemi : IMatematikselIslem<int>
    {

        public int IslemYap(int x, int y)
        {
            return x - y;
        }        
    }
    public class BolmeIslemi : IMatematikselIslem<double>
    {
        public double IslemYap(double x, double y)
        {
            if (y == 0.0)
                throw new DivideByZeroException("Bir sayı sıfıra bölünemez");
            else if (x == 0.0)
                return 0.0;
            else
                return x / y;
        }
    }

Görüldüğü üzere generic yapısını kullanmamız bize bölme işleminde kolaylık sağladı. Tekrar Main() metoduna dönecek olursak,

static void Main(string[] args)
        {
            CarpmaIslemi carpmaIslemi = new CarpmaIslemi();
            BolmeIslemi bolmeIslemi = new BolmeIslemi();
            CikarmaIslemi cikarmaIslemi = new CikarmaIslemi();
            ToplamaIslemi toplamaIslemi = new ToplamaIslemi();

            List<object> islemler = new List<object>(); // işlemleri kolleksiyon halinde saklayacağız
            // tek bir satırda işlemleri atmak için AddRange metodunu kullandık, object dizisini de parametre olarak yolladık.
            islemler.AddRange(new object[] {carpmaIslemi, bolmeIslemi, cikarmaIslemi, toplamaIslemi}); 
            foreach (object islem in islemler)
            {
                //generic tür olarak int alan işlemler
                if (islem is IMatematikselIslem<int>)
                {
                    IMatematikselIslem<int> matIslemi = (IMatematikselIslem<int>)islem;
                    int sonuc = matIslemi.IslemYap(10, 20);
                    Console.WriteLine("Islem: "+ islem.GetType() +", Sonucu:" + sonuc.ToString());
                }
                else if (islem is IMatematikselIslem<double>)
                {
                    // double olarak işlem yapacaksak
                    IMatematikselIslem<double> matIslemi = (IMatematikselIslem<double>)islem;
                    double sonuc = matIslemi.IslemYap(10.0, 2.0);
                    Console.WriteLine("Islem: "+ islem.GetType() +", Sonucu:" + sonuc.ToString());
                }
                else
                {
                    Console.WriteLine("Islem: " + islem.GetType() + " çalıştırılamaz.");
                }
            }            
        }

Görüldüğü üzere Main() metodunu baya değiştirdik, aslında yaptığımız şey basit.

 

  1. Öncelikle  tüm işlemler için bir sınıf örneği oluşturduk.
  2. Ardından object türünden generic bir List kolleksiyonu oluşturduk ve tüm sınıf örneklerini içine AddRange metodu ile attık.
  3. Kolleksiyonumuz içinde foreach ile dönmeye başladık.
  4. Her kayıtta önce if (islem is IMatematikselIslem<int>) kontrolü yaptık. is anahtarı kelimesi bir sınıfın verilen arayüzü (interface'i) uygulayıp uygulamadığını belirlemekte kullanılır ve geriye bool değer döndürür. Burada da IMatematikselIslem arayüzünü <int> türü ile uygulayan olup olmadığını kontrol ettik ve Toplama ile Çıkarma işlemlerini bulduk.
  5. İşlemin uygun olduğunu tespit edince
     IMatematikselIslem<int> matIslemi = (IMatematikselIslem<int>)islem;
    Satırı ile nesnenin arayüze referansını verdik.
  6. Daha sonrada matIslemi arayüz referansı ile aşağıdaki satırı kullanarak IslemYap metodunu çağırdık.
    int sonuc = matIslemi.IslemYap(10, 20);
  7. Sonra da elde ettiğimiz sonucu ekrana yazdık.
  8. Eğer kayıt <int> türünü uygulamamışsa, <double>'ı uygulamış olabilir diye kontrol ettik ve uygun olanlar için 5. , 6. ve 7. adımları uyguladık.
  9. Şayet bu iki kontrolde de başarısız olursa bu işlemin arayüzünü uygulamadığını anlıyoruz ve çalıştırmıyoruz.

 

Aklınıza şu soru gelecektir, niye? Çünkü biz burada IMatematikselIslem arayüzünü uygulamayan ToplamaIslemi sınıfının içinde IslemYap isimli bir metod olduğunu biliyoruz, ama emin miyiz? Ya yoksa, ya da şartlara uymuyorsa. Kodu kendimiz yazmadığımız durumlarda bunu daha iyi anlayabilirsiniz. Programımızı çalıştırınca aşağıdaki gibi bir çıktı oluşturacak

Gördüğünüz gibi oluşturduğumuz arayüz sayesinde, arayüz referansını kullanarak sınıf nesnemizin içinde ki metodu çalıştırdık ve arayüz uygulanmış olduğu içinde istediğimiz gibi olduğuna emin olduk.

 

Son olarak uygulamayı şu şekilde düzenleyelim. Uygulamanın içinde bulunan matematiksel işlem yapan sınıfların her birini ayrı bir DLL haline getirelim ve uygulamamızın bulunduğu dizinde bulunan Islemler içindeki bir klasöre atalım. Daha sonra uygulamadan burada bulunan DLL'leri uygulamaya yükleyelim ve içlerinde bulunan sınıfların metodlarını kontrol ederek çağıralım.

static void Main(string[] args)
        {
            // programın çalıştığı klasörü tespit edip, Moduller klasörünü ekliyoruz.
            string modullerKlasorPath = AppDomain.CurrentDomain.BaseDirectory + "Moduller\\";
            // Bu klasöre ulaşıyoruz
            System.IO.DirectoryInfo modullerKlasoru = new System.IO.DirectoryInfo(modullerKlasorPath);
          // .dll uzantılı dosyaları dolaşıyoruz
            foreach (System.IO.FileInfo dosya in modullerKlasoru.GetFiles("*.dll"))
            {
                // elimizdeki dosyayı Assembly olarak yüklüyoruz.
                System.Reflection.Assembly modul = System.Reflection.Assembly.LoadFile(dosya.FullName);
                // Yüklenen assembly'nin içindeki türleri dolaşıyoruz
                foreach (Type t in modul.GetTypes())
                {
                    // elimizdeki assembly bir sınıfa mı ait yoksa başka bir türe mi (örneğin interface)
                    if (t.IsClass)
                    {                       
                       bool intKontrol = Activator.CreateInstance(t) is IMatematikselIslem<int>;
                       bool doubleKontrol = Activator.CreateInstance(t) is IMatematikselIslem<double>;
                       if (intKontrol)
                       {
                           // bu <int> türünde arayüz uygulanmış bir sınıf, çalıştıralım artık.
                           IMatematikselIslem<int> p = (IMatematikselIslem<int>)Activator.CreateInstance(t);
                                     int sonuc = p.IslemYap(10, 20);
                           Console.WriteLine("Islem:" + t.ToString() + ", sonuç: " + sonuc.ToString());
                       }
                       else if (doubleKontrol)   // double da olabilir.
                       {
                        
                           // bu <double> türünde arayüz uygulanmış bir sınıf, çalıştıralım artık.
                           IMatematikselIslem<double> d = (IMatematikselIslem<double>)Activator.CreateInstance(t);
                         
                               double sonuc = d.IslemYap(10.0, 2.5);
                               Console.WriteLine("Islem:" + t.ToString() + ", sonuç: " + sonuc.ToString());
                       }
                           else
                           {
                               Console.WriteLine(t.ToString() + " türü IMatematikselIslem arayüzünü uygulamadığı için çalıştırılamamaktadır");
                           }
                       
                    }
                }
                
            }            

        }

Bu kodu da çalıştırdığımız zaman aşağıdaki gibi bir çıktı oluşuyor.

 

İnşallah bu sefer Interface (arayüz) kavramını açıklama şansı bulabilmişimdir. Bu uygulamada yapılan iki örneği de aşağıdaki bağlantıyı kullanarak indirebilirsiniz.

 

İndir

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

.Net Framework, C#



Windows Vista Üzerine WSS SP1 Yüklemek (x86/x64)

14. Şubat 2009

Bildiğiniz üzere Windows Sharepoint Services'in Windows Vista gibi client işletim sistemlerine kurulması sözkonusu değildir. Özellikler WSS'in ilk zamanlarında sıklıkla aldığımız bu soruya mantık çerçevesinde hep olumsuz geri dönüşler yapmak zorunda kalmışızdır.
 
Windows Vista üzerine Sharepoint kurulumunun yapılamaması kurumsal uygulamalarda ciddi bir sorun teşkil etmez. Çünkü zaten Sharepoint gibi bir uygulamayı Windows Server 2003 veya Windows Server 2008 üzerinde host etmek isteyeceksinizdir. Ancak aynı şeyi developerlar için söylemek malesef sözkonusu değil. Çünkü Sharepoint development için ya Sharepoint'in kurulu olduğu sunucu üzerinde çalışmak zorundasınızdır, yada bir Virtual PC yapısı üzerinde kurulu Sharepoint'te developmentınızı yapmak ve sonra gerçek sisteminize deploy etmek.
 
Sharepoint konusundaki farklı ve fark yaratan çözümleriyle son derece popüler hale gelmeye başlayan Bamboo Solutions firması WSS on Vista Helper yazılımı aracılığı ile Windows Vista üzerine WSS SP1'in kurulumuna imkan tanıyor. Bu sayede kendi işletim sistemi ortamınızdan ayrılmadan Sharepoint için gerekli development çalışmalarınızı gerçekleştirebilecek ve bu işlem için bir VPC ortamına ihtiyaç duymayacaksınız.
 
Setup helper dosyası Sharepoint kurulumunu başlatmadan önce yüklemeniz gereken bir eklenti olarak geliyor. Eklentiyi yükledikten sonra yapacağınız temel bazı konfigürasyonları takiben standart WSS kurulumunu başlatabiliyorsunuz.
 
Kurulumu ekran görüntüleriyle anlatan blog postuna buradan ulaşabilirsiniz. Eklentiyi indirmek için tıklayınız

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Duyurular, Sharepoint



Office 14

11. Şubat 2009

Merakla beklenen Office 14'ün alpha release screen-shotları NeoWin sitesinde yayınlandı. Aynı site Windows 7'nin screen-shotlarınıda tahmin edilenin öncesinde yayınlamıştı. (?)

Office 14 görsel anlamda Office 2007'e benzeyecekken, diğer office sistemleri ile entegrasyonunun çok daha güçlü olması bekleniyor. Özellikle Microsoft Office Sharepoint Server 2007 kullanan firmalar için bu sürümde oldukça fonksiyonel yenilikler olacağını düşünüyorum. Windows 7 ile beraber çıkması beklenen Office 14'e rağmen Sharepoint Server 2007'nin 14 versiyonu biraz daha sarkmayla yayınlanabilir.

Office 14 ekran görüntülerine ulaşmak için burayı tıklayabilirsiniz.

Son not, Office System'in 13 versiyonu hiç çıkmadı, arada biz mi kaçırdık diye düşünmeyin. 13 rakamının uğursuzluğuna olan inanç gereği Microsoft'ta diğer firmalar gibi 13 versiyonunu doğrudan atlama yolunu tercih etti.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Office System



Sharepoint IIS ve ASP.Net 2.0 Allow İşlemi

10. Şubat 2009

Sharepoint kurulumu öncesinde üzerinde Sharepoint kurmayı düşündüğünüz farm sunucularında yerine getirmeniz gereken bazı işlemler vardır.
  • IIS Kurulumu
  • .Net Framework 2.0 Kurulumu
  • .Net 3.0 Runtime bileşenlerinin kurulumu

Son iki madde yerine .Net Framework 3.5 SP1 yüklemesi yapmanızda yeterlidir. Burada önemli olan nokta önce IIS'in kurulması, sonra .Net Framework kurulumlarının yapılması gerektiğidir. Aksi durumda Yapmanız gereken son konfigürasyon ayarı olan IIS içerisinde "ASP.Net 2.0" izin verme (Allow) işleminde ASP.Net 2.0'ı göremezsiniz.

Eğer kurulumda bu sorunu yaşıyorsanız mevcut bütün .Net Framework kurulumlarını kaldırıp, IIS yüklemesi sonrası yeniden yüklemeyi deneyebilirsiniz.

 

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint



"Server Farm Configuration Not Complete"

10. Şubat 2009

Sharepoint kurulumu sonrası Sharepoint Technology and Configuration Wizard'ı tamamladığınızda otomatik olarak Central Administration sayfası açılır, login olur, trusted siteler arasına eklersiniz ve karşınıza gelen sayfanın sol üst köşesinde bu mesaj ile karşılaşırsınız.
 
"Server Farm Configuration Not Complete"
 
Bu mesajın anlamı sunucunun başarılı olarak kurulduğu ancak yapılması gereken ana iki konfigürasyonun henüz tamamlanmadığı yönündedir. Bu adımları da yerine getirdikten kısa bir süre sonra hata mesajı otomatik olarak yokolacaktır.
  • Operations>Services on Server menüsü aracılığı ile farmınızdaki sunucularda çalışması gereken Search, Web Application, Document Conversation, Excel Services gibi servisleri başlatmak. (Varsayılan olarak bu servisler kapalı gelecektir)
  • Farm için en az bir tane SSP (Shared Services Provider) yaratmak. Application Management>Create or Configure this farms Shared Services menüsü aracılığı ile bu adımı da yerine getirebilirsiniz.

5 kişi tarafından 3.0 olarak değerlendirildi

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint



Sharepoint Content Database Migration

10. Şubat 2009

Sharepoint 2003'de 2007'e geçiş veya 2007 ortamındaki test sisteminizi farklı bir farma taşımak için kullanabileceğiniz güvenilir yöntemlerden bir tanesi content database migrationıdır. Uygulaması oldukça basit bir yöntem olan content database migrationı kullanabilmek için aranan şartlar.
  • Taşıyacağınız sistem ile yeni sisteminiz aynı kurulumlara ve güncellemelere sahip olmalıdır. (SP1'li bir sharepoint sitesini SP1'siz bir farma taşıyamazsınız)

Content database migrationı gerçekleştirmek için öncelikle taşımak istediğiniz sistemin SQL Server üzerinde yer alan content databaseinin yedeğiniz almanız gerekmektedir. Sonraki adımlar şu şekilde özetlenebilir.

Adımlarda taşıyacağınız sistem A sistemi, yeni sisteminiz B sistemi olarak tanımlanmıştır.

  • A sisteminin SQL Server'ı üzerinden content database backupı alınır. (Şayet bu bölümde hatalar alıyorsanız veya sql servera ulaşma şansınız yoksa standart sharepoint backup ı da alabilirsiniz. Standart Sharepoint backupı içerisinde yer alan en büyük boyutlu dosya aslında SQL database backupınızdır.)
  • Alınan backup B sisteminin kullandığı SQL Server üzerinde restore edilir. (Standart restore işlemi yapılıri herhangi bir özel durum sözkonusu değildir)
  • Central Administration>Application Management menüsü aracılığı ile yeni bir web uygulaması yaratın.
  • Yaratılan uygulama için herhangi bir site collection yaratmayın.
  • Şimdi C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Binklasörü altında yer alan STSADM komut programcığını komut satırı üzerinden çalıştırın.
  • STSADM üzerinde yazacağınız komut şu şekilde olacak
    stsadm.exe -o addcontentdb -databasename <RestoredDBIsim> -url <YeniWebUygulamaAdresi>
  • İşlem restore ettiğiniz veritabanının boyutuna göre farklı zaman alacaktır ve işlem süresince ekranda herhangi bir mesaj görmezsiniz, bu normaldir.
  • İşlem tamamlandığında buna dair mesajı alırsınız.
  • İşlem tamamlanınca Central Administration>Application Management>Content Databasesmenüsü aracılığı ile B sisteminde yarattığınız uygulamanın veritabanı dosyalarını görüntüleyin. Listede yer alan restore ettiğinizin haricindeki veritabanına tıklayın ve karşınıza gelen ekranda "Delete"checkboxını işaretleyerek silin.
  • Artık uygulamanızın tek bir content database i kaldı.
  • Son adım olarak iki sistemin kullancığı domain ve kullanıcı bilgileri farklı olacağından Central Administration>Application Management>Site Collection Administrators menüsüne gidin ve yeni site collection admin kullanıcınızın kullanıcı adını girin.
  • Şimdi uygulamanıza yeni adresinden ulaşabilirsiniz.

Şayet A sistemindeki sharepoint üzerinde tasarım özelleştirmeleri yapıldıysa, ve bu işlem olması gereken yöntemlerle yapıdıysa (statik linkler verilmediyse, resimler kütüphanelerden okunuyorsa, stil dosyaları SPD(Sharepoint Designer) ile özelleştirildiyse, vb..) tasarımınız da başarılı bir şekilde yeni sisteminizde geri yüklenmiş olacaktır.

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint



SPDisposeCheck

10. Şubat 2009

Sharepoint development ile uğraşanların büyük çoğunluğunun korktuğu şeylerden biridir unutılan dispose çağrıları sebebiyle memory sorunları ile uğraşıyor olmak. SPSite ve SPWeb gibi IDisposable interfaceini destekleyen nesneler ile uğraştığınızda problemler kapınızı çalmaya başlayacak demektir.
 
İşte bu konudaki endişelerimize bir son vermek amacıyla Paul Andrew tarafındanda SPDisposeCheckisimli bir uygulama yazılmış.
 
Uygulama derlenmiş dll'iniz içerisinde dispose edilmemiş nesneleri arıyor ve bunlar hakkında size bir rapor sunuyor. İşe yarar bir uygulama gibi görünüyor.
 
Uygulama hakkında detay bilgi almak ve kullanmaya başlamak için aşağıdaki linki kullanabilirsiniz.
 

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint



Eski Sharepoint Sitelerini Türkçeleştirmek

10. Şubat 2009

Özellikle henüz Sharepoint için Türkçe dil paketi çıkmamışken yaratılmış portallarda karşımıza çıksada hala test sisteminden productiona geçerken veya yanlış bir kurulum sonrası içerikler oluşturulduktan sonra karşımıza çıkan bir problemdir sitelerin Türkçe'leştirilmesi.
 
Sharepoint sisteminize Türkçe dil paketini yüklemenizin ardından yeni bir site yaratırken Türkçe/İngilizce şeklinde bir seçenek kolonu gelecektir karşınıza. Ve bu kolon yardımıyla yaratacağınız siteleri istediğiniz dile özgün olarak yaratabilirsiniz. Ancak daha önceden İngilizce yaratılmış bir siteyi sonradan Türkçeleştirmek temel anlamda mümkün değildir.
 
Bu işlemi veritabanına doğrudan müdehale ederek gerçekleştirmek mümkün. Sharepoint kurulumunuza dil paketini yüklemenizin ardından ilgili uygulamanın content databaseinde yer alan "Webs" tablosu üzerinde aşağıdaki gibi bir sorguyu çalıştırısanız sisteminizde yer alan "Site Actions", "Actions", "New", "Upload", vb butonlardaki textlerin Türkçeleştiğini gözlemlersiniz.
 
"Update Webs Set Language = 1055"
 
Ancak bu işlem doğrudan veritabanına müdehale anlamını taşıdığından ürününüzün destek kapsamı dışına çıkmasına sebep olacaktır. Ayrıca Blog gibi özel şablonlara sahip sitelerde bu işlem işe yaramayacaktır.

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sharepoint