PHP’de gelen isteğin Ajax çağrısı olup olmadığını tespit etmek

Her yerde ajax kullanımından geçilmez oldu. Ajax, hem kolaylıklarından hem de RIA’in (Rich Internet Applications) temeli olduğundan popülerliği gitgide artıyor. Karşımıza her yerde çıkıyor ve artık jquery gibi frameworkler sayesinde ajax çağrıları yapmak için tek satırda 5-10 karakterlik bir javascript kodu bile yeterli oluyor.

Bir php kodunda genelde çıktı verirken normal html etiketleri kullanıp tüm sayfayı tasarlıyoruz fakat genelde bu sayfalar bir verit yapısının görüntüleri (view) oluyor ve aynı çıktıyı javascript ile alıp basmak, hatta bazen ajax ile dışarıya bile vermek gerekebiliyor.

Artık az sonra bahsedeceğim method ile, dosyaları tasarlarken 2 türlü kullanımı için tasarlayacaksınız. Yani hem normal erişim ile hem de o sayfayı ajax ile kullanabilecek şekilde düşüneceksiniz. Burada ajax çağrısı olduğunu yakalamak için genel bir teknik olarak get methodu ile bir değişken gönderip onu izleyebilirsiniz. Mesela kayit.php?ajax=1

Bu, işin ilkel noktası. Ajax çağrısı olup olmadığını yakalamak için artık sunucu ortam değişkenleri arasında $_SERVER[“HTTP_X_REQUESTED_WITH”] değişkeni ile çağrı türünde değer xmlhttprequest ise yapan client’in kullandığı protokolu alabiliyorsunuz. Genellikle içindeki değer “xmlhttprequest” oluyor zaten. Yani bir çağrının ajax olup olmadığını bu şekilde kolayca kontrol edebilirsiniz.

Ufak şekilde örneklemek gerekirse:

Bu kodda isimleri liste çıktısı alırsınız. Eğer javascript ile bu veriye erişmek istersek ajax çağrısı ile bu sayfayı çağırabiliriz ama işlenmiş html kodundan o isimleri almak zor olur. Ya da sadece belirli bir kısmını almak isteyebiliriz. Bunun için basitçe:

Bu kod eğer normal istek yapılırsa

çıktısı; ajax ile istek yapıldığı zaman:

çıktısı verecektir.

Bu şekilde gelen çağrılardan ajax olanlarına sadece kisiler dizisini jsona çevirip sayfayı durduruyoruz. Javascript ile gelen json’u kolayca işleyebilirsiniz.

Burada json’a çevirip javascriptde işlemek zorunda değilsiniz. Ajax ile aldıktan sonra içeriği basmak istediğiniz yere uygun html kodu da üretebilirsiniz bu noktada.

RSS’lerden Lifestream

Lifestream da nesi?

Kelime açılımından anlyabileceğiniz birşey ama bilmeyenler için özetliyim. Şu an sağda solda bir sürü web servisinde, hayatınıza dair bilgisayarda yaptığınız herşeyi paylaştığınız servisler var ve bunları kullanıyorsunuzdur illaki. Örneğin :

  • last.fm ile müziğinizi,
  • delicious ile linklerinizi,
  • tumblr, wordpress vs ile yazılarınızı,
  • flickr ile fotograflarınızı

Bu servislerin neredeyse hepsi RSS ile içeriklerinizi paylaşıyorlar. Bu dökümanda bunun gibi çeşitli servislere ait içerikleri RSS aracılığı ile süzgeçleyip kronolojik bir sıraya sokup sosyal geçmişinizi listelemeye yönelik bir uygulama yazacağım. Nasıl birşey olduğunu merak ediyorsanız http://mfyz.org adresinden benim sosyal servislerdeki akışımı görüntüleyebilirsiniz.

Tamamiyle dinamik

Bu işin güzel yanı, hazırladığınız sayfa tamamen organik bir yapıda sürekli sizin farkında olmadan kaydettiğiniz sosyal verilerinizi derleyecektir. Mesela müzik dinlerken beğendiğim bir şarkı veya bookmarklarıma eklediğim bir link bu servislere herhangi bir çabama gerek kalmadan ekleniyor. Bu eklenen içerikler yine hiçbir müdahale olmadan benim lifestream sayfamda görüntüleniyor.

Simple pie

Bunu yapmak için bu sosyal medya servislerindeki rss kaynaklarınızı işleyerek yapacağız. Bunun için php’de simple pie kütüphanesini kullanacağız ve bu kütüphanenin kullanımı ve rss okumak için yardımcı fonksiyon açılımı için önce Simplepie ile rss işlemek (okumak) dökümanını inceleyin.

