6 Kasım 2009 Cuma

SP 2010 ile Beraber gelen İlişkisel Liste Desteği

WSS3 ile çalısırken ilişkisel listeler yaratmak desteklenmiyordu. Bu amaçla bir çoğumuz lookup fieldlar kullanmıstır. Veri tutarlılığı(referential integrity) sağlamak biz kendimiz birşeyler yapmadıkça desteklenmiyordu. Sharepoint 2010u geliştirenler bunu dikkate almıslar ve bir takım yeni featurelarla gene lookup kolonları baze alarak bir takım geliştirmeler sağlamışlar.
Lookup tipte bir kolon yaratmak istediğinizde, bir takım yeni seçenekleriniz olduğunu göreceksiniz. Gene hangi listeye lookup yapacağımızı ve value fieldımızı seçerken, sayfanın alt kısmında Veri tutalılığını koru gibi bir opsiyon sunulmuş( Maintain referential integrity).Bu opsiyonla ana listeden bir item silindiğinde bunun çocuk listeye de aktarılması ya da çocuk listede item varsa parent listede bu silme operasyonun engellenmesi gibi özellikler sağlanabilmekte.
Bununla kalmıyor geliştirmeler! Çocuk listede ana listedeki içeriği görüntülemek isteyebiliriz. Mesela faturalar listesine bakarken faturanın idsi haricinde fatura üzerindeki ismi de görüntülemek isteyebiliriz. Daha evelki versiyonda, bu amaçla listeyi sorgulayıp linq veya başka bir şeyle join yapmak için custom kod yazmamız gerekiyordu. Bilginize.. CAML artık join leri destekliyor, her ne kadar artık LINQ TO Sharepoint kullanıcağımız için camla pek gereksinim duymayacağımızı düşünmeme rağmen bu bilgiyi de vermiş olayım.. Neyse fazla dağılmadan konumuza dönmek gerekirse Sharepoint 2010 sürümünde çocuk listede Parent Listedeki birden fazla site kolonunu viewlarınızda kullanıp farklı viewlar hazırlayabiliyorsunuz..

Sharepoint 2010: 12 Hive+2= 14 Hive

Sharepoint 2007 ile çalışanlar için 12 Hive yani C:\Program Files\Common Files\Microsoft Shared\Web Server Extension\12 adresi belleklere kazınmıştır. Artık bu adresi C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14 ile değiştirebilirsiniz.Belli ki Microsoft 13 numarasının uğursuzluğunu düşünmüş. Artık bu folder üstünde bir çok işlem gerçekleştireceğiniz folder oldu anlayacağınız. Gerçi yeni Visual Studio 2010 tools ile bu foldera çok sık olaak girmek zorunda kalmayacaksınız. Bu postumda 14 hive ile ilgili gözüme ilk çarpanlar hakkında bir özet geçeyim istedim. 12 altındaki folderlar 14 hive da da korunmuş fakat bir kaç yeni folder eklenmiş.

14Hive da 3 tane yeni folder dikkatimi çekti.
* UserCode
* WebClients –Client OM için kullanılıyor sanıyorum
* WebServices – Bir çok yeni .svc dosyası içeriyor

ISAPI Folderında hangi assemblylerin bulundugu ilginizi çekiyorsa aşağıdaki listede bunu bulabilirsiniz. Henüz rastlamamama rağmen, bazı sınıflar farklı dll ler içine geçmiş.

* Microsoft.BusinessData.dll
* Microsoft.Office.DocumentManagment.dll
* Microsoft.Office.Excel.Server.Udf.dll
* Microsoft.Office.Excel.Server.WebServices.dll
* Microsoft.Office.Policy.dll
* Microsoft.Office.SecureStoreService.Security.dll
* Microsoft.Office.Server.dll
* Microsoft.Office.Server.Search.dll
* Microsoft.Office.SharePoint.ClientExtensions.dll
* Microsoft.Office.UserProfiles.dll
* Microsoft.Office.Word.Server.dll
* Microsoft.Office.Workflow.Actions.dll
* Microsoft.Office.Workflow.Tasks.dll
* Microsoft.SharePoint.Client.dll
* Microsoft.SharePoint.Runtime.dll
* Microsoft.SharePoint.dll
* Microsoft.SharePoint.Linq.dll
* Microsoft.SharePoint.Portal.dll
* Microsoft.SharePoint.Publishing.dll
* Microsoft.SharePoint.Search.dll
* Microsoft.SharePoint.Search.Extended.Administration.Common.dll
* Microsoft.SharePoint.Search.Extended.Administration.dll
* Microsoft.SharePoint.Search.Extended.Administration.ResourceStorage.dll
* Microsoft.SharePoint.Search.Extended.Administration.Query.dll
* Microsoft.SharePoint.Security.dll
* Microsoft.SharePoint.Taxonomy.dll
* Microsoft.SharePoint.Taxonomy.Intl.dll
* Microsoft.SharePoint.Workflow.Actions.dll
* Microsoft.Web.CommandUI.dll

