CRM JAVASCRİPT


Javascript Kodlarıyla crm form larında küçük özelleştirmeler
yapacağımızı daha önceki yazımda kısaca bahsetmiştim. Bu yazımda ise
form içerisine nasıl JavaScript yazabiliriz, basit örneklerle
anlatacağım. Öncelikle Ms crm 4.0 ayarlar (settings) kısmına tıklayarak
özelleştirmek istediğim varlığı seçiyorum 
( daha önceki makalemde bu konulardan bahsetmiştim bu yüzden kısaca geçiyorum.) 
Daha sonra özelleştir(customization) linkine tıklıyorum ve özelleştirmek
istediğimi varlığı(entity) seçiyorum . son olarak altaki resimde
gördüğünüz gibi form özelliğine tıklıyorum ve özelleştirmek istediğim
formu getiriyorum.






Şimdi ise normal özelleştirme standartların biraz dışına çıkarak
normalde desteklenmeyen fakat developerların ve kullanıcıların
ihtiyaçları doğrultusunda kullanıcılar için esnek özellikleri ve
ekranları hazırlayabiliriz. Özellikle bu ekranları hazırlarken komplike
kod blokları yazmaya gerek kalmadan işimizi javascript kodlarıyla
halledebileceğimizi göreceğiz.
Form üzerinde üç farklı olay(event) için JavaScript yazabiliriz bu olaylar
onLoad(yüklendiğinde),onSave(kaydedildiğinde),onChange(değiştiğinde).
Öncelikle bu olayları birlikte inceleyelim ve daha sonra form içinde
nerelere kod yazacağımızı göreceğiz.

onLoad: Form açıldığında çalışacak olan JavaScript Kodunu bu olaya yazarız.
onSave: Form kaydedildiğinde çalışacak olan JavaScript Kodunu bu olaya yazarız. 
onLoad ve onSave için Form Properties butonuna tıklanarak açılan ekrandan seçili event için Edit denir. 






Önce onLoad için penceremizi açalım ve ilk örneğimize başlayalım. İlk
örneğimiz sayfa ilk yüklendiğinde crm formunda ok/cansel şeklinde
Message Box’lar oluşturmak olsun.

var cevap = window.confirm("işleme devam etmek için tamam(OK) basın,işlemi iptal etmek için iptale(Cansel) basın.");
if (cevap) {
//kullanıcı tamama basarsa kodu burada işleyecektir.
}
else {
//kullanıcı iptale basarsa kodu burada işleyecektir.
}



Bu ekranda olay etkindir seçeneğini işaretlemediğimiz zaman yazdığımız
scriptleri çalıştırmayacaktır bu yüzden bu seçeneği unutmamalıyız.

Daha sonra Form Properties penceresini de kapatalım. Üst menüden
Preview>Create Form seçeneği ile form test penceresini açarak test
edelim.



Bu örneği formun onSave olayı içinde uygulaya biliriz.
onChange: alanlar (Field) üzerinde işlem yapıldığında çalışacak olan JavaScript Kodunu bu olaya yazarız.
onChange için alan (Field) üzerine çift tıklanır. 


Açılan pencerede Events tabında Edit ‘e tıklarız.

onChange için ilk örneğimize başlayalım bu örneğimiz telefon(mask)
formatı olsun. Yeni başlayanlar için biraz uzun bir örnek olabilir
fakat bazı projelerde kullandığım için sizlerle paylaşmak istedim.
Ayrıca mevcut alanlar ve sonradan eklenen (custom) alanlarıda nasıl
kullanacağımızı gelecek dersde göreceğiz.

