Codeigniter 3'de Arama Sonuçlarının Pagination ile Gösterilmesi

By Admin
In BackEnd
30/Haziran/2020
Okuma Süresi: 3 dk.

Merhaba sevgili okur. Codeigniter 3 ile pagination yapımını 3 farklı şekilde inceleyebiliriz.

1- route kullanmadan
2- route kullanarak
3- arama sonuçlarında

Biz 3 numarayı yani en karmaşık ve en az anlatılmış olanını inceleyecez bugün. Sitene bir arama modülü eklediysen mutlaka bu arama sonuçlarını pagination ile göstermen gerekir sevgili okur. Eğer bu ihtiyacı hissettiysen muhtemelen pagination sınıfını yukarıda belirttiğim 1 ve 2 numaralı uygulanış biçimleriyle kullanmışsındır diye düşünüyorum. Bunun için de temel olarak pagination sınıfını bildiğin için anlatmayacam. Buradaki amacımız arama sonuçlarını pagination ile gösterebilmek.

Bu yazıda yapacaklarımızın bir özetini geçmek istiyorum. Şu an bu yazıyı okuduğun blogda da aramalı pagination yaptım. Nasıl yaptığımın özetini anlatayım ki kafanda bir şablon oluşsun;

Sitende bir arama modülü var diyelim. Bu arama alanı bir form ve input içermek zorunda. Bu input'a ben name olarak q dedim. Bu form ile verileri istersen aynı sayfada da döndürebilirsin (bu durumda yine aynı controller'a yollayacak form verileri demektir) istersen actionunu başka sayfa olarak da ayarlayabilirsin. Ben bu formdan gelen q değişkenini arama sonuçlarını gösterdiğim bir başka controller'a yolladım. Az sonra aşağı yapıştıracağım pagination sınıfına ait temel kodları da yine bu controller'a yapıştırman gerekiyor. Çünkü bütün sayfalama ayarları o controller içinde yapılacak ve sonuçlar bir view'de gösterilecek.

Codeigniter'ın verdiği pagination kodlarını çok bozmadan aşağı yazdım. Bu kodlar üzerinden anlatıma devam edelim.


                

