Php, Smarty ve Adodb İle Rss Feed Hazırlamak
Blog uygulamamı hazırlarken iş dönüp dolaşıp blog içeriğinin siteyi ziyaret etmeden izlenmesine olanak veren rss beslemesini (feed) hazırlamaya geldi. Benim için herseferinde küçük bir eziyet oluşturan bu durum bu sefer daha önceki denemelerimden biraz daha kolay ve zahmetsizce sonuçlandı. Kısaca paylaşmak istiyorum.
Rss işinin en kısa yoldan çözümü olduğunu iddia edecek değilim ancak, gayet kolay bir şekilde bu işin içinden çıkacağız. Gerekli olan malzemeleri sayıyorum:
- Smarty Template Engine
- ADOdb Database Abstraction Library for PHP
- Bir adet veritabanı (Tercihen mysql ya da postgresql)
- ve PHP :)
İlk olarak veritabanımızı oluşturmamız gerekmekte. Basit bir şekilde id,başlık,içerik ve tarih alanlarından oluşan bir tablomuz olduğunu varsayalım. Sql içeri şu şekilde olacak.
CREATE TABLE post ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , title VARCHAR( 255 ) NOT NULL , post TEXT NOT NULL , add_date INT NOT NULL )
Ardından adodb yardımı ile veritabanımıza bağlanalım. Bunu sağlamak için adodb web sayfasıdan kütüphanenin en son sürümünü indiriyoruz. Arşiv dosyasını indirdikten sonra uygulamamızı hazırlayacağımız klasörümüz içerisine açıyoruz. Uygulama içerisinde kullanacağımız dosyalarımız adodb dizini içerisinde yer alıyor. Biz bu klasör içerisinden sadece adodb.inc.php dosyası ile muhattap olacağız. Veritabanımıza bağlanmak için gerekli olan kodumuz şu şekilde görünecek.
<?php
include('adodb/adodb.inc.php');
$conn = &ADONewConnection("mysql"); // postgres, mssql ...
$conn->Connect("localhost", "rssuser", "rsspassword", "rssdb");
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
?>
Yukarıda mysql veritabanına bağlanmak için gerekli kodu görüyoruz. &ADONewConnection fonksiyonuna parametre olarak gönderdiğimiz ifade bizim veritabanı motorumuzu belirtmekte. Diğer veritabanları için gerekli olan sürücü isimlerini yukarıda belirttim.
Yukarıdaki kod içerisinde gördüğünüz “$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;” bölümü normal php sorgularında kullandığımız mysql_fetch_assoc fonksiyonuna benzer şekilde veritabanı sütunlarına alan isimleri ile ulaşmamız sağlıyor. Daha fazla ayrıntı için adodob dökümantasyonuna bakabilirsiniz.
Şimdi Smarty ile oynaşmaya sıra geldi. İlk defa php ile bir şablon motoru kullanacağım için biraz önyargılı yaklaştım smarty’ye ancak, kurulum ve ayarlamasının çok kolay olması ve beraberinde gelen güzel özellikler sayesinde kalbimi kazandı diyebilirim :P.
Smarty dökümantasyonunda da yeralan Extend Setup bölümünde geçen kodu şu şekle getirdim. Tabii bunu yapmadan önce smarty’ye ait en son sürümü indirdim ve smarty klasörü altında uygulama dizinimde saklıyorum. Smarty dizinimiz içerisinde Setup.php isimli bir dosya oluşturuyor ve içerisine şu kodları ekliyoruz.
<?php
require_once('libs/Smarty.class.php');
class myrss extends Smarty {
function myrss()
{
$this->Smarty();
$this->template_dir = 'smarty/templates/';
$this->compile_dir = 'smarty/templates_c/';
$this->config_dir = 'smarty/configs/';
$this->cache_dir = 'smarty/cache/';
$this->assign('app_name', 'myrssfeed');
}
}
?>
Burada dikkatinizi çeken şey smarty sınıfına bazı klasör yolları aktarıyoruz. Kodlarımızı çalıştırmadan önce smarty’nin çalışmak için ihtiyaç duyduğu klasörleri smarty dizini altında oluşturuyoruz. Klasör isimlerimiz sırası ile şöyle: templates, templates_c, configs, cache
Ufaktan rss.php dosyamızı oluşturmaya başlayalım. Şu ana kadar yaptıklarımız ile rss.php dosyamız şu şekilde görünecektir.
<?php
ob_start();
header('Content-Type: text/xml; charset=utf-8');
// adodb
include('adodb/adodb.inc.php');
$conn = &ADONewConnection("mysql"); // postgres, mssql ...
$conn->Connect("localhost", "rssuser", "rsspassword", "rssdb");
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
// smarty
require "smarty/setup.php";
$smarty = new rss();
?>
Kodumuzun ilk iki satırı dosya içeriğimizin tipinin xml olduğunu tarayıcıya bildirmek için gerekli referansları oluşturuyor. Ayrıntılı bilgi header, ob_start.
Sıra geldi veritabanımızdan içeriğimizi almaya.
$rss = $conn->Execute("SELECT id,title,post,add_date FROM posts");
$rss = $rss->GetRows();
Yukarıda gördüğümüz kod parçası veritabanımızdan blog kayıtlarımıza ait içeriği alıyor ve bunu bir php dizisi halinde $rss değişkeni içerisine depoluyor. {Execute() ve GetRows() metodlarına ait açıklamaları adodb dökümantasyonunda bulabilirsiniz.}
Sıra geldi rss içeriğimiz görüntülememizi sağlayacak olan rss.html isimli template dosyamızı oluşturmaya. Fazla soru sormadan, aşağıdaki kodları rss.html dosyası olarak smarty/templates dizini altına kaydediyoruz :).
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.00">
<channel>
<title>{$blogtitle}</title>
<link>{$blogaddr}</link>
<description>
{$desc}
</description>
<lastBuildDate>{$smarty.now|date_format:"%a,%e %b %Y"} {$smarty.now|date_format:"%H:%M:%S"} +0200</lastBuildDate>
<language>{$blog_lang}</language>
{foreach item=post from=$posts}
<item>
<title>{$post.title}</title>
<link>{$blogaddr}/detail.php?id={$post.id}</link>
<description>{$post.post|htmlspecialchars}</description>
<pubDate>{$post.add_date|date_format:"%a,%e %b %Y"} {$post.add_date|date_format:"%H:%M:%S"} +0200</pubDate>
</item>
{/foreach}
</channel>
</rss>
Rss dosyasının formatını oluşturmak için şuradaki adresten yardım aldım.
Burada açıklamamız gereken noktaları kısaca geçelim. 4. satırda gördüğünüz
<title>{$blogtitle}</title>
bölümündeki {$blogtitle} bölümü smarty sınıfına blogtitle adı ile aktarılan bir değişkeni ifade ediyor ve değişken içeriğini ekrana basmayı sağlıyor. Keza diğer satırlarda geçen {$blogaddr}, {$blog_lang} ve {$desc} bölümleride aynı şekilde aktarılan içerikleri ekrana aktarmaya yarıyor.
<lastBuildDate>{$smarty.now|date_format:"%a,%e %b %Y"} {$smarty.now|date_format:"%H:%M:%S"} +0200</lastBuildDate>
satırı rss dosyasının oluşturulduğu zamanı smarty’ye ait date fonksiyon yardımı ile belirtiyoruz. Ayrıntılı bilgi için adres : date_format
Ardından gelen {foreach item=post from=$posts} bölümü içeri aktarılan $posts isimli değişkenin barındırdığı diziyi çözmemizi ve içeriğini ekrana basmamızı sağlıyor. Burada foreach içerisinde kullandığımız from niteliği başvurulan değişkeni, item niteliği döngü içerisinde sıradaki dizi elemanının aktarıldığı değişken ismini belirtiyor.
Bu adımdan sonra içeriğimizi bir döngü halinde oluşturuyor ve rss dosyamızın içeriğini tamamlıyoruz.
Dikkatinizi çekti mi bilmiyorum ama
<description>{$post.post|htmlspecialchars}</description>
bölümünde ki $post.post bölümü, dizimiz içerisindeki veri parçasınına başvuru yapmaya imkan sağlıyor?
Ve bunun hemen devamında bulunan |htmlspecialchars bölümü ise php içerisinde yerleşik olarak bulunan htmlspecialchars fonksiyonundan içeriğimizi geçirmemize imkan sağlıyor.
Buna ihtiyaç duymamızın sebebi xml dosyamız içerisinde html etiketlerinin kaçırılmış halde bulunması gerekliliği.
Aksi taktirde xml dosyamız geçerli formata uymayacaktır {Kaçırılmıştan kastımı umarım anlamışsınızdır :)}.
Tüm bu yaptıklarımızdan sonra rss içeriğimizi ve diğer değişkenlerimizi rss.html şablon dosyamıza nasıl geçireceğiz bunu görelim.
Sorgu içeriğimizi $rss değişkeni içerisinde bir dizi olarak depolamıştık.
$smarty->assign( 'blogtitle', 'blog başlığım' ); // blog başlığı
$smarty->assign( 'blogaddr', 'htt://www.2nci.com' ); // blog adresi
$smarty->assign( 'desc', 'paylaşılması gereken faydalı bilgiler' ); // blog açıklaması
$smarty->assign( 'blog_lang', 'tr' ); // rss içeriği
$smarty->assign( 'posts', $rss ); // rss içeriği
// vee rss içeriğimizi ekrana basalım
$smarty->display('rss.html');
rss.php dosyamızın içeriğini tamam olarak görmek istersek:
<?php
ob_start();
header('Content-Type: text/xml; charset=utf-8');
// adodb
include('adodb/adodb.inc.php');
$conn = &ADONewConnection("mysql"); // postgres, mssql ...
$conn->Connect("localhost", "rssuser", "rsspassword", "rssdb");
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
// smarty
require "smarty/setup.php";
$smarty = new rss();
$smarty->assign( 'blogtitle', 'blog başlığım' ); // blog başlığı
$smarty->assign( 'blogaddr', 'htt://www.2nci.com' ); // blog adresi
$smarty->assign( 'desc', 'paylaşılması gereken faydalı bilgiler' ); // blog açıklaması
$smarty->assign( 'blog_lang', 'tr' ); // rss içeriği
$smarty->assign( 'posts', $rss ); // rss içeriği
// vee rss içeriğimizi ekrana basalım
$smarty->display('rss.html');
?>
Buraya kadar bir rss içeriğinin smarty,adodb ve php sayesinde nasıl hazırlanacağına dair karışık bilgiler vermeye çalıştım.
Asıl amacım veritabanı bağlantılı uygulamaların şablon motorları (template engine) aracılığı ile nasıl hazırlanacağına dair bir örnek hazırlamaktı. Eksik ve havada kalan bölümler olacağına eminim.
Bu konuda istediğiniz soruyu ve eleştiriyi iletebilirisiniz. Uygulamanın çalışan bir örneğini görmek isterseniz buyurun adres.
İlgili linkler :






Yorumlar