InfoPath Formlarından Ekran İpucunu (Tooltip) Kaldırma

infopath-logo Efendim gün geçmiyor ki müşterilerimizden yeni bir istek gelmesin :) Microsoft InfoPath ile özelleştirdiğim bir SharePoint formu için, formu doldururken rahatsızlık verdiği gerekçesiyle, ekran ip ucunun (tooltip) kaldırılması istendi. Bu alanların zorunlu olmaları yerine, çeşitli kurallar yardımıyla boş geçilememesini sağlayacakken aşağıdaki gibi iki çözüm çıkageldi. İlki tavsiye edilen bir çözüm yöntemi değil. Çünkü hem dokunmamamız gereken “14\TEMPLATE\LAYOUTS\INC” klasörü içindeki “ifsmain.css” dosyasını düzenlememiz ve “.errorDiv” sınıfını bulup aşağıdaki değişikliği yapmamız gerekiyor. Bu değişiklik ihtiyacımızı görecek olsa da bundan sonra InfoPath ile oluşturacağımız tüm formları etkileyecek bir duruma sebep oluyor, ki bizim isteğimiz sadece ilgili formumuzda bu değişikliği gerçekleştirmek.

Tam burada ikinci yöntem devreye giriyor. Aşağıda gördüğünüz şekilde, tasarladığımız InfoPath formunda Publish menüsünden “Export Source Files” diyor ve dosyalarımızı bir klasör içerisine kaydediyoruz. infopath-publish Daha sonra dosyalarımız içerisinden “view.xsl” adlı dosyayı bulup bir metin editörüyle düzenliyor ve “</body>” etiketinin hemen üzerine aşağıdaki CSS kodlarını ekliyoruz:

<style title="myCustomStyleSheet" type="text/css">
	.errorDiv{display:none !important;}
</style>

Bu değişikliği yapıp dosyayı kaydettikten sonra “manifest.xsf” dosyasına sağ tıklayıp Tasarla (Design) diyor ve formumuzu yayımlıyoruz (publish). Artık bu ekran ipuçları (uyarı, tooltip) müşterimizin canını sıkamayacak ;)

Kolay gelsin.

VirtualBox ile Uzak Masaüstü Bağlantısı

oracle-virtualbox Kişisel bilgisayarımda çalışma ortamlarım (Windows Server ve SharePoint) VirtualBox üzerinde bulunuyor. Çalıştığım sunucuya zaman zaman başka kullanıcılar ile de bağlanıp bazı denemeler / kontroller yapmam gerekebiliyor. Her seferinde o anki kullanıcının oturumunu kapatıp, diğer kullanıcıya geçip, bir şeyler yapıp / deneyip tekrar diğer kullanıcıya geçmek nasıl bir işkence tahmin edebiliyorsunuzdur. Üşenmekten vazgeçtiğim zaman, başka bir kullanıcı ile uzak masaüstü bağlantısı yapmaya en çok ihtiyaç duyduğum “SharePoint-Hosted Apps” konulu bir yazı yazacağım, o zaman bu ihtiyacın nereden geldiğini daha iyi anlayacaksınız. Uzatmayayım, VirtualBox ile çalıştırdığımız bilgisayara uzak masaüstü bağlantısı (RDP) yapmamız gerekebiliyor. Bunun için herşeyden önce VirtualBox için Extension Pack indirip yüklememiz gerekiyor. Bu paketin sisteminizde kurulu olan VirtualBox ile aynı sürüm olması gerektiğini önemle vurgulayayım.

Extension Pack yüklendikten sonra yapmamız gereken ilk iş, uzak masaüstü bağlantısı yapacağımız bilgisayarın özelliklerinden Uzak bağlantı ayarları (Remote settings) diyalogunu açıp aşağıda gördüğünüz gibi bu özelliği aktif hale getirip bağlanabilecek kullanıcıları seçmek. windows-server-enable-remote-desktop Daha sonra VirtualBox‘tan ilgili bilgisayarı seçip Settings‘e tıklayarak Display altındaki Remote Display sekmesinden “Enable Server” özelliğini aktif hale getirmemiz gerekiyor. virtualbox-enable-remote-display Yine aynı yerden Network altında herhangi bir ağ adaptörünü aktif hale getirerek “Attach to: Bridged Adapter” seçiyor ve internete bağlantığımız ağ bağdaştırıcısını seçiyoruz. virtualbox-network-bridged-adapter Önemli Not:Bridged Adapter” seçemiyorsanız, yani bu alan boş geliyorsa, VitrualBox‘ı kurarken yönetici yetkileriyle kurmamışsınız, dolayısıyla kurulum sırasında mevcut ağınıza ilgili özellikler eklenememiş demektir. Bunu elle yapmamız gerekiyor. Ağ ve Paylaşım merkezinden mevcut ağımızı seçiyor ve Özellikler‘ine giriyoruz. Aşağıdaki resimde kırmızı kutucuk içine aldığım “VirtualBox Bridged Networking Driver” sizde görünmüyor. Bunu yükleyebilmek için aşağıda numaralandırdığım şekilde Ağ Bağlantınız > Özellikler > Yükle > Hizmet yolunu izleyip VirtualBox Bridged Networking Driver kurulumunu seçmeniz gerekiyor. virtualbox-bridged-networking-driver Sürücü için dosyalara ihtiyaç duyduğunda “C:\Program Files\Oracle\VirtualBox\drivers\network” yolundaki dosyaları kullanmanız gerekiyor. Bu işlemlerden sonra Bridged Adapter seçebileceksiniz. Yaptığımız değişiklikleri kaydedip, VirtualBox‘taki bilgisayarımızı başlattığımızda uzak masaüstü bağlantısı için her şey hazır demektir. VirtualBox üzerinde çalışan bilgisayarın adını veya Bridged Adapter seçerek verdiğimiz bağlantının özelliklerinden edinebileceğimiz IP adresini yazarak uzak masaüstü bağlantısı yapabiliriz. uzak-masaustu-baglantisi