$sayfada = 2;
                $this->load->library('pagination');
                $config['page_query_string'] = TRUE;
                $config['query_string_segment'] = 'pg'; //sayfa no'ya pg desin. bunu ci kendi oluşturuyo.
                if(isset($_GET["q"])) { //q ise bizim arama değerimiz. bunu biz urle yazıp kendimiz oluşturduk.
                    $config['base_url'] = base_url('controllerName/?q=' . $_GET["q"]);
                } else {
                    $config['base_url'] = base_url("
controllerName");
                }

                $config['total_rows'] = $this->modelName->get_count(
                    array(
                        "isActive" => 1
                    ),
                    $_GET['q']
                );
                $config['uri_segment'] = 3;
                $config['per_page'] = $sayfada;
                $config['num_links'] = 10;
                $config['first_link'] = 'İlk';
                $config['last_link'] = 'Son';
                $config['first_tag_open'] = '';                

                  $config['first_tag_close'] = '';

                $config['last_tag_open'] = '';
                  $config['last_tag_close'] = '';
                $config['prev_tag_open'] = '';

                $config['prev_tag_close'] = '';
                $config['next_tag_open'] = '';

                $config['next_tag_close'] = '';
                $config['num_tag_open'] = '';                

                  $config['num_tag_close'] = '';
                $config['cur_tag_open'] = '';

                  $config['cur_tag_close'] = '';
                $this->pagination->initialize($config);
                if (empty($_GET["pg"])) {
                    $page = 0;
                } else {
                    $page = $_GET["pg"];
                }
                $vd->links = $this->pagination->create_links();
                $vd->etikets = $this->modelName->get_all(
                    array(
                        "isActive" => 1 //where
                    ),
                    @$_GET["q"], //like ve or_like
                    $config['per_page'], //limit
                    $page //offset
                );

1- $sayfada ile bir sayfada kaç veri göstereceğimizi yazıyoruz.


2- pagination sınıfını yüklüyoruz.


3- $config['page_query_string'] = TRUE;
$config['query_string_segment'] = 'pg';
Yukarıdaki kodlarla sayfalama için url'den alacağımız GET segmentini belirliyoruz. $_GET['pg'] ile kaçıncı sayfada olduğumuz bilgisini alıyoruz özetle.


4- $_GET['q'] ise arama yaptığımız, yani search inputuna yazıp form aracılığıyla çekeceğimiz değer. Bu değer boş da yollanabilir. O yüzden bir if kullandık orada boş ya da doluysa şeklinde;
if(isset($_GET["q"])) {
$config['base_url'] = base_url('controllerName?q=' . $_GET["q"]);
} else {
$config['base_url'] = base_url('controllerName');
}
Eğer değer doluysa controller adımızın sonuna bir q parametresi ekliyoruz ki o değeri çekebilelim. Değer boş ise sadece controller adı bize yeterli. (burada direkt controller adı yerine daha anlamlı bir isimlendirme yapabilirsin, onu da route ile tekrar bu controller'a gönderirsin. Route kullanman controller isimlerinin gizli kalması açısından bence önemli ama ben burada bir de route ile uğraşıp kafanı karıştırmak istemiyorum. O yüzden onu sen sonradan düzeltebilirsin.


5- Toplam kayıt için $config['total_rows']'un bulunması gerekiyor. Kodlarımızda şu şekilde yer alıyor;
$config['total_rows'] = $this->modelName->count_row();
Burada dikkat edilmesi gereken husus aramasız pagination'daki gibi bütün kayıtları çekmemek gerektiğidir. Çünkü biz arama terimine göre çıkan sonuçları getirecez. Mesela arama terimimiz "mouse" olsun. Veritabanındaki makale sayımız toplamda 500 olabilir ama içinde "mouse" geçen makale sayısı 100'dür. O yüzden buradaki modelde "like" kullanmamız gerekmekte. Modeldeki metodu da buraya yapıştırayım;
public function count_row($where = array(), $q)
{
return $this->db->where($where)->like("title", $q)->or_like("id", $q)->get($this->tableName)->num_rows();
}

Modelde dikkat etmen gereken en önemli husus or_like kullanımıdır. Diğer şeyleri bildiğini varsayıyorum zaten temel şeyler. or_like kullanmamızın amacı ise kullanıcının boş bir değer yollamasıyla oluşacak sorunu ortadan kaldırmaktır. Veritabanındaki title sütununa gidip boş olan $q verisini aradı ve sadece başlıksız olan makaleleri gidip buldu. Bu da haliyle ufak bir sorun yarattı. O yüzden her kayıtta mutlaka dolu gelmek zorunda olan bir sütunu or_like olarak eklemek zorundayız ki q değeri boş geldiğinde bütün sonuçları sıralasın ya da hiç bunlarla uğraşmayıp q değeri boş ise kullanıcıya "arama değerini boş yollayamazsınız" şeklinde bir uyarı da gösterebilirsin.

6- Açılış ve kapanış taglarıyla ilgili kısımları anlatmaya gerek duymuyorum. Temanın yapısına uygun bir şekilde burada açılış kapanış taglarını yazarsın kendin.

7- $_GET['pg'] değeri boş geldiği zaman sıkıntı olabiliyor. O yüzden bu değeri şu if sorgusu ile boş gelmekten kurtarıyoruz;
if (empty($_GET["pg"])) {
$page = 0;
} else {
$page = $_GET["pg"];
}


8- Pagination çalıştırılır ve linkler üretilir. Bu linkleri view'de $links olarak çağırabiliriz.

  $vd->links = $this->pagination->create_links();


9- Burası biraz çokomelli. View'a yollamak için az önce yukarıda belirttiğimiz per_page gibi değerlerle model ve controller oluşturacaz. Controller'da şu şekilde devam ediyoruz;

$vd->items= $this->modelName->get_all(
array(
"isActive" => 1 //where
),
@$_GET["q"], //like ve or_like
$config['per_page'], //limit
$page //offset
);

Sonrasında bunları yolladığımız modelName'de bir metot oluşturuyoruz;
public function get_all($where = array(), $q = "", $per_page, $page, $order = "id ASC")
{
return $this->db
->where($where)
->like('title', $q)
->or_like('id', $q)
->limit($per_page, $page)
->order_by($order)
->get($this->tableName)->result();
}


Codeigniter 3'de aramalı pagination bu şekilde sevgili okur. Sormak istediğin bir şey olursa bana soramazsın çünkü ne sitenin yorum bölümü var ne de sosyal medya hesaplarım. Bir sürelik böyle olacak küfür etmezsen sevinirim :)


Owl Carousel Nedir? Nasıl Kullanılır?
Codeigniter 3 ile sınırsız kategori yapımı