5 Kasım 2009 Perşembe

Sharepoint 2010 Visual Web Partla Tanışalım

Sharepoint 2007de web part geliştirirken arayüzümüz yoktu. User controllerimizi 12/Template/controltemplates altına atıp bir web partla bu user controlu load etmek en iyi alternatifimizdi. Visual Studio 2010'da web partlarla çalışmak için bir designerımız var artık.. Visual Web Part SPI( SPI, sharepoint project Itemı temsil ediyor) ile bir web part yaratmak istediğinizde bu size bir .cs dosyası, bir .webpart dosyası, bir elements.xml dosyası ve de yeni olan bir .ascx dosyası yaratıyor.Evet, gerçekten bir ASP.NET user control yaratıyor. Visual studio bu dosyaları güzelce gruplama adına güzel bi iş yapmış. Web partın designerını açtığınız zaman, User controlün designerı otomatikman açılıyor.
Simdi hemen aklınıza bunun nasıl çalıştıgı geliyordur. Sharepoint maalesef hala user controlleri direkt olarak host edmiyor. Burada tek yapılan içinde Page.LoadControl metoduyla bizim user contolümüzü parametre geçtiğimiz bir web part yaratmak. Esasında bu zaten bizim yıllardır user controlleri Sharepoint içerisine deploy etme taktiğimizdi. Ama burada güzel olan Visual Studio nun bu user controllerin deploy edilip sharepoint üzerinde kullanılması işlemini kolaylaştırmış olması..

Sharepoint 2010'da bir ListItemın varolup olmadığını kontrol etmek

Sharepoint 2010 API ile bir takım eksiklikler düzeltilmiş. Bildiginiz gibi SPWeb sınıfının GetList metodu eğer bu isimli bir list yoksa exception throw ediyordu, dolayısıyla bu kodumuzu try-catch blokları içinde yazmak gerekiyordu.
Yeni API ile beraber TryGetList isimli bir fonksiyonumuzu mevcut..
Aşağıdaki kod bloğuyla bunu örnekliyorum.

2 Kasım 2009 Pazartesi

Kişinin bilgisayarında MOSS Yüklü olup olmadıgını Kod tarafında Tespit Etmek

Kişi bilgisayarında MOSS yüklü olup olmadığını anlamanın en temiz yolu registrye göz atmaktır. Registry ile ilgili işlemlerimizi yapmak için mscorlib. dllinin Microsoft.Win32 namespaceinin altındaki RegistryKey sınıfından faydalanırız.
bool isMossInstalled = false;
string keyname = @"SOFTWARE\Microsoft\Office Server\12.0";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyname))
{
if (key != null)
{
string version = key.GetValue("BuildVersion") as string;
if (version != null)
{
Version buildVersion = new Version(version);
if (buildVersion.Major == 12)
{
isMossInstalled = true;
}
}
}
}

Lists.asmx web servisi ile LINQ TO XML kullanmak

Bildiğiniz gibi Sharepoint web servislerinin döndürdüğü xml datalarını parse etmek her zaman sorunlu ve can sıkıcı olmuştur. Lists.asmx web servisiyle listelerin sorgulandığına daha önceki postlarımda değinmiştim. Bu postta linq to xml yardımıyla dönen sonuçları parse etmeye değineceğim. Bunun için visual studio 2008de bir windows uygulaması geliştireceğiz. Burada projemize referans olarak lists.asmx web servisini ekliyoruz. Bunu yaptıktan sonra yapmamız gereken app.config dosyası ayarıdır. Sharepoint uygulamamız NTLM Security kullandığı için app.config deki HttpBinding elementinin securityMode unu Default değeri olan none dan TransportCredentialOnly değerine çekmemiz transport elementinin clientCredentialType ve proxyCredentialType özelliklerini "Ntlm" e çekmemiz gerekir. Aksi takdirde web servisimizin metotlarını çağırmak istediğimizde hata alırız.


şeklinde ayarlarımızı düzenledikten sonra uygulamamıza geçelim.
uygulamamızın kodu aşağıdaki gibidir.


Bu şekilde Sharepoint uygulamamızdaki listeleri web servisten dönen xmli linq to xml ile parse ederek göstermiş oluruz.
Linq to xml gerçekten hayatı kolaylaştırıyor..

23 Ekim 2009 Cuma

Sharepoint Crawling ile ilgili bilinmesi gereken hatalar

Error in Microsoft Windows SharePoint Services Protocol Handler şeklinde bir hata alırsanız crawl sırasında bunun nedeni I( büyük ı harfi) ile başlayan site isimleri olabilir. Uygulamamızdaki Infocenter sitesi altındaki hiç bir content crawl edilememiş ve crawl loglarında yukarıda belirtiğim hata ile karşılaşmıştım. Infocenter olan site ismini infocenter olarak değiştirip yeniden crawl başlattığımda sorun çözüldü.

