Datatable Serverside Processing menggunakan Codeigniter

Datatable Serverside Processing menggunakan Codeigniter

Datatable merupakan library yang sangat bagus untuk menampilkan data dari database ke view dalam bentuk table dengan dengan fitur filter, pagination, show perpege, dan sort by.

Bagi anda yang bergelut di bidang backend development tutorial ini akan sangat bermanfaat bagi anda.

Datatable banyak menuai kontroversi bagi developer web. Hal ini dikarenakan datatable meload semua data yang ada di suatu table di database kemudian di tampilkan dalam bentuk datatable sehingga ada filter, pagination, show perpege, dan sort by.

Ketika data yang diload masih sedikit, tidak ada masalah terlihat. Akan tetapi ketika data yang diload telah mencapai jutaan record akan terlihat masalah lamanya data yang load, sehingga sering mengalami not responding pada browser.

Setelah cukup lama mencari solusi untuk masalah tersebut. Akhirnya problem solved, solusinya yaitu datatable serverside processing.

Dengan mentitik beratkan semua pemrosesan pada sisi server akan membuat sisi client menjadi ringan dan cepat. hal ini disebabkan data tidak diload secara keseluruhan dari database.

Melainkan dilimit oleh sisi server sesuai dengan request yang dilkukan clientside. Dengan begitu, berapun jumlah record yang akan ditampilkan tidak ada lagi masalah terlihat.

Ok, sekarang mari kita langsung praktekkan.

Pertama-tama tentu saja anda harus memiliki codeigniter terlebih dahulu. Jika anda belum memilikinya silahkan download di official websitenya www.codeigniter.com.

Selain codeigniter, ada beberapa file yang harus dipersiapkan yaitu: jquery datatable. Anda bisa mendownloadnya di official websitenya. Jika anda tidak ingin downloadnya atau bingung bagaimana mendownloadnya. Jangan khawatir karena telah saya siapkan semua yang butuhkan didalam source code yang bisa anda download di akhir tutorial ini.

Sekarang silahkan ikuti langkah berikut:

 

1. Buat database dan table dengan mengeksekusi query berikut:

CREATE DATABASE db_serverside;
USE db_serverside;

CREATE TABLE tbl_user(
user_id INT PRIMARY KEY AUTO_INCREMENT,
user_nama VARCHAR(40),
user_email VARCHAR(50),
user_alamat VARCHAR(100)
)ENGINE=INNODB;

2. Insert data ke table user dengan mengeksekusi query berikut:

INSERT INTO tbl_user(user_nama,user_email,user_alamat)VALUES
('User ke-1','email@gmail.com','Alamat ke-1'),
('User ke-2','email@gmail.com','Alamat ke-2'),
('User ke-3','email@gmail.com','Alamat ke-3'),
('User ke-4','email@gmail.com','Alamat ke-4'),
('User ke-5','email@gmail.com','Alamat ke-5'),
('User ke-6','email@gmail.com','Alamat ke-6'),
('User ke-7','email@gmail.com','Alamat ke-7'),
('User ke-8','email@gmail.com','Alamat ke-8'),
('User ke-9','email@gmail.com','Alamat ke-9'),
('User ke-10','email@gmail.com','Alamat ke-10'),
('User ke-11','email@gmail.com','Alamat ke-11'),
('User ke-12','email@gmail.com','Alamat ke-12'),
('User ke-13','email@gmail.com','Alamat ke-13'),
('User ke-14','email@gmail.com','Alamat ke-14'),
('User ke-15','email@gmail.com','Alamat ke-15');

Disni saya hanya menginputkan 15 record, silahkan input data sebanyak-banyaknya. Semakin banyak data yang anda inputkan semakin bagus.

3. Install codeigniter

Extract codeigniter ke www (jika menggunakan wampserver) atau htdocs (jika menggunakan XAMPP). Kemudian rename project codeigniter anda sesuai dengan project Anda. Disini saya memberi nama ci_serverside.

Setelah installasi, buat folder assets dan sertakan file datatable dan jquery didalam folder assets. Sehingga terlihat struktur project kita seperti berikut:

aplication
assets
      datatables
      jquery
system

4. Konfigusai beberapa file berikut:

Buka application/config/autoload.php atur menjadi seperti berikut:

$autoload['libraries'] = array('database');
$autoload['helper'] = array('url');

Buka application/config/config.php dan atur menjadi seperti berikut:

$config['base_url'] = 'http://localhost/ci_serverside/';

Terakhir buka application/config/database.php

$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
        'dsn'   => '',
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'db_serverside',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
);

 

5. Buat Model dengan nama User_model.php dengan kode sebagai berikut:

<?php

class User_model extends CI_Model {

        var $table = 'tbl_user'; //nama tabel dari database
        var $column_order = array(null, 'user_nama','user_email','user_alamat'); //field yang ada di table user
        var $column_search = array('user_nama','user_email','user_alamat'); //field yang diizin untuk pencarian 
        var $order = array('user_id' => 'asc'); // default order 

