11 Aralık 2013 Çarşamba

MVC Custom Dropdown List

Merhabalar,

MVC ile uğraşanlar bilirler. MVC'nin kendi Helper'ları bazen istediklerinizi yapamazlar :(

Bizlerde bu tür durumlarda oturur 3rd party uygulamalara yöneliriz ki bazen onlarda bizim ihtiyacımızı göremezler. Neyse lafı çok fazla uzatmadan konuya gelelim. DropDownList (HTML Select) nesnesi kullanımında özel bir duruma ihtiyaç duydum. Option nesnelerine özel eklemek istediğim attribute ler vardı ama MVC Helper ile bunu yapmanın bir yolunuda bulamadım :( ve oturdum kendi MVC Helper'ımı yazdım :) diğer adı ile namı değer DropDownList.

İlk olarak kodumuz .net 4.5 ve MVC 4.0 üzerinde geliştirildi.

En çok eklediğimiz Seçiniz, Hepsi ve her ikisinin birlikte kullanıldığı durumları otomatik olarak ekliyor siz başka seçenekleri de ekleyebilirsiniz :)

Kodda İlk olarak Enum'larımız ve Struct'larımı ile başlayalım;
namespace CustomDropDownList.Core
{
    public class Enums
    {
        public enum SelectListDataSource
        {
            DataInternal = 1,
            External = 2
        }
        public enum SelectListAddOption
        {
            Select = 1,
            All = 2,
            SelectAndAll = 3,
            None = 4
        }
    }
}
 
namespace CustomDropDownList.Core
{
    public class DropDownListValues
    {
        public const short SelectValue = -1;
        public const short SelectAllValue = -2;
    }
}

İkinci olarak SelectListItem ile devam edelim;
using System.Collections.Generic;
using System.Text;
 
namespace CustomDropDownList.Extensions
{
    public class SelectListItem
    {
        public Dictionary<string, object> OptionAttribute { get; set; }
        public Dictionary<string, object> HtmlAttribute { get; set; }
        public bool Selected { get; set; }
        public string Text { get; set; }
        public object Value { get; set; }
        public SelectListItem()
        {}
        public SelectListItem(string text, string value)
        {
            Text = text;
            Value = value;
        }
        public SelectListItem(string text, string value, Dictionary<string, object> optionAttribute) : this(text, value)
        {
            OptionAttribute = optionAttribute;
        }
        public SelectListItem(string text, string value, Dictionary<string, object> optionAttribute = null, Dictionary<string, object> htmlAttribute = null) : this(text, value, optionAttribute)
        {
            HtmlAttribute = htmlAttribute;
        }
        public override string ToString()
        {
            var opAttr = new StringBuilder();
 
            if (OptionAttribute != null)
                foreach (var o in OptionAttribute)
                    opAttr.Append(string.Format(" data-{0}=\"{1}\"", o.Key, o.Value));
 
            if (HtmlAttribute != null)
                foreach (var h in HtmlAttribute)
                    opAttr.Append(string.Format(" {0}=\"{1}\"", h.Key, h.Value));
 
            if (Selected)
                opAttr.Append(" selected=\"selected\"");
 
            return string.Format("<option value=\"{0}\"{2}>{1}</option>", Value, Text, opAttr);
        }
    }
}

Üçüncü olarak SelectList ile devam edelim;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using CustomDropDownList.Core;
 
namespace CustomDropDownList.Extensions
{
    public class SelectList
    {
        public List<SelectListItem> OptionItems { get; private set; }
        public string OptionItemsHtml { get; private set; }
        public IEnumerable Items { get; private set; }
        public string DataTextField { get; private set; }
        public string DataValueField { get; private set; }
        public object SelectedValue { get; set; }
        public Dictionary<string, object> OptionAttributes { get; private set; }
        public Dictionary<string, object> HtmlAttributes { get; private set; }
        public Enums.SelectListDataSource OptionDataType { get; private set; }
 
        public SelectList(IEnumerable items,
            string dataValueField,
            string dataTextField,
            object selectedValue = null,
            Dictionary<string, object> optionFields = null,
            Dictionary<string, object> htmlAttribute = null,
            Enums.SelectListDataSource optionDataType = Enums.SelectListDataSource.DataInternal)
        {
            DataTextField = dataTextField;
            DataValueField = dataValueField;
            OptionAttributes = optionFields;
            HtmlAttributes = htmlAttribute;
            OptionDataType = optionDataType;
            Items = items;
            SelectedValue = selectedValue;
            OptionItems = new List<SelectListItem>();
            Generator();
        }
 
        private void Generator()
        {
            var htmlString = new StringBuilder();
            foreach (var i in Items)
            {
                var dv = i.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).SingleOrDefault(p => p.Name == DataValueField);
                var dt = i.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).SingleOrDefault(p => p.Name == DataTextField);
 
                if (dv != null && dt != null)
                {
                    OptionItems.Add(new SelectListItem
                    {
                        Value = dv.GetValue(i),
                        Text = dt.GetValue(i).ToString(),
                        OptionAttribute = AttributeGenerator(OptionAttributes, i, true),
                        HtmlAttribute = AttributeGenerator(HtmlAttributes, i),
                        Selected = SelectedValue != null && dv.GetValue(i).ToString() == SelectedValue.ToString()
                    });
                    htmlString.Append(OptionItems.Last().ToString());
                }
            }
            OptionItemsHtml = htmlString.ToString();
        }
 
        private Dictionary<string, object> AttributeGenerator(Dictionary<string, object> attributes, object item, bool isOptionAttribute = false)
        {
            var attr = new Dictionary<string, object>();
            if (attributes != null)
            {
                foreach (var h in attributes)
                {
                    if (!string.IsNullOrWhiteSpace(h.Key) && h.Value != null)
                    {
                        object attrDataValue = null;
                        if (isOptionAttribute && OptionDataType == Enums.SelectListDataSource.DataInternal)
                        {
                            var entityData = item.GetType().GetProperties().SingleOrDefault(p => p.Name == h.Value.ToString());
                            if (entityData != null)
                                attrDataValue = entityData.GetValue(item);
                        }
                        else
                        {
                            attrDataValue = h.Value;
                        }
 
                        if (attrDataValue != null && !string.IsNullOrWhiteSpace(attrDataValue.ToString()))
                        {
                            attr.Add(h.Key, attrDataValue);
                        }
                    }
                }
            }
            return attr;
        } 
    }
}

