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:
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!
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.