20 Mart 2009 Cuma

Sharepoint Web Servisleriyle Çalışmak-1(Imaging Web Servisi)

Bu makale dizimizde Sharepoint'in bize sağlamış oldugu web servislerinden Imaging Servisiyle çalışmayı inceleyeceğiz.

Bu Web servis sayesinde Sharepoint Picture Librarylerine imaj yükleyebiliriz. Bunu başka bir yolu Sharepoint Object Modeli kullanarak upload yapmaktır, fakat bu yol biraz daha zahmetli ve anonim kullanıcıların ekstra bir hak verilmedikçe yapamadıgı işlemlerdir. SPSecurity.RunWithElevatedPriviliges Metodu sayesinde bu kullanıcılara admin haklarıyla resim upload ettirebiliriz, fakat dediğim gibi bunun en iyi yolu(best practice) Imaging Web Servisini kullanmaktır. _vti_bin folderının altında duran sharepoint web servislerinin arasında bulunan Imaging Web servisini Web uygulamamıza referans olarak ekliyoruz. WebSite/_vti_bin/imaging.asmx, Imaging servisinin yoludur.

Uygulamamıza design tarafından bir file upload kontolü ve bir Yükle butonu ekleyerek, kullanıcının dosya yüklemesini sağlayalım.



Sonrasında Butonun Click yordamına aşağıdaki kodu yazıyoruz.



Yukarıdaki kodda kullanılan Imaging Servisinin Upload Metodunun ilk parametresi resmin yükleneceği Listenin ismi, 2.parametresi liste içerisinde herhangi bir foldera yüklenecekse folderın ismi, 3.parametresi yüklenecek resmin byte array hali, 4.parametre resim kitaplıgında bu resme verilmesi istenen isim, 5.parametrede resim kitaplıgımızda aynı isimde bir dosya bulunuyorsa onun overwrite edilip edilmeyeceğidir.

Aşağıda kod çalıstırıldıktan sonra UploadResimler isimli PictureLibrary'e resmin yüklendiğini görüyoruz.




Bu postumda Sharepoint Web Servislerinden Imaging Servisi sayesinde Resim Kitaplıklarına resim eklemeyi gördük. Sonraki makalelerimizde diğer Sharepoint web servislerinden de bahsedeceğim.

Herkese iyi çalışmalar..

18 Mart 2009 Çarşamba

Bir Page üzerindeki Web Partları Listelemek ve Propertylerine erişmek

Uğraştıgım proje kapsamında Bir Web Part Page üzerindeki Web partları ve bu web partların değerlerini elde edip başka bir sayfada listeleme yapmam istendi. Daha evvel uğraşmadıgım bu konu hakkında internette de işe yarar bir kaynak bulamadım.
Bunun için değerli arkadaşım Y.Tarık Kranda ile(kendisi de en kısa sürede bloglarıyla aramızda olacak) SPWeb sınıfının tüm metodlarını derinlemesine inceleyip Site üzerindeki herhangi bir Web Part Pagedeki web partları elde edebileceğimiz metodu bulduk. Lafı fazla uzatmadan koda geçiyorum.

SPWeb webLists = SPContext.Current.Site.RootWeb.Webs["Listeler"]; //burda Listeler sitesini elde ediyoruz
SPLimitedWebPartManager man =webLists.GetLimitedWebPartManager("Pages/Favoriler.aspx", PersonalizationScope.Shared);
//Listeler sitesindeki Favoriler.aspx sayfasının Web Part Managerini elde ediyoruz
SPLimitedWebPartCollection webParts = man.WebParts;
//Favoriler.aspx'in web part koleksiyonunu alıyoruz
foreach (System.Web.UI.WebControls.WebParts.WebPart part in webParts)
{
if (part is TTNetAv.Audio.WebPart.EditorPlayListWebPart &&part.Visible)
{
TTNetAv.Audio.WebPart.EditorPlayListWebPart webPart=(TTNetAv.Audio.WebPart.EditorPlayListWebPart)part; //web partımızı Cast ediyoruz.

}
}
Sayfanın WebPartManager'ine eriştikten sonra sayfadaki istediğimiz web partları silebilir, yeni web part ekleyebilir, başka bir web partla consumer-provider ilişkisini set edebiliriz. Önümüzdeki postlarda bu konularda örnekler yapmaya çalışacağım.
Şimdilik iyi çalışmalar diliyorum herkese..

14 Mart 2009 Cumartesi

Choice Tipindeki Fieldlara Programatik olarak choice eklemek

Sharepoint listelerinde kullanılan Choice tipindeki kolonlara Choice eklemek için aşağıdaki kod bloğunu kullanıyoruz.
SPFieldMultiChoice choiceField = (SPFieldMultiChoice)myWeb.Fields["Yemekler"];

choiceField.Choices.Add("Pilav");

//eğer yaptıgımız field değişikliklerinin ilgili Liste ve içerik türlerine yansımasını istiyorsak fieldımızın PushChangesToLists özelliğini true atamamız gerekir.

choiceField.PushChangesToLists = true;

choiceField.Update();

Bir İnsan Neden Yazılımla Uğraşır?

Geçenlerde arkadas meclisinde böyle bir soruyla karşılaştım. Hemen cevap vermek istemedim ve uzunca düşündüm. Bu düşünme sonucu, sanırım kendi nedenlerimi buldum. Üniversiteye girerken bir bilinmezlikti Bilgisayar Mühendisliği benim için. Biraz çevreden aldıgım tepkiler, yorumlar, istikbali olan bir meslek oldugunun sık sık tekrarlanmasıydı kararımı şekillendiren. Fakat ünivesite yıllarında seçimimin eğlenceli yanlarını keşfetmeye başladım. Öncelikle problem çözmek, kafayı sürekli dinç tutan bir hadise ve beni mutlu eden bir durum. Etrafımda kafası çalışan, Mühendisliğin ve Yazılımın temelinde bulunan mantık kavramını hayatının her noktasında uygulayan ya da uygulamaya çalışan insanların olması da hoş.. Bir sorunla karşılaştıgınızda, forumlar yoluyla hayatınızda hiç karşılaşmadıgınız bir Hintlinin size yardımcı olması ve genel anlamıyla yazılım geliştiriciler arasında bulunan bu dayanışma da gerçekten büyüleyici.. Gittiğiniz işte müşteri dırdırıyla uğraşmadan kendi dünyanızda huzurlu bir biçimde kod yazabilmeniz, hatta freelance dediğimiz kendi evimizden işimizi yürütebilmemiz de çoğu insanın hosuna gider heralde. Diğer meslekleri kötülemek gibi bir derdim yok yalnız, yazılımla uğraşan insanlar gerçekten kıymetli insanlar. Uzaya uydu fırlatılıyor, tüm hesaplamaları yapan arkada çalışan yazılımlar. Arabadaki tüm sensörlerin arkasında, apartmanımızda katlar arası transportationı sağlayan asansörün işleyişinde, Sağlık sektöründeki tetkik cihazlarının arkasında, Internette gezindiğimiz sitelerde, oynadıgımız oyunlarda, ve daha tonlarca alanda çalışan başarılı yazılımlarla karşı karşıyayız. Bunların arkasındaki tanımadıgımız insanlara saygı duyuyoruz. Yazılımcıların geliştirdiği Msn Messengerı tüm dünya, genç yaşlı kullanıyor. Facebook çılgınlığı aldı başını gitti. Googlesız yaşayamaz olduk. Merak ettiğimiz her türlü bilgiye internetteki bu yazılım dehası search engine ile sahibiz artık. Dünyaya böylesi faydaları olan yazılım insanlardan biri olabilmek için ilk adım bunun eğitimini almak ve bu yolda ilerlemek. Bende bu alanda bir asker oldugum için kıvançlıyım, mutluyum.
Kalın Sağlıcakla

UserControlleri Web Partlarda Load Etmek