var objField = crmForm.all.telephone1;//telefon alanımızın alan ismini objfield değişkenine atıyorum
var sText=objField;
try {
if (objField.DataValue == null)//telefon alanımın text’i yani içindeki değer boş ise geri dönüyorum
return true;

var str = objField.DataValue;

// bosluklari kaldir
str = str.replace(/ /g, "");

// eger ilk karakter + ise geri kalanlar için numerik kontrolü yap
if (str.charAt(0) == '+') {
if (!IsNumeric(str.substr(1)))
{
// Hata
alert("Please use only numeric charecters at this field.");
objField.DataValue ="";
return false;
}
str = str.substr(0, 1) +' ' + str.substr(1, 2) + '( ' + str.substr(3,
3) + ') ' + str.substr(6, 3) + ' ' + str.substr(9, 2) + ' ' +
str.substr(11, 2); 
}
else {
// bosluklar silindikten sonra numerik kontrolü yap
if (!IsNumeric(str.substr(1))) {
// Hata
//alert("Please use only numeric charecters at this field.");
objField.DataValue ="";
return false;
}
else {
// 10 veya 11 karakterse uygun formata sok
if (str.length == 10 || (str.length == 11 && str.charAt(0) == '0')) {
// Formata sok
if (str.length == 10) {
str = "0" + str;
}
str = str.substr(0, 1) + '( ' + str.substr(1, 3) + ') ' + str.substr(4,
3) + ' ' + str.substr(7, 2) + ' ' + str.substr(9, 2);
}
else // 10 veya 11 karakter degilse hata mesaji ver
{
// Hata
alert("Please for domestic phone numbers use only '0 212 444 05 35' or
'212 444 05 35' format at this field. for Overseas phone numbers put a
'+' sign at the beginnig of Number."); 
objField.DataValue ="";
return false; 
}
}
}
objField.DataValue = str;
}
catch (err) {
txt = "(initialize) There was an error on this function.\n\n"; 
txt += "Click OK to continue.\n\n";
alert(txt);
}
function IsNumeric(sText) 
{
var ValidChars = "0123456789";
var Char;
for (i = 0; i < sText.length; i++) {
Char = sText.charAt(i);
if (ValidChars.indexOf(Char) == -1) {
txt = " Please enter only numeric charecters at this field. \n\n";
txt += "Click OK to continue.\n\n";
objField.DataValue ="";
alert(txt);
return false;
}
}
return true;
}


Üst menüden Preview>Create Form seçeneği ile form test penceresini açarak test edelim.



Son olarak save and close tuşuna basıp kaydedip kapatıktan sonra form’un
üst tarafında bulunan publish buttonuna basarak özelleştirmiş olduğumuz
özellikleri yayımlarız. Crm form larında javascript le ilgili örnek
kodlar yazmaya diğer makalelerimde devam edeceğim görüşmek dileğiyle....

CRM de IFRAME


Merhaba, CRM 2011’in beta sürümünün release olmasıyla birlikte makale yoğunluğumuz yeni sürümün özelliklerine kaymıştı normal olarak. Bu yeni özellikleri en azından önemli kısımlarından bahsettikten sonra, odağımızı developer kısmına getirme zamanı geldi. Bir CRM danışmanı olarak sık sık ihtiyaç olan konuları bir seri halinde sunmak istiyoruz. Tips and Tricks olark isimlendireceğimiz seride, plugin kodlamaktan javascript düzenlemelerine kadar CRM projelerinde ihtiyaç duyulan geliştirme özelliklerden bahsedeceğiz. Karşılaştığınız sorunların en azından bir kısmına derman olabilir belki.. 

Bu serinin ilk konusu ise Iframe’ler hakkında olacaktır. CRM formları içinde bambaşka Internet uygulamlarını
çağırabileceğiniz bir yapı. Herhangi bir formun customization ekranındaki Insert tabında bulunan Iframe düğmesine
tıklayarak ekleyebilirsiniz.


Daha sonra buradkai bilgileri istediğiniz gibi doldurabilirsiniz.

Burada yazdığınız URL alanı içinde yazdığınız site gösterilecektir. “Pass record object type code and unique identifier as parameters” kutusu önemlidir. Bu kutuya tıkladığınızda, verdiğiniz adresin sonuna formun objecttypecode değeri (yani hangi entity olduğu bilgisi) ve formdaki kaydın id’si Querystring parametresi olarak gönderilir. Dolayısıyla
bu iki veriden yola çıkarak hangi entity’nin hangi kaydında bulunduğunuzu anlayabilirsiniz.

Bu şekilde bir Iframe oluşturuduğunuzda içeride gösterilecek URL aşağıdaki gibi bir adres olacaktır.



gördüğünüz gibi temel verilerin hepsi Iframe olarak gelmiştir. Eğer Iframe olarak bir asp.net uygulaması yazdıysanız ASP.net içinde Request.Url.AbsoluteUri yolunu kullanarak siteye gönderilen url’yi alabilirsiniz.

Iframe’ler hakkında bahsetmek istediğim öenmli bir teknik daha, Iframe’in adresini formun javascript’inde değiştirmenizdir. Mesela form ilk yüklenirken, adresi dinamik olarak set edebilirsiniz veya mesela bir picklist’den bir değer seçildiğinde farklı bir adresin ayarlanmasını sağlayabilirsiniz. Örnekleri çoğaltmak mümkün. Bu durumda Iframe’i tanımlarken URL kısmına about:blank yazmalısınız.



Javascript kodu olarak ise aşağıdaki gibi bir kod işinizi görecektir. crmForm.all.IFRAME_mscrm.src = ‘www.xrmplatform.net’;

Bu yazım CRM 4.0 için geçerlidir. 2011 için kullanımı aşağıdaki gibi olmalıdır

Xrm.Page.getControl("IFRAME_mscrm").setSrc("www.xrmplatform.net");

Ayrıca acılan sayfadaki aracların tetiklenmesi (butona tıklanması,drop downun secilmesi vs.) için "Select whether to restrict cross-frame scripting" bolumundeki seçili işaretini kaldırınız.

Xml Dosyasından Veri Okuma --JQuery


.xml uzantılı verilerimizi okuyacagımız dosyanın içeriği aşağıdaki gibidir.

<?xml version="1.0" encoding="utf-8"?>
<iller>
 <il >
   <telefonkodu>
     0 212
   </telefonkodu>
   <sehir>
     Istanbul
   </sehir>
 
       </il>
 
 <il >
 
   <telefonkodu>
     0 442
   </telefonkodu>
   <sehir>
     Erzurum
   </sehir>
       </il>
</iller>


Evet xml tanımladık ve şimdi ajax metodu ile bu xml dosyamıza ulaşalım ve içeriğini alalım

<script type="text/javascript">
$.ajax({
  url:'veri.xml',
  type:'POST',
  dataType:'xml',
  success:function(xml){
                //Eğer işlem başarılı ise burada ki kodlar çalışacak.
                alert('Veri başarı ile yüklendi.')
 
});
</script>

Peki XML i sayfaya yükledik ama içinde ki düğümlere teker teker ulaşalım.Nasıl derseniz bakın şöyle;Eğer işlem başarılı ise neler yapılabileceğine bakalım:

<script type="text/javascript">
$.ajax({
  url:'veri.xml',
  type:'POST',
  dataType:'xml',
  success:function(xml){
                //Eğer işlem başarılı ise burada ki kodlar çalışacak.
                $(xml).find('il').each(function(){
                 var telKodu=$(this).find('telefonkodu').text();
                 //0 212,0 442
                 var iladi=$(this).find('sehir').text();
                 //Istanbul,Erzurum
             })
 
});
</script>
Evet bu şekilde bilgilere ulaşmaya çalıştık ve ulaştık. Son olarak XML dosyasının Cash yapmasını engellememiz lazım olabilir.Bunu da extra bir bilgi olarak paylaşmak isterim. Yukarıda ki kodlara bir kaç ekleme yaparak bunu halledelim.
<script type="text/javascript">
var rast=Math.round(Math.random()*10000);
//sayfa her yüklendiğinde 1 ile 10000 arasında rastgele bir sayı oluşturalım.
$.ajax({
  url:'veri.xml?uid='+rast,//dosya uzantısının sonunu bu şekilde değitirelim
  type:'POST',
  dataType:'xml',
  success:function(xml){
                //Eğer işlem başarılı ise burada ki kodlar çalışacak.
                $(xml).find('il').each(function(){
                 var telKodu=$(this).find('telefonkodu').text();
                 //0 212,0 442
                 var iladi=$(this).find('sehir').text();
                 //Istanbul,Erzurum
             })
 
});
</script>

ASP.Net onMouseOver Büyüyen Resim


bir tane css olusturup ıcıne asagıda kodu ekle..
/* Image Hover */
.thumbnail{
position: relative;
z-index: 0;
}
.thumbnail:hover{
background-color: transparent;
z-index: 50;
}
.thumbnail span{
position: absolute;
background-color: #444444;
padding: 2px;
left: -1000px;
border: 1px dashed #2F4F4F;
visibility: hidden;
color: #000000;
text-decoration: none;
}
.thumbnail span img{
border-width: 0;
padding: 1px;
}
.thumbnail:hover span{
visibility: visible;
top: 0;
left: 150px;
}

/* Image Hover */
daha sonrasında ıstedıgın bır sayfada asagıdakı kodu yaz
 <a class="thumbnail" href="#thumb">
            <asp:ImageButton ID="ImageButton4" runat="server" Height="117px" ImageUrl="KUCUKRESİMYOLU"
                Width="125px" />
            <span>
                <img id="yanresim" runat="server" alt="" src="BUYUKRESİM" /></span></a>

Twitter Fotoğrafta Paylaştıracak


Sosyal ağ devi, en büyük eksiklerinden ikisini giderdi, yenilikler resmen duyuruldu.
Milyonlarca kişinin üyesi olduğu ve anlık sözlü paylaşımlar yapılan Twitter'a Twitpic tarzı yeni bir fotoğraf paylaşma servisi gelebilir.
İlk önce TechCruch'ta yayınlanan bu haber, ardından AllThingsD.com tarafından da doğrulandı. Bugün Kaliforniya'da gerçekleşecek olan D9 konferansında da Twitter CEO'su Dick Costolo'nun konu hakkında konuşması bekleniyor.
Twitter tarafından daha entegre bir sistem istenirken, bu servisin Twitter'ın yeni aldığı alan adlardından twimg.com üzerinden sağlanacağı da söylenenler arasında.
Twitter, birkaç hafta içinde kullanıma sunulacak fotoğraf paylaşım hizmetini resmen duyurdu. Bu sayede bir fotoğraf yükleyip 'Tweet'lerinize direkt olarak eklemek mümkün hale geliyor.

CRM 2011-PLUGIN YAZMA


Bugünkü makalemizde Microsoft Dynamics Crm 2011 içerisindeki bir entity'e pre plug-in yazmasını öğreneceğiz. Plug-in mimarisini Microsoft Dynamics Crm 4.0 mimarisinden bildiginiz gibi iki çeşiti vardır. ( Pre Plugin ve Post Plugin )
İsterseniz ilk önce pre plugin ile post plugin arasındaki farkları anlatalım.
Pre-Plugin : Kayıt içerisinde kayıt edilmeden hemen önce çalışan yapıdır. Bu yapıda biz ilgili kayıt henuz kayıt edilmeden istersek gerekli kontrollerimizi yapar ve kaydı engelleriz istersek kayıt henuz kayıt edilmeden önce ilgili kayıt üzerinde bazı değerler ekleyebilir veya çıkartabiliriz.
Post Plugin : Kayıt içerisinde kayıt edildikten sonra çalışan yapıdır. Post pluginler ile yapabiliceklerimiz örnek olarak bir kayıt oluştuktan sonra bir başka entity de farklı bir kayıt oluşturmak olabilir.
Biz makalemizde pre plugin yapısını inceleyeceğiz.
Seneryomuzda kişi kartı üzerinde çalışan bir pre plugin yapımızın olduğunu varsayalım. Microsoft Dynamics Crm 2011 sisteminde bir kişi eklendiği zaman ilgili kişiye bir kişi seri numarası atayalım.
  • İlk önce kişi kartı üzerinde kişi  seri numarası adında bir field oluşturalım . new_kisiserinumarasi.
  • Visual Studio 2010 üzerinde  yeni bir class library projesi açalım.
Class ımızın adına KisiSeriUpdate adını verdim. Plug-in işlemlerimizi gerçekleştirmek için ihtiyacımız olan referansları ve dll leri sırası ile ekleyelim.
microsoft.xrm.sdk.dll
Microsoft.Crm.Sdk.Proxy.dll
Yukarıdaki ilgili dll leri Crm server ımızın kurulu olduğu makina üzerinde bin klasörünün altında bulabilirsiniz.
System.Runtime.Serialization referansımızıda projemize ekleyelim.
Uygulamamız içerisindeki referanslarımız aşağıdaki şekilde olmalıdır.
Kod yazımına başlamadan önce projemize son olarak bir key file ekleyelim. bunun için gerekli olan adımlar aşağıdaki gibidir.
  • Projemiz üzerinde sağ tuş özellikler ekranına ulaşalım . Karşımıza aşağıdaki gibi bir ekran gelecektir.
Dikkat etmemiz gereken noktalardan biri uygulamamızın .net framework 4.0 olmasıdır.
Signing kısmından yeni bir key file ekleyelim.
Yukarıdaki adımlarımızı tamamladıktan sonra artık plugin yazma işlemlerimize başlayabiliriz.
using Microsoft.Xrm.Sdk;
 
namespace PrePlugin
{
    public class KisiSeriUpdate:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            throw new NotImplementedException();
        }
    }
}
Uygulama içerisinde oluşturduğumuz KisiSeriUpdate class ımıza IPlugin interface ini implement edelim. IPlug in interface i Microsoft.Xrm.Sdk içerisinde bulunmaktadır.
İnterface imizi implement ettikten sonra Execute method unun geldiğini göreceksiniz. Plugin işleyişi Execute metot'u içerisinde olur.  Şimdi Execute method u içerisinde ilgili işlemlerimizi yapalım.
 public void Execute(IServiceProvider serviceProvider)
        {
            try
            {
                // Plug-in imizi yakalamak için serviceprovider nesnesi üzerinden gelen asagıdaki adımlarımızı tamamlayalm.  
Asagıdaki kod blogunda plug-in imizi çalıstırmak için gerekli olan servislerimizi ve ilgili servisi çalıstırmamız için gerekli olan kullanıcımızı 
yakalamaktayız. ( Plug-in imizi hangi kullanıcı çalıstırdıgı ise o kullanıcının bilgileri bize context.UserId degeri ile birlikte gelecektir.  
Dolayısı ile islemlerimiz de ilgili kullanıcının yetkisi dahilinde olacaktır. 
 
                 Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
                
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
 
                // if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) context nesnesinin içerisindeki 
parmetrelerde Target parametresini olup olmadıgına ve ilgili parametrenin entity olup olmadıgına bakalım. 
 
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    // Son olarak kendi olusturmus oldugumuz entity nesnesi içerisine yukarıda kontrol ettigimiz context nesneinin 
Target input parametresini verelim. 
                    Entity entity = (Entity)context.InputParameters["Target"];
 
                    // entity nesnesi içerisinde bizim kisi kartı üzerinde girdigimiz degerler bulunmaktadır. 
                }
            }
            catch (Exception ex)
            {
                // Plug-in içerisinde herhangi bir hata ile karsılasır isek bunu kullanıcıya mesaj olarak çıkartalım. 
                throw new InvalidPluginExecutionException("Genel Hata : " + ex.Message);
            }
        }
Yukarıda yapmış olduğumuz işlemler aslında bir plug-in yazımı aşamasındaki kalıp işlerimizdir. Servis ayarlarımızı aldık servise hangi kullanıcı ile baglanıcağımızın bilgilerini aldık . Kişi kartı içerisinde kullanıcının girdiği değerleri yakaladık.
Şimdi kişi kartı içerisine kisi seri numarası alanına değerimizi yazalım.
entity.Attributes.Add("new_kisiserinumarasi", 123456);
entity nesnesi içerisindeki Attributes listesine Add method u ile yeni bir değer ekleyelim. Eklemek istediğimiz field ın sistemsel adını verelim. new_kisiserinumarasi , field değerini belirttikten sonra ilgili alana değerimizi yazalım ben burda 123456 değerlerini yazdım bu değerler istenirse bir xml dosyasından da çekilebilir.
Plug-in işlemlerimiz bitmiştir. Şimdi uygulamamızı derleyelim ve dll çıktımızı alalım.
PrePlugin.dll dosyamızı Crm server ımıza plugin registration tool ile yukleyip test edebiliriz.