19 Ekim 2009 Pazartesi

SSP Problemi

The DataSourceID of 'QuickLaunchMenu' must be the ID of a control of type
IHierarchicalDataSource. A control with ID 'QuickLaunchSiteMap' could not be
found hatası almaya başladım birden bire ssp uygulamamı açmak istediğimde. Hiç bir yerini editlememe rağmen bu hatayı almam ilginçti. Uzun uğraşlar sonucu hatanın kaynağını buldum. yazdıgım bir solution global olarak deploy edilince ssp uygulamamın web.config dosyasındaki safe controllere bir entry yazmış. Bu safe control entrysini silince sorun düzeldi. Bu hata ile karşılaşmanız durumunda kulağınıza küpe olsun

7 Ekim 2009 Çarşamba

Sharepoint'te doküman kütüphanelerine yüklenebilecek dosya boyutu limitini değiştirmek

Sharepoint'te bir doküman kitaplığına dosya eklemeye çalıştığınız zaman izin verilen maksimum dosya boyutu 50 MBdır. Bu boyutun üstünde bir dosyanın Sharepoint server üzerinde tutulması tavsiye edilmese de böyle bir istekle karşılaştığınızda yapmanız gereken Central Administration>Application Management>Web application general
settings sekmelerini izleyerek maksimum dosya boyutunu arttırmaktır. Maalesef bildiğim ve araştırdığım kadarıyla bu dosya boyutunu sadece uygulamadaki bir doküman kitaplığı üzerinde arttırmak mümkün değil.

Kendi STSADM commandimizi yaratmak

Geçen gün internette Sharepoint üzerine favori bloglarımı incelerken çok ilgimi çeken bir postla karşılaştım. Bugüne kadar default metotlarını kullandıgımız Stsadm'e metot eklememiz meğer mümkünmüş. ISPStsadmCommand arayüzünü implemente edip Run ve GetHelpMessage metotlarının içlerini doldururuz. Yapılacak işlemleri Run metodunun içine yazmamız gerekirken Help istendiğinde kullanıcıya gösterilecek mesajı döndüren metot GetHelpMessage metodudur. Sınıfımızı yarattıktan sonra oluşan dlli sign edip gac a attıktan sonra C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\CONFIG altında stsadmcommandnameimiz.xml uzantılı bir dosya oluşturarak bu dosyada commands node unun altına command nodeları şeklinde kendi commandlerimizi yazarak işlemi tamamlarız. Her bir command sekmesinin altında name ve class elementleri bulunmalıdır. Name elementi operasyonun adını tutarken, class da bu operasyonun tanımlandıgı sınıfı tanımlar. Bununla ilgili örneği Liam Clearynin blogundaki yazıda bulabilirsiniz. Konuyla ilgili deneme yaparken sorularınızı bekliyorum..

6 Ekim 2009 Salı

Productiondaki Sitemizle Development yapabilmek için ne yapmak gerekir?

Evet, .net uygulamalarında bildiğiniz gibi productiona aldığınız uygulamanızın veritabanını yedekleyip kendi localinize restore ederek production ortamınıza karşı geliştirme yapmayı sağlayabilirsiniz, fakat durum Sharepoint uygulamaları yapıyorsanız biraz daha karmaşıktır. Sharepoint MVPlerinden Andrew Connell'ın bu konuda yazdığı makale ilginizi çekecektir. Çok güzel bir biçimde anlatılmış ve sharepoint developerlarının en büyük sorunlarından birine çözüm olacaktır.

4 Ekim 2009 Pazar

Doküman Kitaplığında bir itemın check-outlu olup olmadıgını anlamak

Sharepoint doküman kitaplıkları(Document Library) ile uğraşırken en önemli problemlerden biri Doküman kitaplığında bulunan bir sayfanın özelliklerini değiştirmek istediğinizde sayfayı check-out etmeniz gerektiğidir. Bunu kod tarafında yapmak istersek SPFile nesnemizin "CheckOutStatus" isimli özelliğini kontrol etmemiz gerekir. Bu özellik SPFile.SPCheckOutStatus tipinde bir enum değeri taşır. Bu enumerasyonun alabileceği Değerler;
1) None--> dosya check out edilmemiştir.
2) LongTerm--> Dosya Sharepoint arayüzü tarafından checkout edilmiştir.
3) LongTermOffline--> Dosya çevrimdışı editlenmek üzere check out edilmiştir.
4) ShortTerm--> Dosya bir client uygulama tarafından lock edilmiştir.

Bizim projemizde bana gereken check-out edimemiş dosyayı check out etmek ve editlemekti. Bunun için
if(file.CheckOutStatus==SPFile.SPCheckOutStatus.None)
file.CheckOut();

