tag:blogger.com,1999:blog-6728400068236875402024-03-13T22:12:35.808-07:00Sharepoint DeneyimlerimEmir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-672840006823687540.post-14763714398702503102009-11-06T03:46:00.000-08:002009-11-06T04:04:01.974-08:00SP 2010 ile Beraber gelen İlişkisel Liste DesteğiWSS3 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.<br />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.<br />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..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-65346634194302517822009-11-06T00:17:00.001-08:002009-11-09T08:32:45.773-08:00Sharepoint 2010: 12 Hive+2= 14 HiveSharepoint 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ş.<br /><br />14Hive da 3 tane yeni folder dikkatimi çekti.<br /> * UserCode <br /> * WebClients –Client OM için kullanılıyor sanıyorum<br /> * WebServices – Bir çok yeni .svc dosyası içeriyor<br /><br />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ş.<br /><br /> * Microsoft.BusinessData.dll<br /> * Microsoft.Office.DocumentManagment.dll<br /> * Microsoft.Office.Excel.Server.Udf.dll<br /> * Microsoft.Office.Excel.Server.WebServices.dll<br /> * Microsoft.Office.Policy.dll<br /> * Microsoft.Office.SecureStoreService.Security.dll<br /> * Microsoft.Office.Server.dll<br /> * Microsoft.Office.Server.Search.dll<br /> * Microsoft.Office.SharePoint.ClientExtensions.dll<br /> * Microsoft.Office.UserProfiles.dll<br /> * Microsoft.Office.Word.Server.dll<br /> * Microsoft.Office.Workflow.Actions.dll<br /> * Microsoft.Office.Workflow.Tasks.dll<br /> * Microsoft.SharePoint.Client.dll<br /> * Microsoft.SharePoint.Runtime.dll<br /> * Microsoft.SharePoint.dll<br /> * Microsoft.SharePoint.Linq.dll<br /> * Microsoft.SharePoint.Portal.dll<br /> * Microsoft.SharePoint.Publishing.dll<br /> * Microsoft.SharePoint.Search.dll<br /> * Microsoft.SharePoint.Search.Extended.Administration.Common.dll<br /> * Microsoft.SharePoint.Search.Extended.Administration.dll<br /> * Microsoft.SharePoint.Search.Extended.Administration.ResourceStorage.dll<br /> * Microsoft.SharePoint.Search.Extended.Administration.Query.dll<br /> * Microsoft.SharePoint.Security.dll<br /> * Microsoft.SharePoint.Taxonomy.dll<br /> * Microsoft.SharePoint.Taxonomy.Intl.dll<br /> * Microsoft.SharePoint.Workflow.Actions.dll<br /> * Microsoft.Web.CommandUI.dllEmir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-75648822115819300372009-11-05T23:55:00.000-08:002009-11-06T00:09:13.179-08:00Sharepoint 2010 Visual Web Partla TanışalımSharepoint 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.<br />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ı..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-25733374956686903082009-11-05T23:40:00.000-08:002009-11-05T23:50:48.044-08:00Sharepoint 2010'da bir ListItemın varolup olmadığını kontrol etmekSharepoint 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.<br />Yeni API ile beraber TryGetList isimli bir fonksiyonumuzu mevcut..<br />Aşağıdaki kod bloğuyla bunu örnekliyorum.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPgze8B07CNUjXYkLrkrFWQIvdRPXsOvFLMUdkS8nSvoo9T2KwWMenwBqTsAG6fKIpMYNe2Ammx9RvNF7I7X0SSdmIsUSOreaCuILPH1LhNr-2jepn4CyhbeFPhR6SI4NETYJZ1tpEVMQ/s1600-h/Linq.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPgze8B07CNUjXYkLrkrFWQIvdRPXsOvFLMUdkS8nSvoo9T2KwWMenwBqTsAG6fKIpMYNe2Ammx9RvNF7I7X0SSdmIsUSOreaCuILPH1LhNr-2jepn4CyhbeFPhR6SI4NETYJZ1tpEVMQ/s320/Linq.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5400894688037798578" /></a>Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-73333654847594029382009-11-02T16:22:00.000-08:002009-11-02T16:25:45.012-08:00Kişinin bilgisayarında MOSS Yüklü olup olmadıgını Kod tarafında Tespit EtmekKiş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.<br />bool isMossInstalled = false;<br />string keyname = @"SOFTWARE\Microsoft\Office Server\12.0";<br />using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyname))<br />{<br /> if (key != null)<br /> {<br /> string version = key.GetValue("BuildVersion") as string;<br /> if (version != null)<br /> {<br /> Version buildVersion = new Version(version);<br /> if (buildVersion.Major == 12)<br /> {<br /> isMossInstalled = true;<br /> }<br /> }<br /> }<br />}Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-47513368380380901952009-11-02T05:56:00.000-08:002009-11-02T07:08:14.829-08:00Lists.asmx web servisi ile LINQ TO XML kullanmakBildiğ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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUGZ_4LTAi7xhPjM0qESzSKhP8hZPOKW32hiVjX0texqtEj5xzt5Q-qiiaJfAZ04VI66KcNl_aDhvYGcDB0RSn6LHd1Zy2dGv2kjbFKi6Kq8rkqzUcg6Wutx5lVmAiYaS_3-oS1kV92Kc/s1600-h/ListsConfig.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUGZ_4LTAi7xhPjM0qESzSKhP8hZPOKW32hiVjX0texqtEj5xzt5Q-qiiaJfAZ04VI66KcNl_aDhvYGcDB0RSn6LHd1Zy2dGv2kjbFKi6Kq8rkqzUcg6Wutx5lVmAiYaS_3-oS1kV92Kc/s320/ListsConfig.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5399523178545945954" /></a><br /> şeklinde ayarlarımızı düzenledikten sonra uygulamamıza geçelim.<br />uygulamamızın kodu aşağıdaki gibidir.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmZ9FMMsIyYnHp1ghNITiNTQSntgKKdOZGOczsFavwWwdztk05cBuxmqhpXEK1dL8wv3A4cD0zxI9L-M_M7-Bsm0OKndK2p6bZr1IoY3ouWJZt6299LHbXqbd4Apc0XfDK2wOpeSHnFY/s1600-h/ListsService1.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 137px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmZ9FMMsIyYnHp1ghNITiNTQSntgKKdOZGOczsFavwWwdztk05cBuxmqhpXEK1dL8wv3A4cD0zxI9L-M_M7-Bsm0OKndK2p6bZr1IoY3ouWJZt6299LHbXqbd4Apc0XfDK2wOpeSHnFY/s320/ListsService1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5399516454642803666" /></a><br />Bu şekilde Sharepoint uygulamamızdaki listeleri web servisten dönen xmli linq to xml ile parse ederek göstermiş oluruz.<br />Linq to xml gerçekten hayatı kolaylaştırıyor..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-48998822875581650862009-10-23T15:19:00.000-07:002009-10-23T15:24:10.569-07:00Sharepoint Crawling ile ilgili bilinmesi gereken hatalarError 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ü.Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-4320609123130898682009-10-19T15:19:00.000-07:002009-10-19T15:22:23.954-07:00SSP ProblemiThe DataSourceID of 'QuickLaunchMenu' must be the ID of a control of type<br />IHierarchicalDataSource. A control with ID 'QuickLaunchSiteMap' could not be<br />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 olsunEmir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-41842905904807666312009-10-07T00:34:00.000-07:002009-10-07T00:43:05.091-07:00Sharepoint'te doküman kütüphanelerine yüklenebilecek dosya boyutu limitini değiştirmekSharepoint'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<br />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.Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-64388491900062121102009-10-07T00:02:00.000-07:002009-10-07T01:16:40.835-07:00Kendi STSADM commandimizi yaratmakGeç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 <a href="http://www.helloitsliam.com/archive/2008/12/12/stsadm-command-%E2%80%93-what-is-using-my-content-types.aspx">yazıda</a> bulabilirsiniz. Konuyla ilgili deneme yaparken sorularınızı bekliyorum..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-6351771518740037812009-10-06T00:52:00.000-07:002009-10-06T00:59:58.244-07:00Productiondaki 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ığı <a href="http://www.andrewconnell.com/blog/articles/restoring-production-moss-2007-publishing-sites-into-development.aspx">makale</a> 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.Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-73747453652144852142009-10-04T22:28:00.000-07:002009-10-04T22:49:37.399-07:00Doküman Kitaplığında bir itemın check-outlu olup olmadıgını anlamak<span style="font-family: times new roman;">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;</span><br /><span style="font-family: times new roman;">1) None--> dosya check out edilmemiştir.</span><br /><span style="font-family: times new roman;">2) LongTerm--> Dosya Sharepoint arayüzü tarafından checkout edilmiştir.</span><br /><span style="font-family: times new roman;">3) LongTermOffline--> Dosya çevrimdışı editlenmek üzere check out edilmiştir.</span><br /><span style="font-family: times new roman;">4) ShortTerm--> Dosya bir client uygulama tarafından lock edilmiştir.</span><br /><br /><span style="font-family: times new roman;"> Bizim projemizde bana gereken check-out edimemiş dosyayı check out etmek ve editlemekti. Bunun için</span><br /><span style="font-family: times new roman;"></span><blockquote style="font-family: times new roman;">if(file.CheckOutStatus==SPFile.SPCheckOutStatus.None)<br /> file.CheckOut();</blockquote><br /><span style="font-family: times new roman;">Kodu yeterli olacaktır.</span>Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-44542437258121716672009-10-01T17:56:00.000-07:002009-10-01T18:04:22.863-07:00Sharepoint 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<br /><pre>"Cannot make a cache safe URL for "init.js", file not found.<br />Please verify that the file exists under the layouts directory."</pre>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ş.Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-31964581729495222732009-10-01T17:40:00.000-07:002009-10-01T17:52:23.621-07:00BLOB CachingBLOB 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.<br /><pre id="ctl00_MTContentSelector1_mainContentContainer_ctl33xml" style="border-top: 1px solid rgb(200, 205, 222); margin: 0px 0px 10px; overflow: hidden; background-color: rgb(221, 221, 221); padding-left: 5px; padding-right: 5px; padding-top: 5px; display: block; color: rgb(0, 0, 102); white-space: pre-wrap;font-family:Courier,Verdana,Arial,Helvetica,sans-serif;font-size:12px;"><span style="color:blue;"><</span><span style="color:maroon;">BlobCache</span> location="C:\blobCache" path="\.(gif|jpg|png|css|js)$" maxSize="10" max-age="86400" enabled="true"<span style="color:blue;">/></span></pre>Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-31657753677431978942009-10-01T17:35:00.000-07:002009-10-01T17:39:27.046-07:00Programatik olarak SPFieldLookup yaratmakEpeydir 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 <a href="http://www.yazilimkulubu.com/">ulaşabilirsiniz</a> . 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<br /><pre class="csharp"><span style="color: rgb(71, 181, 255);">SPList</span> myList <span style="color: rgb(0, 0, 0);">=</span> web.<span style="color: rgb(0, 0, 0);">Lists</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(127, 0, 0);">"MyList"</span><span style="color: rgb(0, 0, 0);">]</span>;<br /><span style="color: rgb(71, 181, 255);">SPList</span> myLookupList <span style="color: rgb(0, 0, 0);">=</span> web.<span style="color: rgb(0, 0, 0);">Lists</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(127, 0, 0);">"MyLookupList"</span><span style="color: rgb(0, 0, 0);">]</span>;<br /><br />myList.<span style="color: rgb(0, 0, 0);">Fields</span>.<span style="color: rgb(0, 0, 0);">AddLookup</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(127, 0, 0);">"Lookup"</span>, myLookupList.<span style="color: rgb(0, 0, 0);">ID</span>, <span style="color: rgb(6, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">)</span>;<br /><span style="color: rgb(71, 181, 255);">SPFieldLookup</span> fieldLookup <span style="color: rgb(0, 0, 0);">=</span> myList.<span style="color: rgb(0, 0, 0);">Fields</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(127, 0, 0);">"Lookup"</span><span style="color: rgb(0, 0, 0);">]</span> <span style="color: rgb(6, 0, 255);">as</span> <span style="color: rgb(71, 181, 255);">SPFieldLookup</span>;<br /><span style="color: rgb(0, 128, 128); font-style: italic;">// Display Title Column in lookup field </span><br /><span style="color: rgb(0, 128, 128); font-style: italic;">// (this is shown by default but this way you can change it)</span><br />fieldLookup.<span style="color: rgb(0, 0, 0);">LookupField</span> <span style="color: rgb(0, 0, 0);">=</span><br /> myLookupList.<span style="color: rgb(0, 0, 0);">Fields</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(71, 181, 255);">SPBuiltInFieldId</span>.<span style="color: rgb(0, 0, 0);">Title</span><span style="color: rgb(0, 0, 0);">]</span>.<span style="color: rgb(0, 0, 0);">InternalName</span>;<br />fieldLookup.<span style="color: rgb(0, 0, 0);">Update</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">)</span>;</pre>Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-22274141318397874442009-03-20T09:41:00.000-07:002009-03-20T09:50:19.698-07:00Sharepoint 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.<br /><br />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.<br /><br />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.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWpcoXVGGkWXKbd7SJEZlvlO2eS292b59ky3BrlXfDgdlFhaJQL0ryB1hgHCtuV2rgeyQcV2LbXWf4Nh7mREqtcJq3Cd7_BSPlq0nLsVB6rh6RuvUk3XKX88L0GV9qUwJ91JzgvCxz9y4/s1600-h/ImagingDesign.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 90px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWpcoXVGGkWXKbd7SJEZlvlO2eS292b59ky3BrlXfDgdlFhaJQL0ryB1hgHCtuV2rgeyQcV2LbXWf4Nh7mREqtcJq3Cd7_BSPlq0nLsVB6rh6RuvUk3XKX88L0GV9qUwJ91JzgvCxz9y4/s320/ImagingDesign.JPG" alt="" id="BLOGGER_PHOTO_ID_5315312236388622610" border="0" /></a><br /><br />Sonrasında Butonun Click yordamına aşağıdaki kodu yazıyoruz.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FTLBeVcL0iH_cAgSbt3C6QXSvP81OEO1HCwSQpL7XMaAllr4saCn_2G8NT9aBGafrCCyLXkgN4craO2sZeSEp1-KP87vppcJuqqrWNkS3LviG-Wajg6aQwTSz-SZqITtPex7WOM_Wv0/s1600-h/imagingKod.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 82px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FTLBeVcL0iH_cAgSbt3C6QXSvP81OEO1HCwSQpL7XMaAllr4saCn_2G8NT9aBGafrCCyLXkgN4craO2sZeSEp1-KP87vppcJuqqrWNkS3LviG-Wajg6aQwTSz-SZqITtPex7WOM_Wv0/s320/imagingKod.jpg" alt="" id="BLOGGER_PHOTO_ID_5315312558229704802" border="0" /></a><br /><br />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.<br /><br />Aşağıda kod çalıstırıldıktan sonra UploadResimler isimli PictureLibrary'e resmin yüklendiğini görüyoruz.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIoVMxpvv2kxriCm_e-W5jT2F2sp9lksjHNpCpo-y0geMGSDAiwYwKMSlo-YYBmvVY3f5O1JukjKQ1OhKqfyVn6EHBUXQflSvbBE7nRV6I-Zt3pUy-fvL9Jia4SnbB5dtfA-ZJINkUyY/s1600-h/UploadGaleriler.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 258px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIoVMxpvv2kxriCm_e-W5jT2F2sp9lksjHNpCpo-y0geMGSDAiwYwKMSlo-YYBmvVY3f5O1JukjKQ1OhKqfyVn6EHBUXQflSvbBE7nRV6I-Zt3pUy-fvL9Jia4SnbB5dtfA-ZJINkUyY/s320/UploadGaleriler.jpg" alt="" id="BLOGGER_PHOTO_ID_5315312883608361666" border="0" /></a><br /><br /><br />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.<br /><br />Herkese iyi çalışmalar..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-32137611724448467302009-03-18T15:07:00.001-07:002009-03-18T15:26:26.354-07:00Bir Page üzerindeki Web Partları Listelemek ve Propertylerine erişmekUğ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. <br />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.<br /><br />SPWeb webLists = SPContext.Current.Site.RootWeb.Webs["Listeler"]; //burda Listeler sitesini elde ediyoruz<br />SPLimitedWebPartManager man =webLists.GetLimitedWebPartManager("Pages/Favoriler.aspx", PersonalizationScope.Shared);<br /> //Listeler sitesindeki Favoriler.aspx sayfasının Web Part Managerini elde ediyoruz<br />SPLimitedWebPartCollection webParts = man.WebParts;<br />//Favoriler.aspx'in web part koleksiyonunu alıyoruz<br />foreach (System.Web.UI.WebControls.WebParts.WebPart part in webParts)<br />{<br /> if (part is TTNetAv.Audio.WebPart.EditorPlayListWebPart &&part.Visible)<br /> {<br /> TTNetAv.Audio.WebPart.EditorPlayListWebPart webPart=(TTNetAv.Audio.WebPart.EditorPlayListWebPart)part; //web partımızı Cast ediyoruz.<br /> <br /> }<br />}<br />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.<br />Şimdilik iyi çalışmalar diliyorum herkese..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-66107656393874122332009-03-14T11:07:00.000-07:002009-03-14T11:16:20.186-07:00Choice Tipindeki Fieldlara Programatik olarak choice eklemekSharepoint listelerinde kullanılan Choice tipindeki kolonlara Choice eklemek için aşağıdaki kod bloğunu kullanıyoruz.<br />SPFieldMultiChoice choiceField = (SPFieldMultiChoice)myWeb.Fields["Yemekler"];<br /><br />choiceField.Choices.Add("Pilav");<br /><br />//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.<br /><br />choiceField.PushChangesToLists = true; <br /><br />choiceField.Update();Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-92027597874988067992009-03-14T06:53:00.000-07:002009-03-14T07:10:34.613-07:00Bir İ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.<br />Kalın SağlıcaklaEmir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com1tag:blogger.com,1999:blog-672840006823687540.post-32176135653428900922009-03-14T06:39:00.000-07:002009-03-14T06:50:35.123-07:00UserControlleri Web Partlarda Load EtmekSenelerce 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?<br />İşte Cevap...<br />Ö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.<br /><br />public class MainPageGalleriesWebPart:System.Web.UI.WebControls.WebParts.WebPart<br /> {<br /> MainPageGalleriesUserControl uc;<br /> protected override void CreateChildControls()<br /> {<br /> this.ChromeType = PartChromeType.None;<br /> base.CreateChildControls();<br /> uc = (MainPageGalleriesUserControl)this.Page.LoadControl(@"\_controltemplates\MainPageGalleriesUserControl.ascx");<br /> this.Controls.Add(uc);<br /> }<br /> }<br />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..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-33420757747362994182009-03-14T05:39:00.000-07:002009-03-14T05:53:48.807-07:00Sharepoint'te Picture Libraryleri ile işlem yapmakGeç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..<br /><br /> SPWeb webGalleries=SPContext.Current.Site.RootWeb.Webs["Galeriler"];<br /> List<SPPictureLibrary> libraries = new List<SPPictureLibrary>();<br /> foreach (SPList lib in webGalleries.Lists)<br /> {<br /> if (lib is SPPictureLibrary) //Eğer liste Picture Library Tipindeyse, kendi Collection ıma ekliyorum<br /> libraries.Add((SPPictureLibrary)lib);<br /> }<br /><br /> Yukarıdaki kod bloğuyla Webimizdeki Picture Library tipindeki listeleri kendi olusturdugumuz listeye ekliyoruz. Bundan sonrası hepimizin bildiği sorting işlemi.<br /><br /> for (int i = 0; i < libraries.Count; i++)<br /> {<br /> for (int j = i + 1; j < libraries.Count; j++)<br /> {<br /> if (libraries[i].Created > libraries[j].Created)<br /> {<br /> SPPictureLibrary temp = libraries[j];<br /> libraries[j] = libraries[i];<br /> libraries[i] = temp;<br /> }<br /> }<br /> <br /> }<br />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..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-71779864665104583152009-03-02T16:13:00.000-08:002009-03-14T05:54:39.435-07:00SPSecurity.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.<br />Örnek kodu da aşağıda paylaşıyorum. Bir sonraki postta görüşmek üzere..<br /><br />SPSecurity.RunWithElevatedPrivileges(delegate()<br /> {<br /> using (SPSite topSite = new SPSite(SPContext.Current.Site.WebApplication.Sites["/"].ID))<br /> {<br /> SPFolder folder = topSite.RootWeb.GetFolder(belgelerFolder);<br /><br /> SPFileCollection files = folder.Files;<br /> SPFile file = files["GnTahmin.xml"];<br /> doc.Load(file.OpenBinaryStream(SPOpenBinaryOptions.None));<br /> }<br /> }<br /> );Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-83465355326368356422009-03-02T14:48:00.000-08:002009-03-02T15:45:53.559-08:00Anonim kullanıcılara bir liste üzerinde Programatik olarak yetki vermekSon 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.<br />Aşağıda projemizden bir örneğini görebilirsiniz.<br /><br />SPList objSurvey = SPContext.Current.Web.Lists["Anketim"];<br />objSurvey.AnonymousPermMask64 =(SPBasePermissions.Open |<br /><br /> SPBasePermissions.OpenItems |<br /><br /> SPBasePermissions.ViewFormPages |<br /><br /> SPBasePermissions.UseClientIntegration |<br /><br /> //SPBasePermissions.UseRemoteAPIs |<br /><br /> SPBasePermissions.ViewListItems |<br /><br /> SPBasePermissions.AddListItems);<br /> <br /> objSurvey.Update();<br /><br />Bir sonraki postumda tüm login olmuş authenticated kullanıcılara yetki vermek ve bir Sharepoint security group a yetki vermekten bahsedeceğim.<br />Herkese iyi çalışmalar..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-67088195928193239192009-03-02T13:18:00.000-08:002009-03-02T13:26:51.963-08:00SPDisposeCheck 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 <a href='http://code.msdn.microsoft.com/SPDisposeCheck'>SPDisposeCheck</a> 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üzeltebilirsinizEmir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0tag:blogger.com,1999:blog-672840006823687540.post-8986147581427938302009-02-24T03:56:00.000-08:002009-03-02T13:18:41.943-08:00Sharepoint 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...<br /><br />Ö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).<br />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.<br />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.<br /><br /><strong><span style="font-family:trebuchet ms;">using System;using System.Collections.Generic;<br />using System.Linq;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using Microsoft.SharePoint;<br />namespace TTEIMWebControls.UserControls.AnketCustomization<br />{public partial class AnketProgressBar : System.Web.UI.UserControl<br />{protected void Page_Load(object sender, EventArgs e)<br />{if (!this.IsPostBack)<br />{string firstField=Request.QueryString["FirstField"].ToString();<br />if (!firstField.Equals(string.Empty)){<br />string anketName = GetAnketName();<br />SPWeb curWeb = SPContext.Current.Web;<br />SPField field = curWeb.Lists[anketName].Fields.GetFieldByInternalName(firstField);<br />bool fieldExists = CheckField(field, curWeb.Lists[anketName]);<br />if (!fieldExists){<br />SPList anketList = curWeb.Lists[anketName];<br />/*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*/<br /><br />int totalSoru = anketList.Fields.Count - 43;<br />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*/<br />foreach (SPField fieldI in anketList.Fields){<br />if (fieldI.InternalName.Equals(firstField))<br />break;<br />index++;<br />}<br />int mevcutSoruİndex = index;<br />double percentage = ((double)100 / totalSoru) * index;<br /></span></strong><strong><span style="font-family:trebuchet ms;"><br />}<br />}<br />}<br />}<br /></span></strong><br /><strong><span style="font-family:Trebuchet MS;"></span></strong><br /><span style="font-size:0;">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.</span><br />Hepinize iyi çalışmalar..Emir Elkabeshttp://www.blogger.com/profile/05733741977728927059noreply@blogger.com0