Event Receiver'ların Geç Çalışması

SharePoint-2010-Logo Birkaç gündür büyük sıkıntıya sebep oldu bu durum. Bir Event Receiver ile ItemAdded ve ItemUpdated olaylarında, belirlenmiş bir alanı bildiğimiz bir değer ile güncellemeye çalışıyorum. Tabi ki güncelleyebiliyorum ancak Event Receiver‘ımız bunu biraz geç yaptığından ilgili alanın dolduğunu görmek için sayfayı yenilemem gerekiyor, ki bu hiç istemediğimiz bir durum. İstenmeyen bu durumdan kurtulmak aslında çok basit(miş). Varsayılan olarak asenkron (asynchronous) çalışan bu receiverlara, senkron (synchronous) çalışması için aşağıdaki gibi bir tanımlama yapmamız yeterli oluyor:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="104">
    <Receiver>
      <Name>SetPeopleERItemUpdated</Name>
      <Type>ItemUpdated</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>EventRecivers.SetPeopleER.SetPeopleER</Class>
      <SequenceNumber>1000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
    <Receiver>
      <Name>SetPeopleERItemAdded</Name>
      <Type>ItemAdded</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>EventRecivers.SetPeopleER.SetPeopleER</Class>
      <SequenceNumber>1000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>
  </Receivers>
</Elements>

Artık liste veya kütüphanenize bir öge eklediğinizde ya da güncellediğinizde, ilgili alan da Event Receiver’ımız tarafından derhal güncellenmiş olacak. Detaylar için buraya bakabilirsiniz. Kolay gelsin.

SharePoint Foundation 2013 - 3 Soru

Sharepoint-2013-Logo Bildiğimiz gibi SharePoint Foundation 2013’ü ücretsiz indirip kullanabiliyoruz. Server ve Enterprise sürümleriyle karşılaştırmalarını çeşitli sitelerde bulabilirsiniz (Mesela burada). Çok kısa tutacağım bu yazıda, Foundation sürümüyle alakalı çok merak edip karşılaştırma listelerinde bulamadığım (Muhtemelen az aradığımdan), daha doğrusu bu özelliklerin olmamasına inanamadıklarım hakkında aklıma takılan üç soruya bulduğum cevapları paylaşacağım. Bu soruların cevaplarını deneme-yanılma yoluyla, SharePoint Foundation 2013 kurarak buldum, buyrun sizlerle de paylaşıyorum:

  1. SharePoint Foundation 2013’te Workflow kullanabilir miyiz? Evet, kullanabiliyoruz. Sadece Workflow 2013 kullanamıyoruz. 2010 ile akışlar geliştirip kullanmamıza bir engel yok.
  2. SharePoint Foundation 2013 ile SharePoint-Hosted App Geliştirebilir miyiz? Evet, geliştirebiliriz. Kendimize bir developer sitesi oluşturup uygulamaları geliştirmemiz için bir engel yok.
  3. InfoPath Forms Services kullanabiliyor muyuz? Hayır. Herhangi bir şekilde form özelleştirmesi yapmamız mümkün değil. Ancak Visual Studio veya SharePoint Designer kullanarak yeni formlar oluşturmamız / düzenlememiz mümkün.

Yeteneklerinin bir çoğu ve belki de en önemlileri bulunmuyor olsa da çaylak bir SharePoint geliştirici olarak Foundation sürümünün de, yukarıdaki soruların cevaplarıyla oldukça özelleştirilebileceğini / geliştirilebileceğini düşünüyorum. Üstelik bedavaya.

