Bu yazımda veri tabanından çekilen verileri codeigniter pagination sınıfını kullanarak sayfalanmasını anlatacağım.
İlk olarak url yapımızdan bahsedeyim. Linklerimizin dizilimi controller/function/sayfa şeklinde olacak. Örnek verecek olursak http://localhost/CodeIgniter/index.php/sayfalama/index/5 linkinde sayfalama controller sayfamızın adı, index fonksiyonumuzun adı, 5 ise bizim veri tabanından kayıtları çekerken başlayacağımız kayıt numarası.
Uygulamamıza başlayabiliriz .
Model
sayfalama_model.php adında yeni bir Model dosyası oluşturuyoruz. Model dosyamızda veri tabanından verileri çeken ve veri tabanındaki verilerin adetini bize veren 2 adet fonksiyonumuz olacak. Veri tabanımızda yazilar adında bir tablomuz ve bu tablomuzun id, baslik adında 2 tane sütunu bulunmaktadır.
İndireceğiniz uygulama dosyası içinde sql dosyasını bulabilirsiniz
Aşağıdaki kodlar model dosyamızı oluşturmaktadır.
<?php class Sayfalama_model extends Model{ function __construct() { parent::Model(); } function yazilar($baslangic, $limit) { $sql = "SELECT * FROM yazilar ORDER BY id DESC LIMIT ?, ?"; $query = $this->db->query( $sql, array((int)$baslangic, (int)$limit) ); if( $query->num_rows() > 0 ) { return $query->result_array(); } else { return FALSE; } } function yazilar_adet() { $sql = "SELECT COUNT(*) as adet FROM yazilar"; $query = $this->db->query($sql); return (int)$query->row()->adet; } }
Yazıları çeken sorgumuzu bind query ile yaptık böylece otomotik olarak escape işlemi yaptık ayrıca parametre olarak gelen $baslangic ve $limit int tipine dönüştürerek urlde string olması durumuna karşılık önlemimizi almış olduk.
Controller
sayfalama.php adında yeni bir controller oluşturuyoruz. Controller dosyasında yapılacaklar :
- Controller dosyamızda veri tabanındaki kayıtları url den gelen numaraya göre çekeceğiz.
- Veri tabanındaki kayıtları her sayfada 3 adet kayıt olacak şekilde sayfalandıracağız.
Controller dosyamızın içeriği :
<?php class Sayfalama extends Controller{ function __construct() { parent::Controller(); } function index() { $this->load->Model('sayfalama_model', 'Model'); $data['sayfalama_linkleri'] = $this->sayfalama_linkleri($this->Model->yazilar_adet()); $data['yazilar'] = $this->Model->yazilar($this->uri->segment(3,0),5); $this->load->view('sayfalama_view', $data); } function sayfalama_linkleri($toplam) { $this->load->library('pagination'); $config = array( 'base_url' => site_url('sayfalama/index'), 'total_rows' => $toplam, 'per_page' => 3, 'num_links' => 2, 'page_query_string' => FALSE, 'uri_segment' => 3, 'full_tag_open' => '<div class="pagination">', 'full_tag_close' => '</div>', 'first_link' => 'İlk Sayfa', 'first_tag_open' => '', 'first_tag_close' => '', 'last_link' => 'Son Sayfa', 'last_tag_open' => '', 'last_tag_close' => '', 'next_link' => 'Sonraki', 'next_tag_open' => '', 'next_tag_close' => '', 'prev_link' => 'Önceki', 'prev_tag_open' => '', 'prev_tag_close' => '', 'cur_tag_open' => '<span class="current">', 'cur_tag_close' => '</span>', 'num_tag_open' => '', 'num_tag_close' => '' ); $this->pagination->initialize($config); return $this->pagination->create_links(); }
View
Kayıtları ve sayfalama linklerini view dosyamızda yazdıracağız. sayfalama_view.php adında yeni bir view dosyası oluşturun ve aşağıdaki kodları view dosyasına ekleyin.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style type="text/css"> a{color:#21759B;text-decoration:none;} #table th{background:#eee;padding:5px;text-align:left; vertical-align: top; } #table td{padding:5px; border-bottom: 1px solid #c3c3c3; vertical-align: top; } #table{ -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; width:500px; border:1px solid #c3c3c3;} #table tr:hover{ background: #bed9ee;} .pagination{margin-top:20px;} .pagination a, .pagination span{background: #fff;padding:5px;margin:2px;border:1px solid #d9d9d9;font-weight: bold;text-decoration:none;-moz-border-radius:3px;-webkit-border-radius: 3px;} </style> </head> <body> <?php if( $yazilar ) : ?> <table id="table"> <tr> <th>ID</th> <th>Başlık</th> </tr> <?php foreach( $yazilar as $dizi ) : ?> <tr> <td style="width: 10%;"><?php echo $dizi['id']; ?></td> <td><a href="#"><?php echo $dizi['baslik']; ?></a></td> </tr> <?php endforeach; ?> </table> <?php echo $sayfalama_linkleri; ?> <?php endif; ?> </body> </html>
Uygulamamız sonucunda oluşan sonuç :
NOT : Eğer config dosyanızda $config['enable_query_strings'] = TRUE; şeklinde ayarlıysa page_query_string ayarını FALSE yapsak dahi codeigniter linklerimizi http://localhost/CodeIgniter/index.php/sayfalama/?per_page=5 şeklinde oluşturacaktır. Bu sorunu aşmak için system/libraries/pagination.php dosyasını açın ve aşağıdaki değişiklikleri yapın.
SATIR 125 eski hali :
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
yeni hali :
if ($CI->config->item('enable_query_strings') === TRUE && $this->page_query_string === TRUE)
SATIR 175: eski hali :
if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
yeni hali :
if ($CI->config->item('enable_query_strings') === TRUE && $this->page_query_string === TRUE)
İyi çalışmalar.
'total_rows' => $this->Model->yazi_adet(),
yerine:
'total_rows' => $toplam,
olması gerekiyordu. Gözünden kaçmış sanırım :)
Merhaba hocam ben sizin kodlarla bir örnek yaptım ama olmadı listeliyorum haberleri yalnız sayfalama kısmında sayfayı cagırınca hata alıuyorum. Diger yada diger veriler gelmiyor hep aynı veriler nasıl aşabilirim?
http://localhost/ci/index.php/sayfala/ dizin yapım bu.
aldığın hatayı görmeden yorum yapamam. var_dump fonksiyonu ile değişkenleri ekrana yazdırarak hatanın nedenini bulabilirsin.
Hocam , mesela ikinci sayıya tıkladıgımda 4 veri 8 verioluyor aynı sayfada ? Ama sonraki 4 kayıt gelsin istiyorum nasıl yapabilirim?? Bu arada yorum için çok teşşekür ederim.
büyük ihtimalle sql sorgundan kaynaklanıyor olsa gerek. örneğin 4. ve 8. kayıtlar arasındaki verileri çekmek istersen sorgun şu şekilde olmalı.
“limit 4,4” yazan kısımdaki birinci 4. kaçıncı kayıttan itibaren getireceğini söylüyor, ikinci 4 ise kaç tane kayıt getireceğini söylüyor.
index.php/home/test/?key=deneme bu url ile normal çekiyorum , ama sayfalama linkinde home/test/?key=deneme/4 öyle oluyor. Ben ise bu sayfalama kısmını home/test/4?key=deneme gelmesini istiyorum. bir nevi haberturk'ün arama sayfası gibi.. "deneme" degerini get ile alıyorum onunla sayfalama yapmak istyiyoprum yardımınıza ihtiyacım var .
Aynı sorunla bende karşılaşmıştım. Hatta şuan blogumda arama kutusuna ‘a’ yazarak ara sayfalama linklerine bakarsan şu şekilde oluşuyor :
Bu yöntemi ile codeigniterin pagination kütüphanesini kullanarak yapamıyorsun. Ben libaries dizinin altına MY_pagination dosyası oluşturup CI’nin pagination sınıfını genişleterek çözüm buldum.
Yorum yaptığında verdiğin email bilgin doğru ise o adrese gönderiyorum MY_pagination.php dosyasını?
pre kodu için üzgünüm hocam.
Sorun değil :) kaldırdım ben. Yorumunu iznin olmadan düzenledim, sen de kusura bakma.
Hocam size çok zahmet olacak kurtarın beni bu dertten , cuma cuma size dua edeyim yahu :)) takip ediyoruz seni vallahi. Şuanki mailim bu , aceleden maile bile isim girmişim… Örnekleriyle gönderirseniz çok süper olur hocam.
merhaba 3 değilde 10 veya 20 kayıt seklinde nasıl listeleme yaparız? düz mantık olarak 3 ü 20 yaptım ama olmadı =)
‘per_page’ => 20 olacak şekilde değiştirin. Veritabanından kayıtları çekerken limit 20 olacak şekilde çekerseniz çalışacaktır.
Fatal error: Class ‘Controller’ not found in D:\usbwebserver\root\ci\application\controllers\kullanici.php on line 9
hatası alıyorum çözemedim bir türlü
Codeigniter yeni sürümünde controller isimlerini CI_Controller olarak değiştirdi.
İyi günler hocam. Uzun süredir bu konu altına yorum yapılmamış. Ancak ben yeni CodeIgniter öğrenmeye başladım :).
index.php controller sayfamın adı. belli bir css yapısıyla sayfanın şeklini düzelttim. sayfanın orta kısmına veritabanından verileri çekmek istiyorum. ( Pagination sınıfını kullanarak ).Bunu başardım ancak , İlk etapta linkler ve veriler css yapısını bozmadan geliyor. Ancak linklere tıkladığımda css yapısı dışına çıkılıyor. Bunu nasıl düzeltebilirim ?
pek anlayamadım sorununu ama pagination classının config ayarlarında belirlediğin html taglarını doğru vermemiş olabilirsin.