Dördüncü olarak SelectExtension ile devam edelim;
using System.Collections.Generic;
using System.Web.Mvc;
using CustomDropDownList.Core;
 
namespace CustomDropDownList.Extensions
{
    public static class SelectExtension
    {
        public static string Name { get; set; }
        public static string ID { get; set; }
        public static SelectList SelectList { get; set; }
        public static Dictionary<string, object> HtmlAttributes { get; set; }
        public static Enums.SelectListAddOption AddOption { get; set; }
 
        private static MvcHtmlString Generator()
        {
            var builder = new TagBuilder("select");
            builder.MergeAttribute("name", Name);
 
            if (!string.IsNullOrWhiteSpace(ID))
                builder.MergeAttribute("id", ID);
 
            if (HtmlAttributes != null)
                foreach (var h in HtmlAttributes)
                    builder.MergeAttribute(h.Key, h.Value.ToString());
 
            switch (AddOption)
            {
                case Enums.SelectListAddOption.Select:
                    builder.InnerHtml += string.Format("<option value=\"{0}\">{1}</option>", DropDownListValues.SelectValue, "Select") + "\n";
                    break;
                case Enums.SelectListAddOption.All:
                    builder.InnerHtml += string.Format("<option value=\"{0}\">{1}</option>", DropDownListValues.SelectAllValue, "All") + "\n";
                    break;
                case Enums.SelectListAddOption.SelectAndAll:
                    builder.InnerHtml += string.Format("<option value=\"{0}\">{1}</option>", DropDownListValues.SelectValue, "Select") + "\n";
                    builder.InnerHtml += string.Format("<option value=\"{0}\">{1}</option>", DropDownListValues.SelectAllValue, "All") + "\n";
                    break;
 
            }
 
            builder.InnerHtml += SelectList.OptionItemsHtml + "\n";
 
            return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
        }
 
        public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper,
            string name,
            SelectList selectList,
            Enums.SelectListAddOption addOption = Enums.SelectListAddOption.None,
            string id = "",
            Dictionary<string, object> htmlAttributes = null)
        {
            Name = name;
            ID = id;
            SelectList = selectList;
            AddOption = addOption;
            HtmlAttributes = htmlAttributes;
            return Generator();
        }
    }
}