List Form WebPart Yerine Data Form WebPart Eklemek ve Buton Düzenlemesi

SharePoint 2010 kullananların en çok gördüğü pencerelerden biridir sanırım aşağıdaki pencere (en azından benim için öyle). Evet, doğru tahmin ettiniz. Bu pencereyle alakalı bir sorun yaşayıp yeni bir şey öğrendiğim için, bunu sizlerle de paylaşıyorum ;) sharepoint-2010-add-new-item Varsayalım ki listemize yeni bir kayıt giriyoruz, ekranımızda yukarıda gördüğünüz pencere varken tarayıcımızın adres çubuğunda şu URL görünüyor:

http://sharepointURL/Lists/Test/NewForm.aspx?Source=/Pages/Kaydedildi.aspx

Biliyoruz ki kaydımızı girmek için Kaydet (Save) butonuna bassak da, vazgeçip İptal (Cancel) butonuna bassak da, URL’de Source parametresiyle belirtilen “/Pages/Kaydedildi.aspx” sayfasına yönlendirileceğiz. Peki, Kaydet butonuna basınca bu sayfaya gidip İptal butonuna basınca başka bir sayfaya gitmek istiyorsak ne yapacağız? Bu soruya verdiğim ilk cevap bir JavaScript kodu yazıp İptal butonuna tıklandığında istediğimiz sayfaya yönlendirmek şeklinde oldu. Hatta şu şekilde hemen bu isteği gerçekleştirebildim:

$(document).ready(function() {
  if(window.location.href.indexOf("AnketURL") !=-1){
    var allElements = document.getElementsByTagName('*');
    for (var i = 0; i &lt; allElements.length; i++) {
      if(String(allElements[i].getAttribute('id')).indexOf("diidIOGoBack") !=-1){
         allElements[i].attachEvent('onclick',redirect,false);
      }
    }
  }

  function redirect(){
       window.location.href = "/Pages/IptalEdildi.aspx";
  }
});

Bu tabi ki bir çözümdü. Ancak JavaScript kodlarının client bazında farklı davranabiliyor olması yüzünden, liste üzerindeki ekleme, düzenleme vb. işlemlerde JavaScript ile değil, XSL ile değişiklikler yapmanın doğru ve uygun bir yöntem olduğunu öğrendim. Hal böyle olunca yapılması gereken, listemizin NewForm.aspx dosyasında düzenleme yapmak oldu. Bunun için aşağıdaki adımları takip edebilirsiniz:

  1. SharePoint Designer 2010 ile sitemize bağlanıp ilgili listeyi bulduktan sonra, NewForm.aspx dosyasına sağ tıklayıp “Edit File in Advanced Mode” seçeneğine tıklıyoruz. newform.aspx
  2. Tasarım (Design) moduna geçip List Form Web Part’ın önizlemesine tıklayarak tekrar kodlara döndüğümüzde seçili olan kod bloğunu siliyoruz. sharepoint-designer-listformwebpart
  3. Sildiğimiz yerde kalmak şartıyla (aynı zone içerisinde) Ribbon‘daki Insert menüsünden New Item Form butonuna tıklayıp Custom List Form seçeneğine tıklıyoruz. sharepoint-designer-custom-list-form
  4. Gelen pencerede ilgili listemizi ve New Item Form‘u seçerek OK diyoruz.

Bu aşamada List Form Web Part‘ı sayfamızdan silip yerine Data Form Web Part eklemiş oluyoruz. Artık butonlarla uğraşabiliriz. sharepoint-designer-data-form-web-part Tasarım moduna geçip yeni eklenen web partı incelersek, List Form Web Part‘ın aksine sayfa içerisindeki elemanlara ulaşıp bunları düzenleyebildiğimizi göreceğiz. Konumuz olan İptal (Cancel) butonlarına geri dönelim. Kodumuzda aşağıdaki iki satırı bulalım:

<SharePoint:GoBackButton runat="server" ControlMode="New" id="gobackbutton1"/>
<SharePoint:GoBackButton runat="server" ControlMode="New" id="gobackbutton2"/>

Bu iki satırı aşağıdaki kod ile değiştirelim:

<input type="button" class="ms-ButtonHeightWidth" value="İptal" name="btnCancel" onclick="javascript: {ddwrt:GenFireServerEvent('__redirect={/Pages/IptalEdildi.aspx}')}" />

Bu değişikliği yaptıktan sonra dosyamızı kaydedersek göreceğiz ki Kaydet (Save) butonu bizi URL’deki Source ile belirtilen “/Pages/Kaydedildi.aspx” adresine yönlendirirken, İptal (Cancel) butonu GenFireServerEvent içerisinde belirttiğimiz “/Pages/IptalEdildi.aspx” sayfasına yönlendirecek.