Mehmet Fatih YILDIZ (mfyz.com)

Menü



RSS'lerden Lifestream

Kategori : PHP ve Pear Dökümanları
Eklenme Tarihi :
6 Eylül Pazar ´09
rss, lifestream, parse, xml




Dikkat : Dökümanın yazılma tarihi üzerinden en az 60 gün (2 ay) geçmiş. İçerisindeki bilgiler güncelliğini yitirmiş olabilir, uygulamada ufak sorunlar oluşabilir. Yorumları ve güncellemeleri göz önünde bulundurarak dökümanı takip ediniz.


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 :
$feeds = array(
        'zamazing' => array(
                'name'    => 'Zamazing.org',
                'url'     => 'http://www.zamazing.org/rss.xml'
        ),
        'sabah' => array(
                'name'    => 'Sabah Teknoloji Haberleri',
                'url'     => 'http://www.sabah.com.tr/rss/teknoloji.xml'
        )
);


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.

  1. require_once('config.php');
  2.  
  3. // libs
  4. require_once('lib/mypie.php');
  5.  
  6. // getting feed contents
  7. foreach ($feeds as $feedKey => $feed){
  8.         // getting contents
  9.         $results = @readRSS($feed[url]);
  10.         foreach ($results[items] as $item){
  11.                 // adding item array to feed type
  12.                 $itemArray = $item;
  13.                 $itemArray[type] = $feedKey;
  14.  
  15.                 // adding all items
  16.                 $allItems[] = $itemArray;
  17.         }
  18. }

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 :

Array
(
    [title] => Mario geldi
    [date] => 2009-09-04 17:07:51
    [url] => http://mfyz.tumblr.com/post/179630132
    [description] => Mario geldi (HTML Content)
    [type] => tumblr
)


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.

  1. // sorting all entries
  2. $allItems = @arrayMultiSort($allItems, 'date');

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.
  1. // pagination
  2. $itemCount = count($allItems);
  3. if( $itemCount > $limit ){
  4.  
  5.         // calculating page count
  6.         $pageCount = ceil( $itemCount / $limit );
  7.  
  8.         // current page control
  9.         $page = intVal($_GET[page]);
  10.         if( $page < 1 or $page > $pageCount ) $page = 1;
  11.  
  12.         // paged item array
  13.         $pagedItems = array_slice($allItems, ($page-1) * $limit, $limit);
  14.  
  15. }else{
  16.         $page       = 1;
  17.         $pageCount  = 1;
  18.         $pagedItems = $allItems;
  19. }

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ı)

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  6.         <title>Teknolojik Organizma</title>
  7.         <link rel="stylesheet" type="text/css" media="screen" href="style.css" />
  8. </head>
  9. <body>
  10.         <div class="container">
  11.                 <h1 class="head"><a href="./"><b>Teknolojik Organizma</b></a></h1>
  12.                 Kendi Kendine Yaşayan, Büyüyen Derlemasyon Blog-umsu
  13.                 <br><br>
  14.                 <div id="stream">
  15.                         <?php
  16.  
  17.                         foreach ($pagedItems as $item){
  18.                                 // item's feed-service info
  19.                                 $feedinfo = $feeds[ $item[type] ];
  20.  
  21.                                 // content
  22.                                 $content = $item[description];
  23.  
  24.                                 // adding to content
  25.                                 print '
  26.                                 <div class="item '. $display .' '. $item[type] .'">
  27.                                         <h3 class="title"><a class="permalink" href="'. $item[url] .'" target="_blank">'. $item[title] .'</a> '. ($item[date] ? '<span class="time">('. substr($item[date], 0, 16) .')</span>':'') .'</h3>
  28.                                         '. ($content ? '<div class="content-text">'. $content .'</div>':'') .'
  29.                                 </div>
  30.                                 ';
  31.                         }
  32.  
  33.                         ?>
  34.                 </div>
  35.                 <div class="clear"></div>
  36.                 <div class="pagination">
  37.                         <br clear="all">
  38.                         <?php
  39.  
  40.                         if( $pageCount > 1 ){
  41.                                 print 'Sayfa : ';
  42.                                 for ($i=1; $i <= $pageCount; $i++){
  43.                                         print '<a href="?page='.$i.'"'. ($i==$page ? ' class="current"':'') .'>'.$i.'</a> ';
  44.                                 }
  45.                         }
  46.  
  47.                         ?>
  48.                 </div>
  49.         </div>
  50. </body>
  51. </html>


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

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