Ve son adım olarak cshtml içersinde örnek kullanım ile bitirelim;
@using CustomDropDownList.Extensions
@using CustomDropDownList.Core
@{
    ViewBag.Title = "Custom DropDownList Test";
}
 
        @Html.DropDownList("Cities",
                           new CustomDropDownList.Extensions.SelectList(
                               ViewBag.Cities,  // Data Items
                               "CityID",  // DataValueField
                               "Name",  // DataTextField
                               null, // SelectedValue
                               new Dictionary<string, object> { 
                                   { "NationalName", "NationalName" }
                               }, // Option Attributes
 
                               null,  //HTML Attributes
                               Enums.SelectListDataSource.DataInternal
                               ),
                           Enums.SelectListAddOption.Select, // DropDownList Select Options
                           "Cities", // DropDownList Html ID
                           new Dictionary<string, object> {  // DropDownList Custom Html Attributes
                               { "class", "location-items"}
                           })


Umarım işinize yarar ve lütfen unutmayın ki oldukça hızlı yazdığım bir kod atladığım yerler olabilir af ola :)


Sevgiler,
Cihan. 

6 Aralık 2013 Cuma

Visual Studio 2013 de Debug moddan çıkınca IIS Express kapanıyor. Bunu nasıl değiştirir veya düzeltirsiniz ?

Merhabalar,


Bazı durumlar için iyi gibi gözüksede işin aslı developer lar için pekte istenen bir durum değil.

Peki ilk hali olan Debug moddan çıksanız bile IIS Express'in çalışmaya devam etmesini nasıl geri getirebilir veya düzeltebilirsiniz. İşte bu sorunun cevabını aşağıda bulabilirsiniz.

Öncelikle bunun nedeni IIS Express değil bunu söylemekte fayda var.

Ve işte başlıyoruz:

Visual Studio 2013'de  iken;
Menüden  Tools > Options tıklıyoruz.
Açılan ekranda ise Debugging > Edit And  Continue gidiyoruz.
Bu ekranda iken  "Enable Edit and Continue" seçeneğinin solundaki onay işaretini kaldırıyor ve OK butonuna basıyoruz.
Aşağıda Ekran görüntüsünüde görebilirsiniz.

Tools Options Debugging Edit And Continue

Benzer bir işlemi projemiz üzerinde de yapmamız gerekebilir.
Bunun için Solution Explorer da projemizin üzerine geliyor ve mouse'un sağ tuşuna tıklıyoruz. Çıkan menüde "Properties" e tıklıyoruz. Genelde en aşağıda olur.
Burada önce Web sekmesine geliyoruz ardından "Enable Edit and Continue" seçeneğinin solundaki onay işaretini kaldırıyor ve pencereyi kapatıyoruz.
Aşağıda ekran görüntüsünü görebilirsiniz.

Project Properties Web Tab


Böylelikle bu işlemleri yaptıktan sonra IIS Express Debug mode sorununuz çözülmüş oluyor.

Geçmiş olsun :)


Sevgiler,
Cihan.

IPad Air Wifi İncelemesi

Merhabalar,


Çok yakında, Apple'ın yeni çıkardığı Ipad Air Wifi'ın Kutudan çıkarma (UnBoxing) ve Detaylı incelemesini btuzmani.com için yapacağım. İncelemenin bir benzerini burada da bulabilirsiniz.
İnceleme için şuan ürünün bana ulaşmasını bekliyorum. O zamana kadar aşağıdaki teknik bilgileri sizlerle kısaca paylaşmak istiyorum.

Ipad Air Wifi'ın bazı teknik özellikleri;

Ağırlık : 469 gram (Wifi versiyonları)
Boyutları : Genişlik - 169.5mm  / Yükseklik - 240mm / Kalınlık - 7.5mm
Pil Süresi : 10 saat (Kullanım şekliniz bunu değiştirir)
Ekran : 9.7"(diagonal) Retina / 2048 x 1536 px / 264 ppi / IPS / LED / Multi Touch
İşlemci : Apple A7 64bit Cpu (1.3ghz Çift Çekirdek) / Ek olarak M7 Hareket(Motion) Cpu
Görüntü İşlemcisi : PowerVR G6430 GPU
Bağlantı Özellikleri : Wi-Fi (802.11a/b/g/n) Çift Kanal (2.4GHz ve 5GHz) MIMO ve Bluetooth 4.0
Kamera  : Arka - 5 mega pixel iSight BSI f/2.4 1080p Video Kayıt  / Ön 1.2 mega pixel  BSI 720p
Üzerindeki Sensörler :  Işık / İvme Ölçer / Üç Eksenli Gyro
Hafıza Kapasiteleri : 16 / 32 / 64 /128 GB
İşletim Sistemi : IOS 7