Senelerce bu konuda Return of SmartPart, Son of SmartPart gibi Jan Tielens isimli bir Sharepoint gurusunun yazdıgı uygulamaları imrene imrene kullandık, fakat user controlleri web partlarda gösterebilmek zaten basit bir hadiseymiş. Bildiğiniz gibi Web Part geliştirirken design time desteği alamıyoruz ve kod tarafında htmlTable,HtmlTableRow, HtmlTableCell, Generic Control, ASP.Net 2.0 server kontrolleri yaratmak özellik atamak, data gösteren DataList, Repeater, GridView, vb kontrollerin Templatelerini ve Bindinglerini yapmak zorunda kalıyoruz. User Controllerin sundugu design time supportla kodlarımızı geliştirmek hepimizin tercihi oluyor çoğu sefer. Peki bu yazdıgımız kontrolü Web Part olarak nasıl yükleyeceğiz?
İşte Cevap...
Öncelikle yarattıgımız UserControlün ASCX uzantılı dosyasını 12inin altındaki TEMPLATES/CONTROLTEMPLATES folderına kopyalıyoruz. UserControlümüzü içeren dll imizi uygulamamızın bin klasörüne kopyaladıktan sonra user controlümüzü Load edecek web partımızı aşağıdaki gibi oluşturuyoruz.

public class MainPageGalleriesWebPart:System.Web.UI.WebControls.WebParts.WebPart
{
MainPageGalleriesUserControl uc;
protected override void CreateChildControls()
{
this.ChromeType = PartChromeType.None;
base.CreateChildControls();
uc = (MainPageGalleriesUserControl)this.Page.LoadControl(@"\_controltemplates\MainPageGalleriesUserControl.ascx");
this.Controls.Add(uc);
}
}
Web Partımızın dllini uygulamamızın bin klasörüne ekleyip webPartımızı web.config dosyasında SafeControl olarak ekledikten sonra Uygulamamızda SiteSettings altındaki WebParts kısmına gidiyoruz. Buradan New Dİyerek WebPartımızı seçiyor ve Populate ediyoruz. Bundan sonra Sayfanızda web part Zonelara Web partınızı ekleyebilirsiniz artık. Bir hata yapmadıysanız Web Partınız içerisinde userControlünüzü görüntüleyeceksiniz. Sorularınız olursa yorumlar kısmına yazmanızı bekliyorum. Bir sonraki postta görüşmek üzere..

Sharepoint'te Picture Libraryleri ile işlem yapmak

Geçen gün bir projemiz kapsamında bir Web'deki Picture Libraryleri olusturulma tarihine göre en büyük 3ünü çekmem ve göstermem istendi. Listelerin itemları için CAML Queryler ile sorgular olusturup list itemlarını istediğimiz kriterlere göre çekebiliyorduk. Fakat sitedeki Picture Libraryler için böyle bir imkanımız yok sanırım, uzun aramalar sonucu kolay bir yol bulamadım ve aşağıdaki yolu izleyerek problemi çözdüm, umarım faydası olur herkese..

SPWeb webGalleries=SPContext.Current.Site.RootWeb.Webs["Galeriler"];
List libraries = new List();
foreach (SPList lib in webGalleries.Lists)
{
if (lib is SPPictureLibrary) //Eğer liste Picture Library Tipindeyse, kendi Collection ıma ekliyorum
libraries.Add((SPPictureLibrary)lib);
}

Yukarıdaki kod bloğuyla Webimizdeki Picture Library tipindeki listeleri kendi olusturdugumuz listeye ekliyoruz. Bundan sonrası hepimizin bildiği sorting işlemi.

for (int i = 0; i < libraries.Count; i++)
{
for (int j = i + 1; j < libraries.Count; j++)
{
if (libraries[i].Created > libraries[j].Created)
{
SPPictureLibrary temp = libraries[j];
libraries[j] = libraries[i];
libraries[i] = temp;
}
}

}
Bu şekilde Picture Librarylerimizi Yaratılma Tarihine göre sıraladık basit bir sorting algoritması kullanarak. Bundan daha basit bir şekilde Picture Libraryleri sorgulama imkanı olabileceğini düşünmekle beraber, sizden alternatif önerilerinizi bekliyorum. Bir sonraki postta görüşürüz..

2 Mart 2009 Pazartesi

SPSecurity.RunWithElevatedPriviliges() Metodu ve Kullanım Alanları

