Joomla! Veritabanı İşlemleri – 1: Seçme sorgusu


Joomla! için aradığım modülü bulamadım. Daha doğrusu bedavasını bulamadım. Genelde işime yaracak olan modüller ücretli. Sonrasında kendim yazmaya karar verdim. Ne de olsa açık kaynak bunun için var.

Veritabanında kayıtlı makaleleri slideshow içinde başlığını ve resmini gösterecek şekilde bir yapı düşünüyordum. Bunun için orbit slider‘dan faydalandım.

Mesele orbit değil. Onu daha sonra irdeleriz. Burada anlatmak istediğim, Joomla! içinde veritabanından okuma işleminin nasıl yapıldığıdır.

Birinci adım olarak

$db = JFactory::getDbo();

ile Joomla! sitemizdeki veritabanı bağlantısının bir instance’ını oluşturuyoruz.

Ardından

$query = $db->getQuery( true );

ile JDatabaseQuery sınıfının JDatabaseDriver getQuery metodunun da bir instance’ını oluşturuyoruz.

Buraya kadar herşey çok kolay. Bundan sonra soruguyu oluşturmamız gerekiyor. Bunun için $query’den faydalanacağız Benim sorgumda seçmek istediğim ‘Öne çıkan’ (featured) olarak işaretlenmiş makaleler. Bunun bilgisi iki ayrı tabloda mevcut. Birisi content tablosunda, diğeri de content_frontpage tablosunda. Dolayısıyla bu iki tablo arasında makalelerin ‘id’ alanları üzerinden bir ilişki mevcut:

$query
    ->select( array( 'f.content_id', 'c.id', 'c.title', 'c.alias', 'c.images', 'c.language' ) ) //1
    ->from( '#__content AS c' ) //2
    ->join( 'INNER', '#__content_frontpage AS f ON (c.id = f.content_id)' ) //3
    ->where( "c.language = '" . JFactory::getLanguage()->getTag() . "' AND c.state=1" ) //4
    ->order( 'f.ordering ASC' ); //5

Zincirleme, kodun okunabilirliği açısından daha kullanışlı. Hem yazana, hem de okuyana.

  1. select() methodu ile hangi alanları seçeceğimizi dizi içerisinde belirtiyoruz.
  2. from() fonksiyonu ile bu alanların ait olduğu ana tabloyu belirtiyoruz.
  3. join() fonksiyonu ile ilişkili tabloyu ne tür join işlemi yapılacaksa (burada inner join) onu ve ilişkili anahtarları belirtiyoruz.
  4. where() metodu içine filtre şartlarımızı yazıyoruz. Burada şartımız makalenin dili sayfanın seçili dili ile aynı olacak, ve makale yayınlanıyor olacak.
  5. order() metoduyla da gelen sonuçların hangi alana göre sıralanacağını belirtiyoruz. Burada content_feature tablosundaki ordering alanına göre sıralanmasını istedim.

Evet, sorguyu henüz oluşturduk. Ancak daha çalıştırmadık.

$db->setQuery($query);

satırı ile sorguyu çalıştırdıktan sonra

$sonuclar= $db->loadObjectList();

$sonuclar nesnesi içine gelen tablo verilerini aktardık.

Bundan sonraki işlem bir döngü içinde bu sonuçları listelemek olacaktır.

                       
foreach ( $sonuclar as $s )
{
$id = $s->id;
$baslik = $s->title;

}

$s dizisinde select metodunun içine yazdığımız alan isimleri birer anahtar olarak gelir. foreach döngüsü içinde her bir kayıt için değerleri elde etmek için

$baslik = $s->title;

şeklinde kullanılabilir. İçine gerekli HTML kodları da eklendikten sonra modül çalışmaya hazırdır.

Normal olarak bir sorgu yazsam olmaz mıydı?

$sorgu = "SELECT 
                 f.content_id, 
                 c.id, 
                 c.title, 
                 c.alias, 
                 c.images 
          FROM 
                 #__content AS c 
          INNER JOIN 
                 #__content_frontpage AS f ON (c.id = f.content_id) 
          WHERE 
                 c.language = '" . JFactory::getLanguage()->getTag() . "' 
                 AND c.state=1 
          ORDER BY 
                 f.ordering";

de diyebilirdik ama madem Joomla! içinde sorgulama yapıyoruz, adamlar her türlü güvenlik tehdidine karşılık bu sorgulama metodunu geliştirmişler o zaman bize de onu kullanmak düşer. Zira yol dururken dağdan gitmek olmaz. ‘Off-road’cular ayrı tabii.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s