Kodu yeterli olacaktır.

1 Ekim 2009 Perşembe

Sharepoint 500 Internal Server Error hatası

Geçen farma bir server ekledik, ve o server üzerinde bir uygulama çağırdığımda 500 Internal server error hatası ile karşılaştım. Ne Event Logda ne de server loglarında bir detaylı bilgi bulamadım. Bunun üzerine epey bir uğrastıktan sonra Central Administration > Operations > Diagnistic Logging sekmesi altındaki Logging Level ımı "unexpected" dan "verbose" a değiştirdim ve sayfayı çağırdığımda
"Cannot make a cache safe URL for "init.js", file not found.
Please verify that the file exists under the layouts directory."
hatası ile hatanın içeriğine erişebildim. Bu hata farma yeni eklenen makineye dil servis paketinin yüklenmemiş olmasından dolayı her dil servis paketinde bulunan init.js dosyasının bulamamısından kaynaklanıyormuş.

BLOB Caching

BLOB Caching nedir önce ondan başlayalım. BLOB , Binary Large Object anlamına gelir, BLOB Caching ise Binary yapıdaki büyük sizedaki objelerin cachlenerek Sharepoint Uygulamalarımızın performansının artmasını sağlayan bir mekanizmadır. BLOB Caching aktifleştirildiğinde, Web Front Endimizin database servera gidip gelmek için yaptıgı round trip sayısı azalır, Site Collection üzerindeki tüm imajların front endimizin diskinde tutulması sağlanmış olur. Blob caching ayarları uygulamanın web.config dosyasından yapılır. Bu ayarlarda en önemli özellik max-age özelliğidir. Bu özellik saniye cinsinden browserın web front ende bir imaj sormak için gitmemesi gereken süreyi belirtir. Aşağıda gördüğünüz web.config deki BlobCache sekmesi tüm imajların web front endimizin c:\blobCache diziinde depolanmasını ve browserın 24 saat süresince istekte bulunmamasını sağlayacaktır.
<BlobCache location="C:\blobCache" path="\.(gif|jpg|png|css|js)$" maxSize="10" max-age="86400" enabled="true"/>

Programatik olarak SPFieldLookup yaratmak

Epeydir projeler dolayısıyla blogumu güncelleyememiştim. Bazı yazılarım yazılımkulubu.com tarafından yayınlandı. Oradan da faydalı birtakım paylaşımlarıma ulaşabilirsiniz . Bugünkü yazım kısa bir SPFieldLookup yaratma örneği olacak, umarım faydalı olur. MyList isimli listeme Lookup isimli MylookupList isimli listenin Title fieldına lookup yapacak bir field eklemek için gerekli kod aşağıdaki gibidir
SPList myList = web.Lists["MyList"];
SPList myLookupList = web.Lists["MyLookupList"];

myList.Fields.AddLookup("Lookup", myLookupList.ID, false);
SPFieldLookup fieldLookup = myList.Fields["Lookup"] as SPFieldLookup;
// Display Title Column in lookup field
// (this is shown by default but this way you can change it)
fieldLookup.LookupField =
myLookupList.Fields[SPBuiltInFieldId.Title].InternalName;
fieldLookup.Update();

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

24 Şubat 2009 Salı

Sharepoint Survey EditForm.aspx nasıl editlenir?

Uğrastığım proje kapsamında Sharepoint'in anket yapısını customize etmem gerektiğinden bahsetmiştim. Sharepoint'in yapısı gereği ankete başladıgınızda bulundugunuz Anketin New Form.aspx sayfası, ankette ilerleyip başka bir soru için sayfa atladığınızda EditForm.aspx sayfası yüklenir. Benden her sayfaya ankette soruların % kaçı cevaplandıgına dair bir progress bar koymam istendi. NewForm.aspx ilk soru için çalışacağı için ilk sayfada %0 yazmasında bir sakınca yoktu. Fakat ankette dallanma sonucu başka bir sayfaya yönlendiğimizde EditForm.aspx sayfası yükleniyor. Burdaki mantık aslında gayet basit.. Ilk soru için NewForm.aspx'in çalısmasının sebebi Sharepoint anketine yeni bir cevap giriyor olmamız. Yani listeye yeni bir item giriyoruz dolayısıyla diğer tüm listelerde oldugu gibi NewForm.aspx sayfasıyla item olusturuluyor. Daha sonraki her cevabımızda kendi olusturdugumuz list item'ı editlemiş oluyoruz. Neyse bu kısa ön bilgiden sonra konumuza dönelim...

