Cumartesi, 21 Şubat 2009

Digg Stilinde Sayfa Numaralandırması

 

CodeIgniter'da sayfalandırma yapmak için pagination sınıfını kullanırız. Bu yazıdaki amacımız günlüğümüzü yazdığımız bir sitede, ekrana bastıracağımız günlük yazılarının sayfalandırılmasını sağlamak. Öncelikle controller dosyamız içinden (application/controllers/gunluk.php) ilgili saylandırma sınıfını çağırıyoruz.

class Gunluk extends Controller {

 function Gunluk()
 {
  parent::Controller();
 }
 
 function index()
 {
  $this->load->library('pagination');
 }
}

Böylelikle daha sonra bu sınıfın tüm olanaklarını kullanabiliriz. Şimdi controller dosyamız içinde bir sayfa değişkeninin okunması gerektiği için bu değişkenin kontrolünü yapalım:

class Gunluk extends Controller {

 function Gunluk()
 {
  parent::Controller();
 }
 
 function index()
 {
  $this->load->library('pagination');

  if(isset($_GET['sayfa'])) $sayfa = (int) $_GET['sayfa'];
  else $sayfa = "0"; 
 }
}

Böylece controller dosyamız çalıştığında URL satırında gelen sayfa isimli değişkenin olup olmadığınu kontrol ediyoruz, varsa $sayfa isimli değişkene bu değeri atıyoruz. Bundan sonra model dosyamız (application/models/gunluk_model.php) içerisinden veritabanına bağlanarak günlüklerimizi listelemek ve maksimum günlük sayısını tespit etmektir.

class Gunluk_model extends Model {
 
    function Gunluk_model()
    {
        parent::Model();
    }

 function gunluk_getir($sayfa="0")
 {

  $query = $this->db->query('
   SELECT g.id, g.baslik, g.metin, g.tarih
   FROM gunluk g
   ORDER BY g.tarih DESC
   LIMIT '.$sayfa.',10
   ');
  
  $toplam = $this->db->get('gunluk');
 
  if($query->num_rows() > 0) 
  {
   $result = array(
    'gunluk' => $query->result_array(),
    'toplam' =>  $toplam->num_rows()
   );
   return $result;
  }
 }

Model içine yazılan yukarıdaki kod parçasında veritabanına bağlanırak, en sondan ilk başa doğru gönderme tarihine göre sıralanmış günlükler arasından 10 tanesi çekilmektedir. Ayrıca $toplam değişkeni ile de limitlendirme yapılmadan tüm günlük tablosunun veri adedi okutulmaktadır. Bundan sonraki adım, bu verilerin controller dosyası içine alınarak ekrana yansıtılmasıdır.

class Gunluk extends Controller {

 function Gunluk()
 {
  parent::Controller();
 }
 
 function index()
 {
  $this->load->library('pagination');

  if(isset($_GET['sayfa'])) $sayfa = (int) $_GET['sayfa'];
  else $sayfa = "0"; 
  
  $this->load->model('gunluk_model', 'Model');

  $data['gunluk_listesi'] = $this->Model->gunluk_getir($sayfa);
  $data['gunluk_listesi']['sayfa_listesi'] = $this->_config_pagination($data['gunluk_listesi']['toplam']);
  
  $this->load->view('gunluk_view',$data);
 }
 
}

Yukarıdaki controller dosyası içinde gunluk_model isimli dosya yüklendikten sonra, gunluk_getir metodunu çalışıtırılır. Bu metodun geri dönüşünden gelen içerik ve toplam sayfa sayısı gunluk_listesi adındaki diziye atanır. Bu aşamadan sonra ekrana bastıracağımız sayfa görünüşe ait stilleri hazırlamamız gerekir. Bunun için ilk defa digg.com sitesinde kullanılması nedeniyle "dig style" denilen formatta sayfa stili hazırlanır. Aşğıdaki css kodunu ayrı bir stil dosyası içine yazılabileceği gibi, ana sayfa içine de gömülebilir.

/* -------------------------------------------- */
/*   Pagination: Digg Style     */
/* -------------------------------------------- */
#pagination-digg ul{border:0; margin:0; padding:0;}

#pagination-digg li{
 display: inline;
 border:0 none;
 font-size:11px;
 list-style-image:none;
 list-style-position:outside;
 list-style-type:none;
 margin:0;
 padding:0;

}
#pagination-digg a{
 border:solid 1px #bbb;
 margin-right:2px;
}

#pagination-digg .next a,
#pagination-digg .previous a {
 font-weight:bold;
 padding:3px 6px;
} 
#pagination-digg .active{
 background:#336699 none repeat scroll 0 0;
 color:#FFFFFF;
 font-weight:bold;
 display:block;
 float:left;
 padding:6px 6px;
}
#pagination-digg a:link, 
#pagination-digg a:visited {
 color:#336699;
 display:block;
 float:left;
 padding:3px 6px;
 text-decoration:none;
}
#pagination-digg a:hover{
 border:solid 1px #380101;
}

