1 Kasım 2014 Cumartesi

KnockoutJs Nedir? nasıl kullanılır?

KnockoutJs, Stavev Sanderson tarafından geliştirilmeye başlanmış bir JavaScript kütüphanesidir. Bu kütüphane ile amaçlanan sayfa oluşturulurken hem veri hem de html kod aynı anda oluşturulurken hem verinin hem de html kodlarının aynı anda oluşturulması performansı etkilediği için alternatif olarak şöyle düşünmüşler biz önce html kodunu sayfaya basalım daha sonra arka tarafta json ve javascript ile veriyi gerekli yere bind edelim mantığı vardır. Peki bunu nasıl anlayabiliriz biraz bunu inceleyelim. Öncelikle basit bir User sınıfı oluşturup 4 alan ekleyip oldukça basit bir şekilde bunları listeleyelim.
Not : Daha sonra tekrar knockoutjs’yi projeye nasıl dahil edebileceğimizi anlatacağım.

Sayfa oluştuğu zaman sadece 1 adet örnek html içeriği yükleniyor daha sonra o örnek html içeriğine göre javascript tarafında jsondan veri alınıp html de gerekli yerine yazılmaktadır. Sayfa ilk oluşturulduğunda Sayfa Kaynağını Görüntüle basıp html çıktısına bakalım.

Üsteki resimde görüldüğü gibi sadece tek örnek div oluşturulup bırakılmış bu örnekte tek  div olduğu için performans gözlemi yapmak zor ancak daha geniş çaplı bir uygulamada belki üye bilgileri listelenirken binlerce div vb. taglar olacaktır sayfa yüklenirken tasarım mı yüklensin yoksa sayfaya veriler teker teker yazılması çok uzun süreçler alacaktır bunun yerine örnek div oluşturup daha sonra o div javascript tarafından client-side tarafında çoğaltılmaktadır.
Tarayıcımıza Öğeyi Denetle yaptığımız zaman verimizin sayfaya yazıldığını görüyoruz. KnockoutJs,  ViewModel ile HTMl arasında köprü vazifesini üslenmektedir.
Nispeten de olsa KnockoutJs nasıl çalıştığına göz attığımıza göre knockoutjsyi projeye nasıl dahil edebiliriz ve yazdığımız kodların ne işe yaradığına göz atalım.

Öncelikle NuGet packages de knockoutjs yi aratıp projeyemize Instal edelim. Instal ettiğimiz zaman projemizin scripts klasörünün altına 2 tane JS dosyası gelecektir. Bunlar : knockout-3.2.0.js ve knockout-3.2.0.debug.js ilki sıkıştırılmış hali ben onu kullanacağım ayrıca ben bu makaleyi yazarken güncel sürüm 3.2.0 sizde bu sürümü veya dilediğiniz sürümü kullanabilirsiniz…


Bununla birlikte birde jquery 2.1.1 sürümüne ihtiyacımız var buna da buradan ulaşabilirsiniz.
Knockout-3.2.0.js ve jquery-2.1.1.js bu iki JS’yi head tagları arasına koyuruz.
Controller tarafında user list döndüren bir actinonumuz var.

  public ActionResult Index()
        {
            List<User> users = new List<User>(){
               new User(){
                    UserId=1,
                    UserName="User1",
                    Password="1234567",
                    Email="User1@gmail.com"
               },   new User(){
                    UserId=2,
                    UserName="User2",
                    Password="1234567",
                    Email="User2@gmail.com"
               },   new User(){
                    UserId=3,
                    UserName="User3",
                    Password="1234567",
                    Email="User3@gmail.com"
               },   new User(){
                    UserId=4,
                    UserName="User4",
                    Password="1234567",
                    Email="User4@gmail.com"
               },   new User(){
                    UserId=5,
                    UserName="User5",
                    Password="1234567",
                    Email="User5@gmail.com"
               },
           };
            return View(users);
        }
Bizi aslın ilgilendiren View kısmındaki kodlar burada 2 js ekledikten sonra javascript yardımı ile .net tarafındaki User sınıfımızı jquery tarafın da karşılayacak olan nesnemizi tanımlıyoruz. Buradaki users:ko.observale() kısmındaki users bizim liste nasıl erişebileceğimizi belirliyor.
   var myViewModel = {
             users: ko.observable()
         };
Daha sonra model ile aldığımız veriyi json formatında javascript tarafına aktarmamız gerekmektedir bunun için 2 yöntem mevcut ilk yöntem @Html.Raw(Json.Encode(Model)) ile modeli json formatına çevirebiliriz öncelikle bu yöntemi inceleyelim.

myViewModel.users(@Html.Raw(Json.Encode(Model)));

Ancak bu yöntem ile verileri jquery tarafına aktardığımız zaman 2 sorun çıkıyor.
İlk sorun biz verileri View’in model’inden aldığımız için ve bu modelede .js sınıfından erişemeyeceğimize göre mecbur jquery kodlarını view’in içinde yani html kodlarının arasında yazmak durumunda kalıyoruz buda kodun karışık olmasını gösteriyor.