Detaylı incelemede görüşmek üzere.

Sevgiler,
Cihan.


29 Kasım 2013 Cuma

Visual Studio 2013 IntelliSense doesn’t work

Visual Studio 2013 IntelliSense Çalışmıyor! Ne yapmalısınız ?


Merhabalar,
Visual Studio 2013 çıktı ama bazı sorunları ile beraber çıktı. Bunlar insanı bazen deli ediyor.
En son yine böyle bir durumu IntelliSense de yaşadım ve nasıl çözülebileceğinin farklı yollarını  yazayım dedim.

Buyrunuz :)


İlk olarak menüden Tools > Options tıklıyoruz.
Karşımıza çıkan ekranda ise Text Editor > All Languages > General sekmesine geliyoruz
Statement completion altında yer alan "Auto list members" ve "Parameter information" kutucuklarının işaretlli olup olmadıklarını kontrol ediyoruz eğer işaretli değillerse işaretliyoruz.
İşte ekran görüntüsü;

Visual Studio 2013 TextEditor AllLanguages


Bende sorun düzelmedi ve aşağıdaki yöntemi uygulayarak devam ettim.

Şimdi ise Tools > Options tıklıyoruz.
Karşımıza çıkan yeni ekranda ise Text Editor > C# (Siz başka bir dili de seçebilirsiniz) > IntelliSense sekmesine geldiğimizde karşımıza aşağıdaki gibi bir ekran çıkıyor.

Text Editor > C# > IntelliSense

Ayarlarınız yukarıdaki gibi yapıp OK butonuna basıp Visual Studio 2013'ü kapatıp yeniden açtığınızda düzelmiş olması gerekiyor.

Ama eğer düzelmedi diyorsanız işte o zaman aşağıdaki yöntemi uygulama ile devam ediyoruz. Bilişim sektörünün olmazsa olmazı olan kapat aç düzelir yani namı değer RESET'i ayarlar için yapıyoruz.
Peki nasıl ?

Tools > Import and Export Settings...  tıklıyoruz. Karşımıza çıkan pencereden Reset all Settings seçip Next butonuna basıyoruz.

Tools > Import and Export Settings Wizard Step 1

Karşımıza aşağıdaki gibi bir ekran geliyor ve No, just reset settings, overwriting my current settings seçeneğini seçip Next butonuna basıyoruz.

Tools > Import and Export Settings Wizard Step 2

Karşımıza çıkan yeni pencerede hangi ayar setini kullanıyorusanız onu seçip sonrasında Finish butonuna basıyoruz. Benim varsayılan (Default) tercihim Visual C# olduğu için onu seçtim. Eğer sizdeki farklı ise kendi tercihinizi seçebilirsiniz mesala General gibi. Ekran görüntüsünü aşağıda bulabilirsiniz.

Tools > Import and Export Settings Wizard Step 3

Yaptıktan sonra bu aşamadaki son ekranımız ile karşılaşıyoruz. Visual Studio yaptığı işlemi bizimle paylaşıyor ama gördüğünüz üzere pekte başarılı olamamış.

Tools > Import and Export Settings Wizard Step 4

Close diyip kapatıyoruz pencereyi ama...

Olmadı neden ?
ReSharper kullandığım için acaba o mu sorun çıkarttı diye düşündüm ve Visual Studio 2013 'ü command line dan /safemode da çalıştırdım.

devenv.exe /safemode

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE>devenv.exe /safemode

Daha sonra yukarıdaki adımları tekrar uyguladım ve nihayet sıfırlama işlemi başarılı oldu ve işte mutlu son :))

Tools > Import and Export Settings Wizard Step 4 Success

Son kez Visual Studio 2013'ü tekrardan kapatıp açtığımda IntelliSense artık nihayet çalışıyor.

Ama sizde yine de çalışmadı ise o zaman birde şunları deneyin derim;

Visual Studio 2013 kapalı iken, bilgisayarınızda kullanıcı dosyalarının olduğu klasöre gidip Visual Studio'nun ayar dosyalarının olduğu dizini bulun;

C:\Users\cihan.dokur\AppData\Roaming\Microsoft\VisualStudio

gibi olmalı. Benim bilgisayarımdaki kullanıcı dosyaları aşağıdaki klasörde muhtemelen de sizde kullanıcı adı "cihan.dokur" yazan yerde kendi kullanıcı adınızın yazması dışında aynıdır.

İçinde 12.0(11.0 yada 10.0 da olabilir) gibi bir klasör olmalı bu klasörün adını değiştirip Visual Studio'yu yeniden açtığınızda Visual Studio 2013 en baştan ayarlarınızı yapmanızı isteyecektir sonrasında sorun düzelmiş olması gerekir.

Yinede düzelmedi ise çalıştığınız dosyanın projeden Exclude edilip edilmediğine bir bakmanızda fayda var. Exclude edildi ise Include etmeyi deneyin.

Bu sefer de düzelmedi ise Visual Studio üreticisi Microsoft'a güzel sözler söyleyip. Yeniden kurmanızı (ReInstall) öneririm :))

Umarım bu sorun ile karşılaşmazsınız ama karşılaşırsanız bakacağınız yer burası biliyorsunuz :)

Sevgiler,
Cihan.




22 Kasım 2013 Cuma

Entity Framework 6 güncellemesi nasıl yapılır ?

Bildiğiniz üzere yeni özellikleri ve yeni yapısı ile EntityFramework 6 yayınlandı.

Diyelim ki EntityFramework'ün önceki versiyonlarından yeni versiyonuna geçiş yapmak istiyorsunuz.
Peki nasıl geçiş yapacaksınız ?
İşte bu sorunun cevabını aşağıda anlatmaya çalıştım :)


Başlamadan önce;
  • Bu güncellemeyi Visual Studio 2012 ve 2013 versiyonlarında c# programlama dili için yapacağız.
  • Projenizin yedeğini ise almayı lütfen unutmayın. ( Microsoft bu bazen süprizler yapabilir :)  )
yukarıdaki durumlar tamam ise devam edelim.

Başlıyoruz;

İlk olarak Entity Framework 6'yı kurmamız gerekiyor.

Bunu yapmanın iki yolu var bunlar;

1 -) Projenizin References (referansları) üzerinde sağ tıklayıp  Manage Nuget References 'a tıklayın. Açılan ekranda arama kutusuna "EntityFramework" yazdığınızda aşağıdaki gibi bir ekran ile karşılacaksınız, seçiminizi yapıp "Install"  butonuna bastığınızda kurulum ekranı çıkacak ve dosyaları internet den indirip sizden bir  "I Accept" (kabul ediyorum) onayı isteyecek. Sonrasında ise kurulumunuz tamamlanmış olacak.
Manage Nuget Packages


2 -) Paket yöneticisi konsolundan aşağıdaki komutu yazarak da kurulumu yapabilirsiniz.

PM> Install-Package EntityFramework


Kurma işlemimiz tamamlandı. Şimdi ise bütün projelerinizdeki System.Data.Entity referansını(Reference) silmeniz gerekiyor. Aslında Nuget paket yöneticisi bunu sizin yerinize otomatik olarak yapıyor ama siz yinede emin olmak için şöyle bir baksanız fena olmaz hani :)

Devam edelim;

Edmx dosyasının altında bulunan önceki versiyona ait edmx_dosya_adi.tt ve edmx_dosya_adi.Context.tt dosyalarını siliyoruz.
Aşağıdaki örnek ekran görüntüsündeki sarı ile işaretlenmiş BlogData.tt (altındaki tüm dosyalar dahil) ve BlogData.Content.tt dosyalarını siliyoruz.

Solution Explorer Edmx Silme


Sonrasında .edmx (Bir üst resimdeki BlogData.edmx gibi) dosyasını çift tıklayıp açıyoruz. Açtığınız da bazen boş olduğunu ve entity'lerin olmadığını görebilirsiniz.
Sakin olun kaybolan giden birşey yok:) birazdan gelecekler :)

Entity Framework 6.0 Add Code Generation Item

Dosya üzerinde sağ tuşa bastığınızda yukarıdaki gibi bir menü ile karşılacaksınız. "Add Code Generation Item..." tıklayın.