Hazırlayan : Mehmet Fatih YILDIZ


Yorumlar (4 yorum/ping var)



Üye Resmi Üye : tayfunca
28 Kasım Cumartesi ´09 18:53 tarihinde yazmış
peki rss'den eklenen konular için arama yapabilmemiz için hangi kodu kullanmamız gerekir.

Örneğin; Sabah'ın sitesinden rss çekiyorum ve fazla içerik var , diyelimki ben sadece içinde oyun olanları listelemek istiyorum, bunu nasıl yapabilirim?
 


Üye Resmi Ziyaretçi : program indir
28 Kasım Cumartesi ´09 19:37 tarihinde yazmış
Merhaba, lifestream indirdim ve inceledim. Tam aradığım şey. Fakat ufak bir sorun yaşıyorum. Haber başlıklarına karakter sınırlaması koymak istiyorum. Başlıkların uzunluğu fazla örneğin başlığın 30 karakterlik kısmını yazmasını istiyorum. Bu konuda yazrdımcı olabilir misiniz ? İyi çalışmalar...
 


Üye Resmi Üye : DragonFever
16 Aralık Çarşamba ´09 06:40 tarihinde yazmış
'. $item[title] .'
@program indir
Yukarıdaki kısmı aşağıdaki ile değiştirin:
'. substr($item[title], 0, 30) .'
 


Üye Resmi Ziyaretçi : Fred
22 Mart Pazartesi ´10 07:06 tarihinde yazmış
Kategorilere göre nasıl gösterebiliriz acaba?
 


Yeni Yorum

Önce Okuyun Yorumlarınızda sosyal, dini ve politik taraflı mesajlar, başkalarına saldırı sayılabilecek laflardan kaçının. Argo kelimeler, küfürler otomatik olarak silinecektir. Bu kural ihlalleri ip, üyelik, isiminizin banlanmasına yol açabilir.

Lütfen yardıma yönelik, konuyu uzatacak sorularınızı/yorumlarınızı forumda yazınız. Burası konu dahilindeki kısa soluklu öneri/yorumlar içindir. Aksi halde yorumunuzu göremeyebilir, uyarı alabilirsiniz.

Hatırlatmak amacıyla : html kodlarının, link yapmak, vb amacıyla gireceğiniz ekstra bilimum şeylerin çalışmayacağını belirteyim. Yorumlayıcı zaten linklerinizi otomatik çevirecek, gülücüklerinizi dönüştürecektir. Zengin metin özellikleri için araç çubuğundaki butonları kullanın.


İletişim Bilgileri


E-Posta adresiniz gösterilmeyecektir.

(unut)

Üye iseniz, giriş yapıp bu bilgileri girmeden hızlıca yorum yapabilirsiniz. Yorumunuzda resminiz/ikonunuz ve profil bağlantınız görüntülenecek, aynı zamanda güvenlik kodu girmek zorunda da kalmayacaksınız.
Üye olmak için buraya tıklayın.

Güvenlik Kodu
Güvenlik kodunu göremiyorsanız sayfayı yenileyin!


Yukarıdaki güvenlik kodunu bu kutuya yazın.

Yorum   
- +

Ad soyad, eposta ve yorum alanları
(⊗ işaretli alanlar) zorunludur.





mfyz.com'da şu an 14 ziyaretçi geziniyor. Toplam 114 makale, 208 yazı, 2999 gönderi var



  • RSS mfyz.com'u RSS beslemeleri ile takip edebilirsiniz
  • ServerTR Hosting Sponsoru ServerTR.com'a çok teşekkür ederiz
  • CC 2.5 Sitedeki materyalleri Creative Commons 2.5 Lisansı çerçevesinde kullanabilirsiniz. Lisans hakkında bilgi almak için tıklayın
  • İstatistikler Site ziyaret istatistikleri, konu, eğilim gibi ilginç istatistikler hakkında
  • Site Hakkında Site altyapısı, hazırlanışı, kurallar ve felsefesi hakkında
  • İletişim İletişim formu, iletişim bilgileri

mfyz.com Türk Programcılığının Gelişmesine Adanmıştır
HTML Standartlarına Uygundur

CSS Standartlarına Uygundur