İkinci sorun ise yandaki resimde gördüğünüz üzere Json.Encode(model) yaptığımız zaman veriyi json formatında sayfaya yazıyor bizim amacımız zaten sayfa yüklenirken değil yüklendikten sonra veriyi listelemek hatta daha da kötüsü bütün Id’leri kullanıcı görebiliyor.

Buna çözüm olarak şunu önerebilirim size bir .js kütüphanesi oluşturup bunun içinden ayrı bir actiondan veriyi JsonResult ile tekrar post ederek hem veriyi kullanıcıya göstermemiş oluruz hemde html kodları ile jquery kodlarını ayırmış oluruz.
Action kodları

        public ActionResult Index()//sayfamızının açılacağı action
        {
            return View();
        }
[HttpPost]//Actionumuzun başına HttpPost koymayı unutmuyoruz yoksa veriler sayfanın urlsinden de erişilebilir durumda olur
        public JsonResult UserData()//Veriyi çağıracağımız action
        {
            List<User> users = new List<User>(){
               new User(){
                    UserId=1,
                    UserName="User1",
                    Password="1234567",
                    Email="User1@gmail.com"
               },   new User(){
                    UserId=2,
                    UserName="User2",
                    Password="1234567",
                    Email="User2@gmail.com"
               },   new User(){
                    UserId=3,
                    UserName="User3",
                    Password="1234567",
                    Email="User3@gmail.com"
               },   new User(){
                    UserId=4,
                    UserName="User4",
                    Password="1234567",
                    Email="User4@gmail.com"
               },   new User(){
                    UserId=5,
                    UserName="User5",
                    Password="1234567",
                    Email="User5@gmail.com"
               },
           };
            return Json(users);
        }
View kodlarımız
Burada bir şeye dikkat çekmek istiyorum viewin içinde herhangi bir model tanımlaması yapmadık. Sadece jquery kütüphanemizi referans ettik.
@{
    Layout = null;
}<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Knockout Örnek</title>
    <script src="https://code.jquery.com/jquery-2.1.1.js"></script>
    <script src="~/Scripts/knockout-3.2.0.js"></script>
    <script src="~/Scripts/knockoutData.js"></script>
</head>
<body>
    <div data-bind="foreach:users">
        <div data-bind="text:UserName"></div>
    </div>
</body>
</html>

Jquery kütüphanesi kodları
$(function () {
    var myViewModel = {
        users: ko.observable()
    };
    $.post("/KnockoutJs/UserData", function (data) {
        myViewModel.users(data);
        ko.applyBindings(myViewModel);
    });
});
Sonuç
Bu makalede knockoutun nasıl çalıştığını projeye nasıl dahil edebileceğimizi kısaca görmüş olduk bununla beraber veriyi nasıl bind edebileceğimize bakmış olduk. Tabi knockout birçok özellik sunmakta bunları da ilerleyen zamanlarda detaylı inceleme fırsatımız olacak bir sonraki makalede görüşmek üzere.

25 Ekim 2014 Cumartesi

FacebokClient sınıfı

Sosyal medya alemini kasıp kavurmaya devam eden Facebook sadece kullanıcıları değil biz geliştiricileri de düşünerek bir çok SDK’yı bizlere sunuyor bu gün sizlere FacebookClient sınıfının metotlarından bahsedeceğim öncelikle projemize Facebook SDK’yı projeye dahil edelim.

Ben bu yazıyı yazdığımda version 6.8.0 sürümü aktif sizde dilerseniz bu sürümü veya üst sürümlerini kullanabilirsiniz.