Karşımıza yukarıdaki ekran görüntüsü geliyor. Soldaki Data sekmesini seçtikten sonra sağdan EF 6.x DbContext Generator seçiyoruz. Name kısmına bu örnekte "BlogData.tt" yazıyoruz ama siz isterseniz başka isimde verebilirsiniz örneğin Model1.tt gibi. Sonrasında "Add" butonuna basıyoruz. Az önce sildiğimiz iki dosyanın EntityFramework 6.0 olarak yeniden oluşturulmasını sağlıyoruz. Dosyaları Solution Explorer'dan da görebilirsiniz.

Böylelikle edmx dosyamızı güncellemiş olduk. Dosyayı kapatıp tekrar açtığınızda entity'lerin geri geldiğini göreceksiniz ama henüz yapacaklarımız bitmedi.

Son olarak;
EF 6.0 ile birlikte gelen yeni yapı nedeniyle bazı objelerin NameSpace'leri değişti bu nedenle bazı "using" kullanımlarınızı güncellemeniz gerekiyor.

System.Data altında yer alan nesneler System.Data.Entity.Core altına taşınmış genel olarak Entity.Core'u eklemeniz yeterli.

Örneğin;
Önceki yeri : System.Data.Objects.ObjectContext
Yeni Yeri    : System.Data.Entity.Core.Objects.ObjectContext

Ayrıca aşağıdaki değişiklikleride yapmanız gerekebilir, benim projemde gerekti :)
  • System.Data.EntityState -> System.Data.Entity.EntityState
  • System.Data.Objects.DataClasses.EdmFunctionAttribute -> System.Data.Entity.DbFunctionAttribute
  • System.Data.Objects.EntityFunctions -> System.Data.Entity.DbFunctions
  • System.Data.Spatial -> System.Data.Entity.Spatial

Umarım anlatabilmişimdir.

Sevgiler,
Cihan.


Kaynak : http://msdn.microsoft.com/en-us/data/upgradeef6

31 Ekim 2013 Perşembe

Yeni Proje - Yeni Nesil Seri İlan Sitesi

Uzun bir aradan sonra yeniden merhabalar :)

Yaklaşık bir yıldır, oldukça gelişmiş özellikleri olan yeni nesil bir seri ilan projesi üzerinde uğraşıyorum.

Bugünlerde projenin fazlarından birini daha bitme noktasına geldik ve artık uygulamayı kullanıcılara sunmayada oldukça yakınız.

Bugüne kadar ki tüm bilgi birikim ve deneyimlerimi bu projede uygulama fırsatı buldum. Hatta bazılarını yeniden gözden geçirmekte nasip oldu.

Böyle bir projede hem yazılım takım lideri hemde proje yöneticisi olarak ve hatta bazen dba olarak çalışmak oldukça zor olsa da yinede eğlenceli oluyor :)

Şimdilik proje hakkında bu kadar bilgi yeter :)

Detayları uygulamayı açtıktan sonra uzun uzun yazarım :)


Görüşmek üzere.

Cihan

11 Eylül 2013 Çarşamba

Click ve Third Party Click sayımı

Merhabalar,

Bu yazıda AdServer teknolojisinin olmazsa olmazlarından “Click ve Third Party Click sayımı” üzerinde duracağız. Lafı uzatmadan başlayalım :) 
AdServer teknolojilerinde reklamın gösterim(impression) ve click değerlerini saymak oldukça önemlidir. Aslına bakarsanız bu iki sayım işin temelini oluşturmaktadır. 
Gösterim saymak oldukça kolay olmasına rağmen click saymak ise teoride kolay olsa da uygulamada pek kolay değildir. Önce click işlemini kısaca açıklayalım; Reklamı gören kullanıcı reklamın üzerine gidip tıklama işlemini gerçekleştirdiğinde genelde yeni bir sayfada tıklama adresine gider. Tıklama adresine yani hedefe giderken bazı adreslere uğrayıpta gider. Bunu günlük hayatımızda bir yerden başka bir yere giderken iki yer arasında geçtiğimiz yerler gibi düşünebilirsiniz. AdServer click işlemlerini takip edebilmek için önce kendi üzerindeki bir adrese yönlendirir sizi sonrasında ise asıl gidilmesi gerken adrese yönlendirir. Böylelikle hem AdServer click sayma işlemini yapar hemde asıl müşterinin sayfasına sizi yönlendirmiş olur. 
Şuana kadar okuduklarınız işin en kolay kısmı şimdi biraz detaya girelim. 
AdServer sistemleri hangi reklamın nerede kaç kez click lendiğini sayabilmesi için bazı parametrelere ihtiyaç duyar ve bu parametreleri tıklama adreslerine ekler. İşte bu parametrelerin doğru ve düzgün olarak aktarılması (EnCode / DeCode işlemi) click sayma işleminde hayati önem taşımaktadır. Click sayma işlemininden sonra şimdi Third Party Click sayma işlemini açıklayalım; Yukarıda açıklamaya çalıştığımız click sayma işlemi tek bir AdServer sayma işlemi yapacaksa oldukça sorunsuz ve istenildiği gibi çalışır. 
Bazı durumlarda 2 veya daha fazla AdServer birbirleri ile reklamlarını paylaşıp kendi networkleri üzerindeki web sayfalarında yayınlıyorlar. Bunlarda click sayma işlemi nasıl yapılıyor ? yukarıda anlatılan gibi olamaz mı ? teorik olarak olur olmasına da bazı sıkıntılarla karşılaşmak kaçınılmaz oluyor. 