Simple pie ile rss okuma konusunda bilgi sahibi olduğunuzu varsayarak dökümana devam ediyorum (eğer yoksa öncelikle verdiğim dökümanı uygulayın).

Hazırlık ve Başlangıç

Öncelikle içerik kaynaklarınızı (rss) bir dosyada çıkartın. Bu kaynakları bir dizi şeklinde tanımları tutacağımız dosyaya yazalım. Bunun için config.php diye bir dosyada $feeds adında bir dizi içerisinde kaynak url’i ve adı olarak saklayacağım. Örnek kaynak dizisi şöyle olacaktır :

Bu şekilde istediğiniz kadar rss kaynağı tanımlayabilirsiniz. Az sonra simplepie kullanarak bu kaynakları okuyacak, kronolojik sıralayıp çıktısı sayfalar halinde oluşturacağız.

Şimdi index.php dosyasında kaynakları okumaya başlayalım.

Yukarıda config ve mypie dosyalarını include ettik. Config’de rss kaynakları tanımları var, mypie’de ise simplepie kullanarak rss kaynağı okuyan fonksiyonumuz var. Bu fonksiyon hakkında daha detaylı bilgi almak için Simplepie ile rss işlemek (okumak) dökümanını inceleyin.

$feeds dizisini dönerek feed bilgilerini ve anahtar kelimesini alıyoruz. Döngü içinde ise feed url’deki kaynağı okuyoruz. Eğer hata olursa o feed ingore edilip bir sonrakine geçiliyor. Eğer okundu ise $allItems adlı bir diziye okunan veri ekleniyor. Tabi haber eklenirken tür olarak da o feed’in anahtar kelimesi ekleniyor. Bu sayede ekrana basarken, farklı haber kaynakları için farklı çıktı verebileceğiz.

Şimdi elimizde tüm kaynaklardaki tüm haberler $allItems adlı dizide tutulmakta. Bu dizideki veri yapısın daha iyi anlamanız için dizideki ilk elemanı verelim :

Gördüğünüz gibi tarih, başlık, url, kaynağı ve içerik olarak basit anahtarlarla ihtiyacımız olan tüm bilgiler mevcut. Şimdi bu diziyi tarihsel sıraya sokalım. Bunun için multi-dimmension dizilerde kolona göre sıralama yapan yardımcı bir fonksiyon kullanacağız.

Bu fonksiyonu çağıdrıktan sonra $allItems dizisindeki haberler artık kronolojik sıraya girmiş oldu. Tam istediğimiz kıvama geldi fakat elimizdeki dizide yüzlerce haber olabilir isterseniz bu diziyi belirli bir tarihe kadar kırpabilirsiniz. Mesela son 2 haftaki haberleri listelemek isterseniz $allItems’i dönerek date alanını timestamp’a çevirip 2 haftadan eski haberleri tespit edebilirsiniz. Doğal olarak onları temizleme şansınız da olur.

Ben herhangi bir kırpma işlemi yapmadan tüm haberleri sayfalayarak göstereceğim.

config.php dosyasında $limit adında bir değişkende her sayfada kaç girdi gösterileceğini belirleyin. Bunu bu sayfa içinde de yapabilirsiniz ama config.php’de tüm tanımların durması daha mantıklı olacaktır. Yukarıda bilinen sayfalama algoritması kullanarak sayfa sayısı ve şu anki sayfa hesabı yapılıyor. array_slice ile de o sayfada gösterilecek haberler $pagedItems dizisine parçalanıyor. Artık sayfada:

  • $page
  • $pageCount
  • $pagedItems

değişkenlerini kullanarak sayfalamayı ve haber içeriklerini basabiliriz. Gerekli basit html yapısını da kullanarak haberleri ekrana basacak html kodu da şöyle olacak (yani index.php dosyasının devamı)

Bu dökümanda anlatılan kod, proje olarak http://projects.mfyz.com/lifestream/ adresinde Lifestream olarak bulunabilir. Buradaki kodun çıktısını merak ediyorsanız : http://projects.mfyz.com/lifestream/demo/ adresinde biraz şekillendirilmiş şekilde bulabilirsiniz.

Bu kodu biraz daha özelleştirerek http://mfyz.org‘daki gibi bir lifestream elde edebilirsiniz.

Simplepie ile rss işlemek (okumak)

Nerede kullanacağız?