Solution Explorer kısmından References sağ tıklayıp Manager NuGet Packages tıplayıp search kısmına Facebook sdk yazıyoruz ve Install diyoruz.
Facebook sdk’yı projeye dahil ettikten sonra yeni bir sınıf oluşturup bir önceki makalede almış olduğumuz App ID ve App Secret keylerini bu sınıfta kullanacağız.
Dört tane private değişkenimiz olucak bunlar
AppId  ve SecretId
CallBackUrl= developers.facebook.com da  uygulamanıza girip Settings > Advanced sayfasında Deauthorize Callback URL kısmına yazmış olduğunuz Url bu değişkene yazıcaz böylece biz kendi web projemizden gönderdiğimiz link facebook a gidip app id ve secret kontrol edip tekrar vermiş olduğumuz url’ye yönlendirilcek…
Ve son değişkenimiz…
Scope= Kullanıcının hangi bilgilerine ihtiyaç duyduğumuzu bu değişkende belirticez kullanıcı da size bu bilgileri almanız için izin vericek. Biz bu örnekte sadece user_about_me  ve email  Access tokenslerini kullanıcaz. Bu sayfadan diğer tokensleri görebilirsiniz.
Buradan sonrasını kodların üst kısımlarında açıklama şeklinde devam edicez...
  //facebooktan gelen kullanıcı bilgilerini yükleyeceğimiz nesnemiz…
    public class FacebookProfile
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Mail { get; set; }
    }
  public class FacebookService
    {
        // facebook app id
        private string AppId = "783828931674793";
        //facebook app secret id
        private string AppSecret = "45d1e79ef55576f3601a651fe9ddfc64";

        // Facebook login için kullanıcıyı facebook'a yönlendirirsiniz. Daha sonra kullanıcı gerekli
        // izinleri verdikten sonra facebook o kullanıcıyı size yönlendirir. CallBackUrl ile
        //siz facebook'a kullanıcıyı şu adresime yönlendir diyorsunuz.
        private string CallbackUrl = "http://localhost:57871/Home/FacebookSayfa";

        // Kullanıcının hangi bilgilerine ihtiyaç duyduğunuzu scope ile belirtirsiniz ve
        // kullanıcı da size bu bilgileri alabilmeniz için izin verir.
        private string Scope = "user_about_me,email";

        // Sdk'in sağladığı sınıftır.
        FacebookClient fb = new FacebookClient();

        // Bu metod ile kullanıcıyı yönlendireceğiniz facebook url'i oluşur
        public Uri CrateLoginUrl()
        {
            return fb.GetLoginUrl(
                                new
                                {
                                    client_id = AppId,
                                    client_secret = AppSecret,
                                    redirect_uri = CallbackUrl,
                                    response_type = "code",
                                    scope = Scope,

                                });
        }

        // AccessToken facebook'un size verdiği erişim kodudur. OAuth konusuna bakarsanız ne olduğunu daha iyi anlayabilirsiniz.
        public dynamic GetAccessToken(string code, string state, string type)
        {
            dynamic result = fb.Post("oauth/access_token",
                                  new
                                  {
                                      client_id = AppId,
                                      client_secret = AppSecret,
                                      redirect_uri = CallbackUrl,
                                      code = code
                                  });
            return result.access_token;
        }

        // Kullanıcı bilgileirni çektiğimiz metod
        public FacebookProfile GetUserInfo(dynamic accessToken)
        {

            var client = new FacebookClient(accessToken);
            var profile = new FacebookProfile();

            // "/me" yerine kullanıcının facebook id'sini de yazabilirsiniz. Ama zaten "me", o an uygulamayı kullanan kullanıcının kendisi oluyor.
            dynamic me = client.Get("/me");

            //Facebooktan gelen bilgileri oluşturduğumuz nesnemize yüklüyoruz  ve return ediyoruz
            profile.Name = me.first_name;
            profile.LastName = me.last_name;
            profile.Id = me.id;
            profile.Mail = me.email;
            return profile;
        }
    }
Sınıfımızı oluşturduktan sonra Mvc projemizde 2 action oluşturup bu metotları çağıralım.
Controller actionlarımız ilk olarak FacebookLogin actionu çağırıcağız o action facebook’a gidip ordan FacebookSayfa Actionuna düşecek ordanda View sayfamızda bilgileri yazdıracağız.

  
public ActionResult FacebookSayfa(string code, string state, string type)
        {
            //Facebook Service sınıfımızı tanımlıyoruz
            FacebookService fb = new FacebookService();

            //facebooktan return olduktan sonra bize 3 adet değer geliyor code,state ve type bunları GetAccessToken metotduna gönderiyoruz buda bize geriye AccessToken kodunu döndürüyor
            string token = fb.GetAccessToken(code, state, type);

            //tokeni tekrar GetUserInfo metotduna gönderiyoruz ve buda bize kullanıcı bilgilerinin bulunduğu FacebookProfile nesnemizi geri döndürüyor
            FacebookProfile profile = fb.GetUserInfo(token);
            return View(profile);
        }
        public ActionResult FacebookLogin()
        {
            //Facebook Service sınıfımızı tanımlıyoruz
            FacebookService fb = new FacebookService();
            //facebook url'yi oluşturup o url'ye yönlendiriyoruz
            string url = fb.CrateLoginUrl().ToString();
            return Redirect(url);
        }
Projeyi çalıştırıp http://localhost:57871/Home/FacebookLogin dediğim zaman facebook sayfasına yönlendirip benden BlogTest şu bilgilere erişebilecek izin veriyormusunuz diye panel açıldı buna tamam diyorum ve tekrar kendi localhostuma bu sefer FacebookSayfa actionuna yönlendiriliyor ve kullanıcı bilgilerini çekiyoruz.

Tekrar locallimize yönlendirdikten sonra modelden aldığımız bilgileri sayfaya yazıyoruz. Eyer daha farklı bilgilere ulaşmak istiyorsanız score kısmına eklemeniz ve FacebookProfile  nesnemize propertiesi yeterli olacaktır.

Bu bilgilerle ister facebook id ye göre sitenize üye yapabilirsiniz veya yorum kısmına direk bu isim ad soyad da yorum yapıldı yada score kısmını değiştirip kullanıcının resimlerini durumlarını vb. bilgilerini sitenizde kullanabilirsiniz.