Özellikle;
  • IFRAME
  • JavaScript
  • HTML
olarak yayına alınan reklamlarda.
İşte tam bu noktada imdadımıza Third Party Click / 3PAS / ClickThru Macro... gibi isimlerle adlandırılan Third Party Click sayımı devreye giriyor.  

Third Party Click de sayma işlemi şu akışta olur;
Third Party Adserver Click Sayar-> Yayıncı AdServer Click Sayar -> Kampanya Hedef Sayfası ( Landing Page).

İşlemin gerçekleştirilebilmesi için yayının gerçekleştirildiği adserver üzerinde tıklama parametresine ilave edilen ek bir parametrenin kullanılması gerekmektedir. Farklı adserver lar arasında farklı isim ve formatlarda parametre kullanımının gerçekleşme riskine karşın işlemin başlangıçta test edilmesi olası yayın kayıplarını ve rapor farklılıklarını münkün olduğunca minumuma indirecektir. Bu işlem sırasındaki en önemli nokta ise farklı AdServer’ların bu işlem sırasında gerçekleştirdikleri EnCode / DeCode işlemleri sayım işleminin gerçekleşmesi için son derece önemlidir.  

Örnek click sayım :
X : Üçüncü Parti AdServer Y : Yayıncı AdServer Z : Kampanya Hedef Sayfası (Landing Page) X -> Y -> Z

Bu örnekte Encode işlemi Y Adserver üzerinde, Decode işlemi ise X Adserver üzerinde gerçekleştirilmelidir.  

Kod örneği; Üçüncü Parti AdServer Kodu:
<script type=”text/javascript” src=”http://ad.thirdpartyadserver.com/get/reklam_alani/424242/?clickthru=”></script>  

Yayıncı AdServer’ın reklam alanında ekleyeceği kodun son hali:
<script type=”text/javascript” src=”http://ad.thirdpartyadserver.com/get/reklam_alani/424242/?clickthru=http%3A//srv.yayinciadserver.com/click.aspx%3Fp%3D1%26p%3D2%26url%3D”></script>  

Son olarak;
Third Party Click sayımlarında her zaman iki adserver arasında fark olabilir. Önemli olan bu farkların az ve kabul edilebilir olması. Bu tür sayımlarda 2 den fazla adserver olduğu durumlarda olabilir ki münkün olduğunca bunu kullanmayın derim click sayma işleminde araya ne kadar adserver girerse o kadar sıkıntı demektir :( . Şuan bile 2 den fazla adserver sayımı ile çok defa karşılaştık bunlarında elbette var çözümleri ama kolay değil ciddi ciddi uğraştırıyor. Bu yazıyı baz aldığınızda bu sorunu aşabileceğinizi düşünüyorum.

Düzenleme notu : Bu yazımda AdSpeed üzerinde yayınlanmış iki linki vermiştim. AdSpeed'den gelen linklerin kaldırılması talebi üzerine linkleri kaldırmış bulunmaktayım. Bilginize.

Bir sonraki yazıda görüşmek üzere.  

Cihan

Merhabalar

Merhabalar,
Kaç zamandır kendi web sitemi yayına alayım diyordum da bir türlü nasip olmuyordu.
Kısmet bugüneymiş :)

Şimdi kısa bir merhaba diyorum ama yakında;
  • AdServer
  • Proje Yönetimi
  • Yazılım Geliştirme Mimarileri
  • Veri Tabanı
  • İş Zekası
gibi konularda yazacağım yazılarda görüşmek üzere...