Öncelikle EditForm.aspx sayfası yüklendiğinde FirstField parametresinin içi o sayfada görüntülenecek ilk soru bilgisiyle dolar(EditForm.aspx?FirstField=naber gibi).
Bütün bu sorular anketimizin fieldlarına 0 indexinden başlayarak ekleniyor.Standart bir anketin 43 tane field ı oldugunu bildiğimize göre mevcut anketin field sayısından 43 ü çıkararak kaç tane soru oldugunu bulabiliyoruz.
FirstField QueryString değerini okuyarak da Sayfada görüntülenecek ilk soru değerini(Bu da anketin bir fieldına tekabül ediyor) alabiliyoruz. Bu ilk sorunun yani anket fieldının, anket fieldlarında kaçıncı sırada oldugunu bulup bunu toplam soru adetine oranlayarak anketin % kaçına geldiğini bulabiliyoruz kullanıcımızın. Mevzu kısaca bu, pek kısa olmadı gerçi.. Neyse Kodumu da açıklayıcı olması açısından aşağıya koyuyorum.

using System;using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
namespace TTEIMWebControls.UserControls.AnketCustomization
{public partial class AnketProgressBar : System.Web.UI.UserControl
{protected void Page_Load(object sender, EventArgs e)
{if (!this.IsPostBack)
{string firstField=Request.QueryString["FirstField"].ToString();
if (!firstField.Equals(string.Empty)){
string anketName = GetAnketName();
SPWeb curWeb = SPContext.Current.Web;
SPField field = curWeb.Lists[anketName].Fields.GetFieldByInternalName(firstField);
bool fieldExists = CheckField(field, curWeb.Lists[anketName]);
if (!fieldExists){
SPList anketList = curWeb.Lists[anketName];
/*each Question created by the user is added as a field, that's why we get the number ofquestions by subtracting the number of already existing fields from the total field count*/

int totalSoru = anketList.Fields.Count - 43;
int index = 1;/*we get the current question's index by iterating over the list's fields from* the start and break the loop whenever we find that question field*/
foreach (SPField fieldI in anketList.Fields){
if (fieldI.InternalName.Equals(firstField))
break;
index++;
}
int mevcutSoruİndex = index;
double percentage = ((double)100 / totalSoru) * index;

}
}
}
}


Bu user controlümüzü C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES dizini altına kopyalıyıp ilgili dll'i GAC'a deploy ediyoruz. Sonrasında Sharepoint Designer yardımıyla sitemize bağlanıp istediğimiz Anket'in EditForm. aspx 'inin içerisine register edip yerleştiriyoruz. Bundan sonra yarattıgımız anketlerin bu EditForm.aspx'i kullanmasını istiyorsak mevcut Anketimizi şablon olarak kaydedip bundan sonraki anketlerimizi bu şablondan yaratabiliriz.
Hepinize iyi çalışmalar..

23 Şubat 2009 Pazartesi

Go Mongo Adında bir Restaurant

Madem blog kişiye özel bir olgu, o zaman bende biraz özel hayatımdan ufak tefek ipuçları vererek sizlerle hayatımı paylaşayım.
Doğumgünüm 6 Temmuz'da babamın ısrarları sonucu Suadiye'deki Moğol restoranı Go Mongo ile tanıştım. Başta Moğolistanın İngilizcedeki karşılığı olan Mongolia(Mongolistan) ülkesinin yemekleriyle tanısacak olmanın yarattıgı garip ruh hali, doğumgünümün boka sarmasından duydugum endişe ve masada karşılaşabileceğim ne işe yarayacağını bile tahmin edemeyeceğim sayıda çatal kaşıkla dolu kasıcı bir gece yasama çekinceleriyle girdim Go Mongo'nun kapısından. Gerçekten şaşırtıcı derecede hos bir ambiyansı var mekanın. Yaz olması dolayısıyla terasta oturduk. Yemek öncesi birşeyler içebileceğiniz bir barı var. Genelde rezervasyon yapmayanların ayakta kaldıgı bu mekanda bi barın bulunması da fena fikir olmamış açıkçası. Yemek olarak babamın tavsiyesi üzerine Mongolian Barbeque tercih ettim. Değişik bir konsept...
Size verilen tabağı, barbekü büfesinde tıka basa doldurabiliyorsunuz.
Barbekü büfesinde neler yok ki.. Dana eti, kuzu eti, tavuk, levrek,karides, aklınıza gelebilecek her türlü sebze ve garnitür. Tabi bütün bunlar pişmemiş durumda. Kendi kombinasyonunuzu yapıyorsunuz ve büfenin bir diğer ucunda sizi güler yüzle bekleyen kızın yanında alıyorsunuz soluğu. Elindeki noodle dolu bardağın üstüne aldıgınız etlere uygun bir sos belirliyorsunuz beraberce ve tahminimce mekanı Moğol yapan pişirme bölümüne geçiyorsunuz. Kombinasyonunuz daha evvel karşılaşmadıgım ilginç bir tezgahta pişiyor ve istediğiniz takdirde pişerken zevklen izleyebiliyorsunuz yemeğinizi. 5-10 dk sonrasında o muhteşem lezzetle tanısma fırsatını yakalıyorsunuz. Gerçekten enfes:P. Bu benim fikrim elbette.. Sizi en mutlu edecek kombinasyonu yakalamanız belki biraz zaman alabilir ama tahminimce her Go Mongo'ya gittiğinizde yüzünüzde mutlu bir tebessümle beni anacaksınız.
Su anda gece yarısı ve acıktım, acilen hiç olmazsa bir dürüm atıştırmam lazım, Kalın sağlıcakla..

if(Sendikalasma==null) {developer.Surun();}

Bugünkü yazımda Developerlar olarak içinde bulundugumuz büyük tehlikeye karsı birazcık duyarlılıgımızı arttırmamızın şart oldugu konusundan dem vuracağım. Nedir bu büyük tehlike?
Yıllardır süregelen bir durum olmasına rağmen bu kadar eğitilmiş insanın kendini savunmak için tek bir harekette bulunmamasını anlamakta güçlük çekiyorum. Milyon dolarlık projeler 2-3 developerın özverili çalısması sonucu 10-15 günde bitirilirken, bu developerların hayatları büyük sekteye uğruyor. Gece ofislerde sabahlamalar, dengesiz beslenme, uyku düzeninin bozulması, saatlerce maruz kalınan radyasyon sonucu bilimum hastalık ihtimali, Gözlerde ortaya çıkan ışığa karsı hassasiyet ve bence en ağır olanı sömürülmeye karsı bu kadar tepkisiz kalmak. Yani sonuçta bu bir alışverişse alanın da verenin de bu takastan memnun ayrılması gerekirken, çevremde mutlu developer görmekte güçlük çekiyorum. Bilişim öğrencileri yetiştiren kurum furyasının yükselmesi sonucu işverenler bunu bir koz olarak kullanıp ya çalısırsın ya da senin yerine çalışacak birini buluruz felsefesini benimsemiş durumda. Peki biz developerlar olarak bu kadar savunmasız olmayı kabullenecek miyiz?
Bence Hayır. Bu işin tek çözümü bu bireyselliklerimizi bir kenara koyup birimiz hepimiz için olmaktan geçiyor. Sendikalaşıp standartlarımızı yukarı çekmeye, insan olarak yasam kalitemizi bu kadar ayaklar altına aldırmamaya mecburuz. Bu Yazı ne kadar çok developera ulasırsa bu konuda yapabileceklerimiz konusunda bi o kadar pozitif feedback alabileceğimizi düşünüyorum. Yorumlarınızı ilgiyle bekliyorum.
Kalın Sağlıcakla

19 Şubat 2009 Perşembe

MOSS 2007'nin temel taşı: CAML Query

MOSS 2007 verilerini listeler aracılıgıyla tutar. En basitinden herhangi bir sayfa bile Pages listesinin itemlarındandır. MOSS 2007 ile gelen listeler WSS 'de varolan listeler ve kullanıcının kendi olusturdugu listeler olmak üzere dataların saklandıgı bir çok liste tipi mevcuttur. Peki bu listelerden verileri alıp kod tarafında bir takım işlemler uygulayıp göstermek için bu listelere nasıl sorgu atabiliriz?
Bunun için 2 tane yolumuz var. Bunlar web servisi yardımıyla atılacak sorgular ve daha yaygın olanı obje modelini kullanarak atılacak sorgulardır. Bu sorgularda kullanılan dil olan CAML (Collaborative Application Markup Language), Sharepoint ürünlerinde kullanılan xml tabanlı bir dildir. CAML sorguları olusturmak çoğu zaman zahmetli olacağı için u2u firması, CAML Query Builder isimli, yaygın olarak kullanılan bir ürün çıkarmıştır. linkinden bu ürüne ulasabilirsiniz.

Bu blogumda basit bir CAML Liste sorgusu örneği vererek sizlere bir start vermek istiyorum. Bu örnek için bir Console Application olusturuyoruz. Bu uygulamamızda Rating kontrolüyle puanlanan Sayfaların Url'lerinin ve verilen Puanların tutuldugu Puanlar isimli listemizden 3 puan verilen itemları getirmeye çalısacağız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;

namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
using(SPSite site=new SPSite("http://eelkabes:600"))
{
using(SPWeb currentWeb=site.OpenWeb())
{
//Puanlar listemizi SPList tipindeki lstPuanlar değişkenimize atıyoruz
SPList lstPuanlar = currentWeb.Lists["Puanlar"];
// Listeyi sorgulamak için kullancağımı SPQuery sınıfından bir instance yaratıyoruz
SPQuery query = new SPQuery();
//Puanlar Listesinden Puan Field değeri 3 olan itemları getirecek sorgumuzu olusturuyoruz
query.Query = @" <Where>
<Eq>
<FieldRef Name='Puan' />
<Value Type='Number'>3</Value>
</Eq>
</Where>";
//SPList sınıfının GetItems metoduna SPQuery objemizi parametre olarak vererek listemizi sorguluyoruz
SPListItemCollection items=lstPuanlar.GetItems(query);

//Sonuç kümemiz içerisinde dolaşarak Puanlanan Item'in URL alanının değerini Console'da gösteriyoruz
foreach (SPListItem item in items)
{
Console.WriteLine(item["URL"]);
}
Console.ReadLine();
}
}
}
}
}