Bu aşamadan sonra ise yeniden controller dosyasına dönülerek sayfalandırma sınıfının konfigürasyon ayarının yapıldığı metod eklenir.

 function _config_pagination($toplam)
 {
 
   $config['base_url'] = '?';
   $config['per_page'] = '10';
   $config['query_string_segment'] = 'sayfa';
   $config['total_rows'] = $toplam;
   
   $config['full_tag_open'] = '
    '; $config['full_tag_close'] = '
'; $config['first_link'] = 'İlk Sayfa'; $config['first_tag_open'] = ''; $config['last_link'] = 'Son Sayfa'; $config['last_tag_open'] = ''; $config['next_link'] = 'Sonraki'; $config['next_tag_open'] = ''; $config['prev_link'] = 'Önceki'; $config['prev_tag_open'] = ''; $config['cur_tag_open'] = '
  • '; $config['cur_tag_close'] = '
  • '; $config['num_tag_open'] = '
  • '; $config['num_tag_close'] = '
  • '; $this->load->library('pagination'); $this->pagination->initialize($config); return $this->pagination->create_links(); }

    Yukarıdaki metodta sayfalandırma konfigürasyonuna ait değerler yazılıdır. Bu kodda dikkat edilecek husus $config['per_page'] değişkeni ile tanımlanan her sayfada kaç adet günlük göstereceğimizin tanıtıldığı sabit sayının (bu örnekte 10 sayısı), metod dosyasında çektiğimiz sorguda geçen limit değeri ile aynı olması gerektiğidir.

    Ekrana görüntüyü bastırmak için ise view dosyasının (application/views/gunluk_view.php) içine controller dosyamızdan aktarılan değişkenlerin yazılması yeterlidir.

     <h3>Günlük Yazılarım</h3>  
      
    <? 
     foreach($gunluk_listesi['gunluk'] as $row) :
    ?>    
     <p><?=$row['baslik']?> | <?=$row['tarih']?></p>
     <p><?=$row['metin']?></p>
    
    <?
     endforeach;
    ?> 
     <?if(isset($gunluk_listesi['sayfa_listesi'])) echo $gunluk_listesi['sayfa_listesi'];?>
    

    Digg stilindeki sayfa numaralandırmasının uygulanmış haline ait sonuçları sitemizde de görebilirsiniz.

    Yorumlar

    Merhabalar,

    Öncelikle çalışmalarınızdan dolayı sizi tebrik ediyorum ve çalışmalarınızın devamını bekliyorum.
    Database bağlantısı ile ilgili basit bir örnek anlatabilir misiniz acaba. Yeni başladım codeigniter'a database bağlanıp sorgulama yapıp ekrana yazmayı başaramadım.
    Şimdiden teşekkürler.

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined property: Gunluk_model::$db

    Filename: models/gunluk_model.php

    Line Number: 12


    Fatal error: Call to a member function query() on a non-object in D:\www\modules\models\gunluk_model.php on line 12
    Bu uygulamayı yapmaya çalıştığımda da aynı hatayı alıyorum. Nerede yanlış yapıyorum acaba :S

    ramazan;
    bu örnekte sadece sayfalama konusu anlatılmış. örnekte veritabanı kullanılıyor. bu nedenle öncesinde database sınıfını yüklemen gerekiyor.  fatique kardeşim bu konuya başka bir yazsında değinmiş. Bunun için şuradaki örneği inceleyebilirsin;
    http://www.codeigniter.gen.tr/post/show/veritabani_baglanti_ayarlari

    kolay gelsin...

    Bu yazıda bahsetmem gerekirken atladığım bir noktayı bugün tespit ettik. CodeIgniter'da adres satırından bilgi alıp vermek için application/config/config.php dosyasında şu değişiklikleri yapmamız gereklidir: application/config/config.php dosyasında yapılması gerekli değişiklikler :

    //44. satır :
    $config[‘uri_protocol’] = “PATH_INFO”;
    
    //151. satır :
     $config[‘enable_query_strings’] = TRUE;
    
    Bu eksik bilgiyi tamamladığı için Yusuf Koç'a teşekkürler ederim.

    view dosyasının son satırında

    <?if(isset($gunluk_listesi['sayfa_listesi'])) echo $gunluk_listesi['gunluk_listesi'];?>

    yazmışsınız. Sanırım doğrusu:
    <?if(isset($gunluk_listesi['sayfa_listesi'])) echo $gunluk_listesi['sayfa_listesi'];?>

    olacak.

    Haklısın. Dediğin gibi düzelttim yazımı. Teşekkürler.

    Yorum Ekle