        public function __construct()
        {
                parent::__construct();
                $this->load->database();
        }

        private function _get_datatables_query()
        {
                
                $this->db->from($this->table);

                $i = 0;
        
                foreach ($this->column_search as $item) // looping awal
                {
                        if($_POST['search']['value']) // jika datatable mengirimkan pencarian dengan metode POST
                        {
                                
                                if($i===0) // looping awal
                                {
                                        $this->db->group_start(); 
                                        $this->db->like($item, $_POST['search']['value']);
                                }
                                else
                                {
                                        $this->db->or_like($item, $_POST['search']['value']);
                                }

                                if(count($this->column_search) - 1 == $i) 
                                        $this->db->group_end(); 
                        }
                        $i++;
                }
                
                if(isset($_POST['order'])) 
                {
                        $this->db->order_by($this->column_order[$_POST['order']['0']['column']], $_POST['order']['0']['dir']);
                } 
                else if(isset($this->order))
                {
                        $order = $this->order;
                        $this->db->order_by(key($order), $order[key($order)]);
                }
        }

        function get_datatables()
        {
                $this->_get_datatables_query();
                if($_POST['length'] != -1)
                $this->db->limit($_POST['length'], $_POST['start']);
                $query = $this->db->get();
                return $query->result();
        }

        function count_filtered()
        {
                $this->_get_datatables_query();
                $query = $this->db->get();
                return $query->num_rows();
        }

        public function count_all()
        {
                $this->db->from($this->table);
                return $this->db->count_all_results();
        }

}

 

6. Buat Controller dengan nama User.php dengan kode sebagai berikut:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class User extends CI_Controller {

        function __construct(){
                parent::__construct();
                $this->load->model('User_model');
        }

        function index(){
                $this->load->view('user_view');
        }

        function get_data_user()
        {
                $list = $this->User_model->get_datatables();
                $data = array();
                $no = $_POST['start'];
                foreach ($list as $field) {
                        $no++;
                        $row = array();
                        $row[] = $no;
                        $row[] = $field->user_nama;
                        $row[] = $field->user_email;
                        $row[] = $field->user_alamat;

                        $data[] = $row;
                }

                $output = array(
                        "draw" => $_POST['draw'],
                        "recordsTotal" => $this->User_model->count_all(),
                        "recordsFiltered" => $this->User_model->count_filtered(),
                        "data" => $data,
                );
                //output dalam format JSON
                echo json_encode($output);
        }

}

 

7. Buat View dengan nama user_view.php dengan kode sebagai berikut:

<!DOCTYPE html>
<html>
    <head> 
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Datatable Serverside Codeigniter</title>
    <link href="<?php echo base_url('assets/datatables/css/jquery.dataTables.min.css')?>" rel="stylesheet">

    </head> 
<body>
    <div class="container">
        <h1 style="font-size:20pt">Datatable Serverside Codeigniter</h1>

        <h3>Data Users</h3>
        <br />
       
        <table id="table" class="display" cellspacing="0" width="100%">
            <thead>
                <tr>
                    <th>No</th>
                    <th>Nama</th>
                    <th>Email</th>
                    <th>Alamat</th>
                </tr>
            </thead>
            <tbody>
            </tbody>

            <tfoot>
                <tr>
                    <th>No</th>
                    <th>Nama</th>
                    <th>Email</th>
                    <th>Alamat</th>
                </tr>
            </tfoot>
        </table>
    </div>

<script src="<?php echo base_url('assets/jquery/jquery-2.2.3.min.js')?>"></script>
<script src="<?php echo base_url('assets/datatables/js/jquery.dataTables.min.js')?>"></script>


<script type="text/javascript">
    var table;
    $(document).ready(function() {

        //datatables
        table = $('#table').DataTable({ 

            "processing": true, 
            "serverSide": true, 
            "order": [], 
            
            "ajax": {
                "url": "<?php echo site_url('user/get_data_user')?>",
                "type": "POST"
            },

            
            "columnDefs": [
            { 
                "targets": [ 0 ], 
                "orderable": false, 
            },
            ],

        });

    });

</script>

</body>
</html>

Jika selesai, jalankan controller user dengan mengunjungi URL berikut:

http://localhost/ci_serverside/index.php/user

Ok, sekian dulu tutuorial kali ini, semoga bermanfaat dan Keep Coding!

Download Source

Share:




LAINNYA UNTUK ANDA


Komentar (20)

Fathurrahman, 06 January 2018 18:41 - Reply

kalau datatable dari 2 tabel gimana gan ?? biar pas pencariannya datanya bisa dari tabel yang lain

M Fikri, 07 January 2018 12:24 - Reply