Kodumuz bu kadar. CAML'a böylece giriş yapmış olduk. Bir sonraki blogumda Sharepoint Web Servisleri yardımıyla sorgular olusturup kayıtları sorgulayacağız ve update edebiliyor olacağız. Bir sonraki blogumda görüşmek üzere...

MOSS 2007'de user controlleri kullanmak

Sharepoint'de user controllerini pagelerde göstermenin bir çok yolu var. En çok kullanılanı Hollandalı üstat Jan Tielens'in son of smartpart, return of smartpart gibi bir takım türevleri olan web partını koyup bu web partta görüntülenmesini istediğiniz user controlleri smartpartın istediği klasöre kopyalamak ve dll'i gac a basmak. Bu işlem basit gözüküyor, fakat bu toolu kullanmadan da user controlleri sharepoint pagelerine koyabilirmiyiz sorusuna cevap ararken su anda çalıstıgım projedeki danısmanım Nezih Tınas çok basit başka bir yöntem göstererek bir nevi ufkumu genişletti. Ne demişler, bana bir kelime öğretenin bin yıl kulu kölesi olurum diye, kendisiyle yıldızımız çoğu zaman barısmasa da teşekkürlerimi sunuyorum kendisine ve yazdıgı ilk Türkçe MOSS kitabını okumanızı tavsiye ediyorum. tıklayarak kitap hakkında daha fazla bilgi alabilirsiniz. Neyse biz konumuza dönelim fazla dağılmadan. User controlümüzü olusturduktan sonra yapacağımız hareket ascx uzantılı dosyamızı C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES klasörünün altına koymak vace ilgili dll'i ya GAC'a ya da bine kopyalayıp web.configde ilgili dll'leri register etmek.