Rss şu anda nerdeyse veri kaynağı oluşturma/kullanma konusunda standartlaşmaya başladı. Artık her sitede, başka sitelerden alınana içerikleri görebiliyorsunuz. Bunun en büyük nedeni, her sitenin (aslında hazır bloglardaki rss kaynakları sayesinde) bir rss kaynağı var ve verilen bilgileri bu kanallarla belirli standartlarda internette yayıyoruz. Bu kaynakları alıp/derleyip çeşitli alanlarda kullanabilirsiniz. Bu konuda hayal gücünüze ne geliyorsa uygulamak mümkün.

Bu dökümanda kısaca bir rss kaynağını php ile yazılmış simple pie kütüphanesi ile basitçe nasıl diziye çevirebileceğimizi, geçici olarak belleğe alabileceğinizi (cache) göstereceğim.

Bu konu ile ilgili Türkçe kaynak var aslında, bu yazıyı yazarak aynı şeylerden bahsetmek pek içimden gelmiyor fakat mfyz.com’daki diğer dökümanlarda sık sık rss işleme ile ilgili konulardan bahsedeceğim için bu dökümanı iç bir kaynak olarak özet de olsa yazmak zorundayım. Olabildiğince farklı bir açıdan ele almaya çalışacağım.

Simple Pie Nedir?

Php ile yazılmış bir xml parser sınıfıdır. Spesifik olarak da RSS tipi xml dosyalarını okumak için tasarlanmış, cache gibi güzellikleri bulunan bir sınıftır. Bu sınıfı kullanarak bir rss dosyasını nasıl parse edeceğimizi basitçe göstereceğim.

Öncelikle sitesinden simplepie kütüphanesini indirin.
http://simplepie.org/ adresinden download bölümünde son sürüme ait indirme bağlantısı bulabilirsiniz.

İndirdiğiniz paket içerisinde demo bir uygulama, dökümantasyon ve api test dosyaları bulacaksınız. Bizim burada kullanacağımız aslında tek dosya simplepie.inc dosyasıdır.
Bu dosyanın uzantısını .php olarak kullanmanızı tavsiye ederim (simplepie.inc.php).

Simplepie otomatik olarak okuduğu feedleri 1 saatlik belleklemektedir. Bunu kaldırabilirsiniz fakat 1 saatlik belleğe almak oldukça iyi bir performans kazandıracaktır. Bu noktada uygulama dizininizde “cache” adında bir dizin oluşturup yazma haklarını ayarlamanız gerekmektedir (755 veya 777).

Basitçe kullanımı

Bir örnek uygulama ile anlatacağım. İnidirdiğiniz simplepie paketi içindeki simplepie.inc dosyasını uygulamanızın içine koyun. index.php içerisinde include ederek kullanacağız. Cache dizinini de oluşturup izinlerini ayarlayın.

Örnek olarak bir uygulama yapsak da ben burada yardımcı bir fonksiyon kullanacağım. Bu fonksiyon ile basitçe url’sini verdiğimiz feed’i geniş bir dizi olarak döndürecek.

Koddan simplepie kullanımını özetleyeceğim.

readRSS fonksiyonunun parametreleri:
– url
– expire

Bu parametreleri dizi olarak vermelisiniz. Ya da doğrudan tek parametre ile string verirseniz sadece url parametresi ayarlanacaktır.

expire, bellekte ne kadar sürede çürüyeceğini ifade eder. Oraya 300 saniye olarak belirtirseniz kullanıcılar sürekli sayfanızı derlese bile 5 dakikada (300sn) bir rss kaynağı okunacaktır. Bu süreyi belirtmezseniz 1 saat olarak ayarlanacaktır.

Neyse, şimdi sırayla simplepie kullanarak bir rss feed’i nasıl parse ettiğimi anlatayım :

ile yeni bir nesne oluşturup feed adresini ayarlıyoruz.

ile de rss kaynağını alıp okuma işlemini yapıyoruz.

ile de method adından anlayacağınız gibi bellek süresini belirtebiliyoruz. Belirtmezsek 1 saat olarak ayarlanacaktır.
Bu sayede bu rss kaynağı sürekli okunmak yerine internetten saate 1 kere alınıp işlenip belleklenecektir.

Ben her fonksiyonda genel olarak sonuç dizisi oluşturur ve onu dönerim. Burada bir feed için :
– feed’e ait meta data
– feed içindeki konulara ait bir multiarray
söz konusudur.

Bunun için sonuç dizimi “feed” ve “items” olarak 2 alt diziye ayırıyorum ve “feed” dizisine o rss kaynağı için xml içinde belirtilen feed adı, adresi, açıklamasını kaydediyorum. Bunu da sırayla :