MOSS 2007 üzerinde uygulama geliştirme yaparken dikkat etmemiz gereken konulardan biri yazacağımız kodda x bi kullanıcıyı adimn gibi daha üst bir rolün yetkileriyle donatıp o yetkilere göre bazı işlemler yapmasını sağlayabiliriz. Mesela kodumuz içerisinden kullanıcılarımıza UserProfile nesnelerine erişip veri okuyup veri yazma hakkı verecek, sharepointteki bir document librarydeki bir dokümanı okuyup yazmasını sağlayacaksak(örnekler çoğaltılabilir), yetki sorunuyla karşılaşırız çoğu zaman. Bu sorunu aşmanın yolu SPSecurity sınıfının RunWithElevatedPriviliges static metodunu bir delege parametreyle çağırmak ve bu delege yoluyla öncelikle yeni bir SPSite nesnesi yaratıp, bu elevate edeceğimiz priviligeların geçerli olacağı siteyi belirtip daha sonrasında elevate ettiğimiz kullanıcının yetkilerine sahip olarak işlemlerimizi yapmak.
Örnek kodu da aşağıda paylaşıyorum. Bir sonraki postta görüşmek üzere..

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite topSite = new SPSite(SPContext.Current.Site.WebApplication.Sites["/"].ID))
{
SPFolder folder = topSite.RootWeb.GetFolder(belgelerFolder);

SPFileCollection files = folder.Files;
SPFile file = files["GnTahmin.xml"];
doc.Load(file.OpenBinaryStream(SPOpenBinaryOptions.None));
}
}
);

Anonim kullanıcılara bir liste üzerinde Programatik olarak yetki vermek

Son projem çerçevesinde bazı anketlere anonim kullanıcılar için edit items ve add items yetkisi verilmesini sağlamam istendi. Bildiğiniz gibi sharepoint surveylerinde girilen her bir entry için öncelikle newForm.aspx, sonrasında da editForm.aspx çağırılır. Yani önce anket cevap itemını newForm.aspx ile yaratıp EditForm.aspx ile bu yaratılmış cevabı düzenlersiniz. Bu çerçevede survey tipinden olusturulan listelere ya da daha genel olarak tüm listelere anonim olarak item eklemek, editlemek vs gibi işlemler için listenin AnonymousPermMask obsolete özelliğini ya da obsolete olmayan AnonymousPermMask64 özelliğini kullanıyoruz.
Aşağıda projemizden bir örneğini görebilirsiniz.

SPList objSurvey = SPContext.Current.Web.Lists["Anketim"];
objSurvey.AnonymousPermMask64 =(SPBasePermissions.Open |

SPBasePermissions.OpenItems |

SPBasePermissions.ViewFormPages |

SPBasePermissions.UseClientIntegration |

//SPBasePermissions.UseRemoteAPIs |

SPBasePermissions.ViewListItems |

SPBasePermissions.AddListItems);

objSurvey.Update();

Bir sonraki postumda tüm login olmuş authenticated kullanıcılara yetki vermek ve bir Sharepoint security group a yetki vermekten bahsedeceğim.
Herkese iyi çalışmalar..

SPDisposeCheck Toolu yayınlandı

Sharepoint obje modeliyle çalışırken SPSite ve SPWeb objelerini new keywordüyle yarattıgımızda memoryde sitenin bir instance ını olusturdugumuzu düşünün. Bu instance'ın dispose edilmesi uygulamamızın hızlı çalışması açısından kritiktir. Using keywordüyle ya da işimiz bittiğinde kendimiz dispose metodunu çağırarak bu objeleri dispose edebiliriz. Microsoft, compile edilen assembly kodlarını bile okuyarak dispose edilmeyen ve memory leakler olusturabilecek kodları bulan SPDisposeCheck isimli toolunu yayınlamış.Sizde bu adresten bu toola erişerek Sharepoint obje modeliyle çalısırken best practice lere uyup uymadıgınızı ya da unuttugunuz kod içinde dispose edilmeyen SPWeb SPSite objelerini bulup kodunuzu düzeltebilirsiniz