Daha sonra kullandıgım en kötü tool olmasına rağmen rakibi olmaması sebebiyle kullanmak zorunda oldugumuz Sharepoint Designer yardımıyla portalimize erişip bir sayfaya bu kontrolü register ederek yola devam ediyoruz

<%@ Register TagPrefix="tteim" TagName="GS" Src="~/_controltemplates/TTEIM/AnketGirisUserControl.ascx" %> //AnketGirisUserControlümüzü register ediyoruz.

Ve en son olarak da
bu kontrolümüzü form taglarının arasına yerleştirerek misyonumuzu tamamlıyoruz.


Bundan sonra sitenizde kontrolü yerleştirdiğimiz sayfaya giderek user controlümüzü görebiliriz

Timer Job Nasıl Install edilir?

bir önceki blogumda MOSS'da bir timer jobun nasıl yazılacağından bahsetmiştim. Peki bu jobu nasıl install ederiz? Ne zamanlarda çalısacağını nasıl belirtiriz?
Bu blogumda bu konulara açıklık getirmek istiyorum. Bir önceki blogumda yazdıgım jobu install ederek başlayalım. Bu jobu bir FeatureReceiver yazarak deploy etmek en kullanıslı yoldur. SPFeatureReceiver classından türeyen bir sınıf yaratıp, bu abstract sınıfın metodlarını implement ediyoruz.

class ProfileBasedReportInstaller:SPFeatureReceiver
{
const string TASK_LOGGER_JOB_NAME = "My Reporting Job"; //jobumuzun central administrationdaki joblar arasında görülecek ismi

public override void FeatureInstalled(SPFeatureReceiverProperties properties)
{
}

public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
{
}

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = properties.Feature.Parent as SPWeb;

// make sure the job isn't already registered
foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions)
{
if (job.Name == TASK_LOGGER_JOB_NAME)
job.Delete();
}

// install the job
DailyProfileBasedRatingReportJobDefinition myjob = new DailyProfileBasedRatingReportJobDefinition(TASK_LOGGER_JOB_NAME, web.Site.WebApplication); //jobumuzdan bir instance yaratıyoruz

//jobumuzun çalısacağı zamanları set ediyoruz
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 1;
schedule.EndSecond = 59;
schedule.Interval = 1;
myjob.Schedule = schedule;

myjob.Update();
}


İşte jobumuz için bu featureReceiver ı yazdıktan sonra yapmamız gereken iş C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES klasöründe yeni bir folder olusturarak feature.xml imizi içine koymak.
Feature.xml imizin içinde feature ımızın receiver classını ve receiver Assemblysini yazmamız yeterli olacaktır.