methodları ile alabiliyoruz. Bu konuda daha derin açıklama yazmaya gerek yok.

feed içindeki konuları da $feed->get_items() methodu ile aslında dizi olarak alabiliyoruz.
Ben de bu diziyi foreach ile dönerek içindeki nesnelerin alt methodlarını kullanarak her konu için gerekli bilgileri alıp sonuç dizisine “items” alt dizisi içine ekliyorum.
Bu foreach içinde bazı methodlarla sıradaki konuya ait bilgileri alıyorum. Bu methodlar :

Bu methodlarla konu içeriklerini alıp sonuç dizisine yazıyorum.

Fonksiyon sonunda da sonuç dizisini dönüyorum.

Bu fonksiyonun kullanımı için bir örnek vermek gerekirse :

Çıktısı şöyle olacaktır :

Bu noktadan sonra bu diziyi ekrana basma konusunda gerisi sizin hayal gücünüze kalmış.
Bununla ilgili örnek uygulama için benim sosyal medya akışımı (lifestream) inceleyebilirsiniz : http://mfyz.org

İşin görsel kısmını da başka bir dökümanda özetleyeceğim.

RSS desteği

RSS desteği ekledim. Sitenni alt kısmında hiçbir işe yaramadan, çalışmayan link olarak duran RSS ikonu artık işe yarıyor 🙂 Şimdilik 3 kaynak sunabildim :
– Günlük girdileri
– Dökümanlar ve
– Son yazılanlar
İleride rss ile takip edilebilecek yerler oluştukça bu desteği eklerim.

http://www.mfyz.com/rss/ adresinden kaynakların listesine ulaşabilirsiniz. Nasıl ekleyeceğinizi sormuyorum 🙂

RSS’in ne olduğunu bilmiyor ve RSS hakkında bilgi edinmek istiyorsanız RSS nedir, ne işe yarar, ne yapmalıyız? dökümanını okuyabilirsiniz.

Forum konuları, döküman yorumlarını rss olarak dağıtmak şu an mantıklı gelmiyor. Bu özelliği kullanan var mı diğer sitelerde? Yani rss okuyucusu ile forum konusu veya yorum takip eden?

Sitemize RSS export mekanizması kuralım

Sitemize neden RSS hizmeti koymalıyız, Ne işimize yarar?

RSS günümüz teknolojileri arasında en yaygın takip standardı haline geldi. Şu an insanlar RSS okuyucu programları veya web uygulamalarına takip ettikleri siteler/forumlar/haber kaynaklarına ilişkin kayıtları tek standart’da okumak için ekliyor ve her gün binlerce insan bu sistem sayesinde birçok siteye girmeden tek merkezden çoğu haberi takip edip çoğu gelişmeden haberdar olabiliyor.

kodunu basıyoruz sayfanın çıktı basılmamış bir kısmına.

Şimdi size 2 kayıtlık bir XML çıktısı örneği verip açıklayayım:

Bu gördüğünüz kod RSS işlem sayfanız tarafından çıktısı yapılmış TÜM RSS örneğini ifade ediyor.

kod bloğu ise sizin for veya while gibi bir döngü mekanizması ile kayıtlarınızı dönüp çıktısını alacağınız kısımdır. Bunun dışında kalan kısımlar (öncesindeki kısım ve sonrasindaki kısım) sizin statik basacağınız bölümdür.

Burada dikkat edilmesi gereken nokta pubDate olarak çıktı vereceğiniz tarih yukarıda gödrüğünüz formatta olmak zorundadır.

Bu tarih formatını “Y-m-d H:i:s” formatındaki genel kullanımdan bu formata;

ile oluşturabilirsiniz.

2.önemli konu ise kod olarak basacağınız diğer string’ler yani title ve description etiketlerinin içerisine ekleri ile basmanızdır. Tahmin edeceğiniz gibi link etiketinde ise bu gönderinize ait url/link olacak. RSS çıktısı basan işlemler bundan ibaret.

Ben dinamik gönderileri basarken tüm kayıtlarımı RSS’e yazdırmıyorum. RSS okuyucular genelde yeni eklenen kayıtları saptayıp onları kullanıcıya gösterir. Bu yüzden sitenizde RSS export edeceğiniz kayıt kümesinin güncellenme yoğunluğuna bağlı olarak maksimum 50-100 kayıt bastırın. Çünkü eğer büyük boyutta bir RSS çıktınız olursa, hem kullanıcılar tarafından bunun güncellenmesi zor/uzun olacaktır. Hemde gereksiz kayıtları her seferinde boşuna transfer ettirmiş olursunuz.