Pake fungsi join gan,
silahkan cek artikel "CRUD Ignited datatables pada codeigniter"!
Artikel itu adalah jawaban dari pertanyaan mas Fathurahman.
Thank You!

Adji Trias, 19 March 2018 14:52 - Reply

gan kalau mau nambahin aksi read, edit dan delete didalam tabelnya gimana ya?

M Fikri, 22 April 2018 08:22 - Reply

Cek disini untuk CRUD-nya gan:
https://mfikri.com/artikel/crud-dengan-ignited-datatables-pada-codeigniter.html

randy, 27 March 2018 16:49 - Reply

gimana untuk link editnya gan?

M Fikri, 22 April 2018 08:23 - Reply

Cek disini untuk CRUD-nya gan:
https://mfikri.com/artikel/crud-dengan-ignited-datatables-pada-codeigniter.html

safety, 02 April 2018 20:37 - Reply

Gan kalo misalkan ingin pake tombol action delete tapi pake modal dialog gimana gan ?, kalo langsung delete sih bisa tinggal tambahin anchor biasa aja di controller, tapi dari kasus saya supaya lebih menarik ingin membuat tombol delete pake modal dialog. Terima kasih

M Fikri, 22 April 2018 08:23 - Reply

Cek disini untuk CRUD-nya gan:
https://mfikri.com/artikel/crud-dengan-ignited-datatables-pada-codeigniter.html

M. Alif Abhiesa Al Kautsar, 04 June 2018 00:09 - Reply

FYI kalo mau pake join table gausah pake baca artikel yang CRUD saran ane, soalnya ribet lagi. kalo mau agan cukup joinkan tablenya langsung di bagian fungsi get_datatables() dan count_filtered() kalo punya ane hasilnya demikian function get_datatables() { $this->_get_datatables_query(); if($_POST['length'] != -1) $this->db->limit($_POST['length'], $_POST['start']); $this->db->join('tbl_barang', 'tbl_log_credit.id_barang = tbl_barang.id_barang'); $this->db->join('tbl_nasabah', 'tbl_log_credit.id_nasabah = tbl_nasabah.id_nasabah'); $this->db->where($this->whereclause); $query = $this->db->get(); return $query->result(); } function count_filtered() { $this->_get_datatables_query(); $this->db->join('tbl_barang', 'tbl_log_credit.id_barang = tbl_barang.id_barang'); $this->db->join('tbl_nasabah', 'tbl_log_credit.id_nasabah = tbl_nasabah.id_nasabah'); $this->db->where($this->whereclause); $query = $this->db->get(); return $query->num_rows(); } begitu saja sudah beres, tidak udah mengubah coding pada controller dan modal maupun viewnya.

Ardian, 05 June 2018 20:12 - Reply

permisi mas mau tanya, ini kan saya punya kondisi dimana select user A atau user NULL di tampilan nya keluar sesuai keinginan. tapi search nya gak berjalan sesuai keinginan seperti yang harusnya tidak tampil tapi tetap tampil mungkin bisa di jabarkan fungsi search nya mas terima kasih

andres, 08 June 2018 14:28 - Reply

kalo misalnya dalam satu layar dibagi 2 ada header dan details, kok untuk view detailsnya error ya ? errornya seperti ini : DataTables warning: table id=table_details - Ajax error. For more information about this error, please see http://datatables.net/tn/7

MUKHAMMAD ARIFIN, 10 August 2018 19:04 - Reply

Halo gan fikri, utk join model serveside yang ini bagaimana ya? kalo melihat https://mfikri.com/artikel/crud-dengan-ignited-datatables-pada-codeigniter.html. rubah kerangaka banyak..

jerico, 18 August 2018 20:43 - Reply

Hallo Mas FIkri, mau nanya. itu yang di file model line 17 kok makenya private function ? kenapa tidak public aja mas? saya suka sedikit keliru tentang ini.

M Fikri, 04 January 2019 14:33 - Reply

Agar tidak bisa di akses diluar Class mas.

Fharhan Amrin, 15 February 2019 08:20 - Reply

Ijin kasih masukan pak,semua referensi bapa sudah keren",cuman mungkin penjelasan step" nya jelasin,kenapa di buat seperti itu? dll supaya newbie seperti saya bisa lebih paham,terimakasih pak

Lingga Fernando, 01 March 2019 17:29 - Reply

Cara membuat button edit dan delete gimana mas?

M Fikri, 08 March 2019 09:28 - Reply

Ini pengembangannya mas Lingga: https://mfikri.com/artikel/crud-dengan-ignited-datatables-pada-codeigniter.html

alfredo, 02 May 2019 11:06 - Reply

mas fikri saran saya buat buku saja yang lengkap untuk 1 proyek sebagai tutorial. saya pasti akan membeli dengan senang hati. salam, alfred

M Fikri, 06 May 2019 06:58 - Reply

Ok mas, makasih atas sarannya.

Leave a Comment