Örnek feature.xml için kendi feature.xml imin içeriğini aşağıya kopyalıyorum.


18 Şubat 2009 Çarşamba

MOSS 2007'de Timer Job nasıl Yazılır?

Uğrastıgım proje kapsamında yarattıgımız MOSS portali kullanıcılarının portaldeki sayfaları Ajax Control Toolkit'in rating kontrolüyle oylamaları ve bu oyların Puanlar isimli bir listede URL, Puan gibi custom sütunlar olusturularak tutulması isteniyordu. Burada ilginç birşey yok, fakat isteğin devamında günlük bir sharepoint jobun çalısarak bir excel dosyasına listedeki itemları yazdırması ve yazdırırken Oylayan kullanıcının Profilinden de bazı bilgileri çekerek onları da yazması isteniyordu.
Sharepoint timer jobu yazmak için ilk yapılması gereken Microsoft.Sharepoint.Administration namespace'inde bulunan SPJobDefinition classından türeyen bir sınıf yaratmak.

class DailyProfileBasedRatingReportJobDefinition:SPJobDefinition
{
Workbook book;
Worksheet sheet;
WorksheetRow row;
public DailyProfileBasedRatingReportJobDefinition()
: base()
{
}

public DailyProfileBasedRatingReportJobDefinition(string name, SPService service, SPServer server, SPJobLockType jlt)
: base(name, service, server, jlt)
{
}

public DailyProfileBasedRatingReportJobDefinition(string name, SPWebApplication webApp)
: base(name, webApp, null, SPJobLockType.None)
{
this.Title = name;
}
public override void Execute(Guid targetInstanceId)
{
SPSite siteCollection = (this.Parent as SPWebApplication).Sites["/"];
SPList lstPuanlar = siteCollection.RootWeb.Lists["Puanlar"];
//Yapmamız gerekenleri yapıyoruz. Tüm kodu vermek isterdim, fakat hukuki olaylarla uğrasmak istemediğimden bunlan yetinmek zorundayız
}
}

Bu SPJobDefinition classının Execute Metodunu override ederek job çalıstıgında ne yapması gerekiyorsa onları burada yapıyoruz.


Peki simdi bu jobu nasıl install ederiz?
Cevabı bir sonraki blogumda bulacaksınız.
Keep Watchin'..

MOSS 2007'de anketin Özelleştirilmesi

Bu ilk blogumda daha evvel değinilmemiş bir konuya değinerek başlamak istiyorum. Bulundugum proje kapsamında MOSS'un özel listelerinden "Anket" listesini özelleştirmem istendi. Olusturulacak anketlerin bir giriş yazısı, bir teşekkür yazısı olması isteniyordu. Anketi dolduracak kişileri olusturacağım giriş sayfasına yollamak bir sorun değildi, fakat anketin bittiğini nasıl anlayıp son sorudan sonra kullanıcıyı teşekkür sayfasına gönderecektim? Mevcut anket listesinde böyle bir özellik olmadıgından custom bir Anketler isminde liste yaratarak işe başladım. Bu listede Giriş yazısı, Teşekkür yazısı, Anket Adı, Url kolonlarını olusturdum. Anket olusturmak isteyen yetkili kimse önce bu listeye bir item ekleyerek işe başlayacaktı. Yazdıgım ItemEventReceiver'in itemAdded metodunu override ederek işe başladım. Bu metod kullanıcının girdiği anket adına göre benim özelleştirdiğim anket Template inden bir anket yaratacak ve bu anketin Url ini set edecekti.


class AnketItemEventReceiver : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
SPWeb currentWeb = properties.OpenWeb();
SPListItem item = properties.ListItem;
currentWeb.AllowUnsafeUpdates = true;
SPFieldUrlValue urlValue = new SPFieldUrlValue();
urlValue.Description = "Anket Url";

urlValue.Url = currentWeb.Url + "/Lists/" + item["Anket_x0020_Ad_x0131_"].ToString() + "/overview.aspx";
item["Url"] = urlValue;
item.Update();

SPListTemplate objTemplate = currentWeb.Site.GetCustomListTemplates(currentWeb.Site.RootWeb)["Anket Şablonu"];

Guid objGuid = currentWeb.Lists.Add(item["Anket_x0020_Ad_x0131_"].ToString(), "survey", objTemplate);
}
}

Bu ilk blogumda herseyi anlatmayıp merakı canlı tutmak adına bana verilen bu taskı gerçekleştirmek için yaptıgım diğer hareketleri bir sonraki bloguma saklıyorum. Bu blogumla beraber bir ItemEventReceiver'in nası yazılacağı, Sharepoint object model yardımıyla olusturulan bir şablondan programatik olarak bir liste yaratılmasını görmüş olduk.
Bir sonraki blogumda görüşmek üzere