XML (Extensible Markup Language)

XML Nedir?

XML (Extensible Markup Language) verinin platform ve donanım bağımsız olarak taşıma ve saklama işini yapan bir işaretleme dilidir. Platform ve donanımdan bağımsızdan kastımızı biraz açmamız gerekirse şunları söyleyebiliriz.

  • İki ayrı platform üzerinde geliştirilmiş yazılımların konuşması için en etkili yoldur. Mesela .NET platformu ile J2EE platformunda geliştirilmiş iki yazılımın ortak veri kullanıp bir birlerine bilgi akışını XML ile yapmak mümkündür.
  • İki ayrı donamın içinde de mümkün olmaktadır. İki ayrı telefon hattının telefon tuşları ile bilgi topladığını düşünelim. Toplayan bu bilgilerin uygulamaya iletilmesinin en etkili yolu yine XML kullanmak olacaktır. Çağrı merkezlerindeki tuşlar ile girilen bilgilerin sorgulanıp cevap dönmesi işlemlerinin hepsinde akış XML formatındaki veri ile gerçekleştirilmektedir.
  • Aynı şekilde çok büyük bir firmanın topladığı bilgiler olduğunu düşünelim. ve bu bilgilerini veritabanlarında tutuyor olsunlar. Başka firmaların bu bilgiyi kullanma taleplerine en iyi cevap bilgiyi bir web servisi ile XML olarak sunmak olacaktır. Çünkü veritabanına doğrudan erişim yapmalarını istemeyeceklerdir.

Bu konuda bir çok örnek verilebilir fakat bu kadarının konuyu anlamaya yardımcı olacağını düşünüyorum.

XML ile HTML Arasında Ne Fark Vardır?

Başta da söylediğim gibi XML verinin taşıma ve saklama işini yapar. Fakat HTML verinin görünümü ile ilgili düzenlemeleri yapmamıza olanak sağlayacaktır. Mesela bir yazının italik mi, kalın mı, font değeri gibi bilgileri HTML’i kullanarak ayarlayabiliriz fakat verini türünün ne olduğu bilgisini HTML ile belirleyemeyiz. XML ise kullanıcının kendi oluşturduğu etiketlerle verinin biçimi koruyarak onu istediği sisteme ve uygulamaya kolayca taşıyabilmektedir. Aralarındaki en önemli fark HTML’de belirli olarak etiketlerin olması fakat XML’de etiketleri kullanıcının belirliyor olmasıdır. Okumaya devam et “XML (Extensible Markup Language)”

RSS nedir, ne işe yarar, ne yapmalıyız?

RSS (Really Simple Syndication) Nedir?

RSS aslında bir veri paylaşma standardı, ben haber kağıdı diye adlandırıyorum. XML ile yazılmış ve w3c (http://www.w3.org/) tarafından belirlenmiş bir standart’da olmak zorunda olup mantık olarak dekont gibidir. Yani içerisinde bazı standart alanlar ve değerleri vardır. RSS de bunun gibi, haberleri “başlık”, “eklenme tarihi”, “haber” vs gibi bilgileri haber bazında standartlaştırarak çeşitli alanlarda rahat kullanılmasını sağlayan bir veri yayın türüdür.

RSS’in faydaları nelerdir?

RSS’leri çoğu sitede görür olduk artık. Bu neyi ifade eder; o sitedeki gelişmeleri RSS yayını ile RSS okuyucu bir programdan veya RSS okuma destekli internet araçlarından rahatça takip edebilmeyi sağlar. Şu an bir günde onlarca sitede onlarca yeni haber/gelişme çıkıyor ve yayınlanıyor. Bunların rahat takibi için RSS kullanırız. RSS okuyucu programımıza birkaç siteden RSS kaynağı belirterek tüm o sitelerdeki gelişmeleri anında TEK YAPIDA özelleştirebileceğimiz yapıda kolayca görebiliriz. Hatta artık çoğu eposta okuyucu rss destekli geliyor, tarayıcılar rss okuyabiliyor. Hatta birçok cep telefonunda bile rss desteği konmaya başlandı.

RSS Hangi alanlarda kullanılır?

Haber ve haber kaynaklı çoğu alanda kullanılabilir. Yenilikleri duyurmak adına çoğu alanda kullanıldığı gibi blog’lar da RSS destekleri ile günlüklerdeki yeni entry’leri RSS ile kolayca takip edebilirsiniz. Okumaya devam et “RSS nedir, ne işe yarar, ne yapmalıyız?”