Codeigniter: Pagination Helper dengan URI Associative Array untuk Parameter Tambahan

Pagination library dari Codeigniter sederhana dan sangat mudah digunakan. Tapi gimana caranya kalau kita mau nambah parameter tambahan lainnya seperti filter atau search di antara paging tersebut? Bisa pake query string! Gimana kalo pake URI bersegmennya CI biar rapi? Ga dibahas di user_guide nya nih. Dan entah kenapa, saya lebih suka menyebutnya “Paging”.

Kita pake fitur URI dan Associative Array, sudah pernah pake sebelumnya? Gampang, dengan “uri_to_assoc” kita bisa dapatkan parameter dalam bentuk array dari uri bersegmen dan “assoc_to_uri” untuk sebaliknya. Tinggal pelajari user_guide aja.

index.php/user/search/name/joe/location/UK/gender/male
[array]
 (
 'name' => 'joe'
 'location' => 'UK'
 'gender' => 'male'
 )

Cobain dulu demonya di sini.

Pertama, buat helper dengan nama paging_assoc_helper.php, trus simpan di folder helper. Bisa copas di sini.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed.');

    function paging_assoc($varkey, $assoc_n=3)
    {
        $CI =& get_instance();

        $qs_arr = $CI->uri->uri_to_assoc($assoc_n);
        $qs_tmp_arr=array();
        foreach($qs_arr as $key => $value)
            if ($key!=$varkey) $qs_tmp_arr[$key]=$value;

        foreach($CI->uri->segment_array() as $key => $value)
            if ($value=='p') $assoc_n = $key;

        $offset = (isset($qs_arr[$varkey])) ? $qs_arr[$varkey] : 0;
        $qs_uri = $CI->uri->assoc_to_uri($qs_tmp_arr).'/'.$varkey;

        return array(
            'offset' => $offset,
            'seg' => $assoc_n+1,
            'uri' => $qs_uri,
            );
    }

Kemudian buat sebuah controller, atau untuk ngetes, replace saja welcome.php controller. Jangan lupa load library dan helper yang diperlukan. Cara penggunaannya kira-kira seperti ini:

        //get paging settings, uri, segments, and offset
        //input param paging variable key, init segment
        $pg_arr = paging_assoc('p', 3);

Tidak begitu rumit, helper ini sebenarnya hanya untuk mendapatkan URI tambahan, segmen untuk paging yang baru, dan offset untuk LIMIT. Scriptnya sudah dites beberapa kali, tapi tidak menutup ada bug. Silakan kalau ada yang mau diperbaiki.

    public function index()
    {
        //$this->load->view('welcome_message');

        //load db, paging lib, some helpers
        $this->load->database();
        $this->load->library(array('pagination'));
        $this->load->helper(array('url', 'paging_assoc', 'form'));

        //get paging settings, uri, segments, and offset
        //input param paging variable key, init segment
        $pg_arr = paging_assoc('p', 3);
        if (isset($_POST['search']))
            redirect('/welcome/index/s/'.$_POST['search']);

        //other parameters
        $assoc_arr = $this->uri->uri_to_assoc(3);
        $s = (isset($assoc_arr['s'])) ? $assoc_arr['s'] : '';

        if ($s) $this->db->like('text', $s);
        $query = $this->db->get('test2');
        $num_rows = $query->num_rows();

        $paging['base_url'] = site_url().'/welcome/index/'.$pg_arr['uri'];
        $paging['total_rows'] = $num_rows;
        $paging['uri_segment'] = $pg_arr['seg'];
        $paging['per_page'] = 2;
        $this->pagination->initialize($paging);

        echo form_open('');
        echo 'Filter: '.form_input('search', (($s) ? $s : 'a'));
        echo form_submit('mysubmit', 'Submit');
        echo form_close();
        echo $this->pagination->create_links().'<br>';

        if ($s) $this->db->like('text', $s);
        $this->db->limit($paging['per_page'], $pg_arr['offset']);
        $query = $this->db->get('test2');

        foreach ($query->result() as $row)
        {
            echo $row->id.' '.$row->text.'<br>';
        }
    }

Dan ini contoh data MySQL nya;

CREATE TABLE IF NOT EXISTS `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `text` varchar(255) NOT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;

INSERT INTO `test2` (`id`, `text`, `status`) VALUES
(1, 'croissant', 1),
(2, 'dessert', 0),
(3, 'gummi bears', 1),
(4, 'caramels', 1),
(5, 'candy canes', 0),
(6, 'fruitcake', 1),
(7, 'lollipop', 0),
(8, 'jelly-o macaroon', 1),
(9, 'fruitcake', 1),
(10, 'chocolate bar', 0),
(11, 'sesame snaps', 1),
(12, 'jelly beans', 1),
(13, 'jelly-o', 0),
(14, 'donut', 1),
(15, 'applicake', 0),
(16, 'chupa chups', 1),
(17, 'apple pie', 0),
(18, 'cheesecake', 0),
(19, 'pastry', 1),
(20, 'pudding', 1),
(21, 'marshmallow', 0),
(22, 'cookie', 0),
(23, 'croissant', 1),
(24, 'bonbon', 1),
(25, 'gingerbread', 0),
(26, 'tiramisu', 1),
(27, 'toffee', 0),
(28, 'caramels', 0),
(29, 'halvah', 1),
(30, 'sweet roll macaroon', 0),
(31, 'wafer', 1),
(32, 'brownie', 1),
(33, 'ice cream', 0),
(34, 'sugar plum', 1),
(35, 'jujubes', 0),
(36, 'biscuit', 1);

Selamat mencoba.

Terbit di Iseng, Programming, Tutorial dan ditag , , , , , , .

2 Comments

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *