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.

    merhaba ben bu pagination sınıfını kullandığımda linkler &perpage=1  diye gidiyo bunu seo şekline getiremiyorum düz site.com/urun/1   gibi neden acaba?

    @murat: Öncelikle config dizisinde aşağıdaki ayarı yapmalısın:

    $config['page_query_string'] = TRUE;
    $config['enable_query_strings'] = FALSE;//ya da hiç bu satır olmasın.
    

    Böylelikle uri segment olarak gelen değişkeni okuyacağını söylemiş olursun. Bir de url deki kaçıncı değerin sayfa numarası olduğunu belirtmen lazım. Diyelim 3. değer sayfa numarası ise:

    $config['uri_segment'] = 3;
    

    Böylece url adresi şöyle olduğunda sayfalama 20. sayfayı getirecektir: http://example.com/index.php/test/page/20

    Detaylı bilgi için Kullanım Kılavuzunu takip edebilirsin.

    çok teşekkürler

    teşekkürler

    merhaba benim şöyle bir problemim var ürünler tablom var bu ürünler tablomu kategori sayfasında sayfalama yapıcam kategori sayfası içinde indirimler anasayfa ürünleri kampanyadakiler diye linklerim var burda nasıl bir sayfalama mantığı işlicem yardım edermisiniz umarım soruyu sorabilmişimdir

    @Mahmut: Bu tarz sorularınız için lütfen Google Groupu kullanın.

    çok şık oldu teşekkür ederim

    Bu pagination classında current page kısmında  kanımca bir sorun var.. 



    if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)




    ilk eşleşmeyi doğru karşılaştımadığı için kaldırdım sorunsuz çalışıyor..(2 yerde var)


    sizce sorun bende mi ? 

    @Mehmet Ali: Controller içinden config sınıfı değişkenlerini çağırırken $CI değişkeni yerine $this değişkenini kullanmalısın. Detaylar için http://codeigniter.com/user_guide/libraries/config.html

    Yorum Ekle