pillinetwork hesabınızla giriş yapın.

CodeIgniter'da Digg Stili Sayfa Numaralandırma

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.

1
2
3
4
5
6
7
8
9
10
11
12
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/* -------------------------------------------- */
/* 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function _config_pagination($toplam)
{
$config['base_url'] = '?';
$config['per_page'] = '10';
$config['query_string_segment'] = 'sayfa';
$config['total_rows'] = $toplam;
$config['full_tag_open'] = '<ul id="pagination-digg">';
$config['full_tag_close'] = '</ul>';
$config['first_link'] = 'İlk Sayfa';
$config['first_tag_open'] = '<li class="previous">';
$config['first_tag_close'] = '</li>';
$config['last_link'] = 'Son Sayfa';
$config['last_tag_open'] = '<li class="next">';
$config['last_tag_close'] = '</li>';
$config['next_link'] = 'Sonraki';
$config['next_tag_open'] = '<li class="next">';
$config['next_tag_close'] = '</li>';
$config['prev_link'] = 'Önceki';
$config['prev_tag_open'] = '<li class="previous">';
$config['prev_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="active">';
$config['cur_tag_close'] = '</li>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$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 hususlardan biri $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ği, diğeri ise $config['query_string_segment'] değişkeninde sonraki sayfa numarasını aktarmak için kullanılan değişken adının sayfa 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şkenlerden çekilen verilerin kullanılması yeterlidir.

1
2
3
4
5
6
7
8
9
10
11
12
<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['gunluk_listesi'];?>

Bu yazıda anlatılan sayfa numaralandırması kodlarının uygulandığı, çalışan bir site görmek için codeigniter.gen.tr adresini ziyaret edebilirsiniz.

Spacer
Spacer
/* fatigue yazdı. 19 Şubat 2009 10:40. 4 yorum var */

Yorumlar

Bu yazıda veritabanı bağlantısı konusunu anlatmamıştım. Eğer uygulamak isteyen arkadaşlar varsa önce CodeIgniter'da Veritabanı Ayarları yazımı okuyabilirsiniz.

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 :

1
2
3
4
5
//44. satır :
$config[‘uri_protocol’] = “PATH_INFO”;
//151. satır :
$config[‘enable_query_strings’] = TRUE;

Bu eksik bilgiyi tamamladığı için Raidenceviz'e teşekkürler ederim.

Evet bunun için akşamdan çok tırmalamıştım fatih buraya yazman çok faideli oldu :)

konuyla tam olarak alakalı değil belki ama kendi yaptığım numaralandırmada şöyle bir sorun oluyor. görünen numaralandırma şu şekilde:
1 2 3 4 >

bunlardan 1 hangi sayfada olursam olayım pasif halde, yani güncel sayfa halinden çıkmıyor. Diğer sayfa numaraları ise 2 şer artıyor, yani 2->4. sayfa, 3->4. sayfa, 4->6. sayfaya gidiyor. önceki linki ise hiç çıkmıyor.

controller dosyasındaki ayarlar şu şekilde:


$this->load->library('pagination');
$config['base_url'] = base_url().'index.php/site/contents/index';

$config['per_page'] =2;
$config['total_rows'] = $this->db->count_all('contents');

$this->pagination->initialize($config);

$this->data['contents'] = $this->model_ismi->getContentsList($config['per_page'],$this->uri->segment(4));

$this->data['pagination'] = $this->pagination->create_links();
$this->data['page'] ='contents';
$this->load->view('site/container',$this->data);

sorun neden olabilir?

Düzeltmne: CI manuel'i biraz karıştırınca sorunun nedenini buldum.
$config['uri_segment'] = 4; olarak ayarlamayı unutmuşum.

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork