datatable server side dengan laravel datatable

kali ini kita akan membuat datatable server side dengan laravel datatable https://yajrabox.com/docs/laravel-datatables/master

berbeda dengan datatable biasa yang menampilkan semua baris data lalau membagi perhalaman di bagian frontednnya di serverside baris data sudah dapat di bagi perhalaman dari bagian backend jadi tidak memberatkan bagian frontend/pengguna,sangat berguna saat data yang di tampilkan ratusan bahkan ribuan

tentunya yang pertama kalian sudah menginstall laravelnya entah menggunakan laravel installer atau menggunakan composer https://laravel.com/docs/8.x/installation

jika menggunakan composer langsung

composer create-project laravel/laravel nama_project

jika menggunakan laravel installer

laravel new nama_project

ok jika sudah terinstall dan bisa di buka di browser selanjutnya kita install laravel datatablenya

kita akan menginstall satu paket dengan plugin laravel datatable lainnya

composer require yajra/laravel-datatables:^1.5

kemudian kita ubah config/app.php dan tambahkan provider untuk librarynya

'providers' => [
    // ...
    Yajra\DataTables\DataTablesServiceProvider::class,
    Yajra\DataTables\DataTablesServiceProvider::class,
    Yajra\DataTables\ButtonsServiceProvider::class,
],

lalu kita install plugin js untuk library datatablenya menggunakan npm

npm install datatables.net-bs4 datatables.net-buttons-bs4

jika kalian menggunakan boostrap kalian bisa menambahkan baris berikut di bagian bootsrap.js yang berada di dalam folder view/assets

require('bootstrap');
require('datatables.net-bs4');
require('datatables.net-buttons-bs4');

lalu untuk stylenya di app.scss

@import "~datatables.net-bs4/css/dataTables.bootstrap4.css";
@import "~datatables.net-buttons-bs4/css/buttons.bootstrap4.css";

langsung saja jalankan npm install dan npm run dev

jika kalian menggunakan versi laravel yang terbaru dan menggunakan tailwind css kalian bisa menggunakan link cdn dari datatablenya langsung di layout atau app.blade.php kalian

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.css">
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
<link rel="stylesheet" href="//cdn.datatables.net/1.10.23/css/jquery.dataTables.min.css">
<script src="{{ mix('js/app.js') }}"></script>
<script src="//cdn.datatables.net/1.10.23/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.23/js/dataTables.bootstrap4.min.js"></script>

lalu kita publish config dan assetnya

php artisan vendor:publish --tag=datatables
php artisan vendor:publish --tag=datatables-buttons

lanjutnya ke bagian controllernya

pertama buat class baru yang akan mengatur backend server side datatable kita

php artisan datatables:make NamaModels

kita akan menggunakan model

php artisan datatables:make Users

lalu jika berhasil maka akan terbuat file class dengan nama UsersDatatable di dalam folder app/Datatables

coba buka file tersebut dan perhatikan

bisa di lihat di dalamnya sudah langsung kode serta class-class lain yang di perlukan termasuk class model User berdasarkan penamaan kita tadi menggunakan nama Users

lanjut scroll kebawah di bagian fungsi getColumns()

kita bisa lihat kolom-kolom yang akan di tampilkan di table kita bisa menambahnya maupun menghapusnya

saya akan menambahkan kolom name dan email

kemudian buka controller kalian yang akan menampilkan view datatablenya misalnya UserController,di bagian fungsi indexnya akan kita rubah

public function index(UsersDataTable $dataTable)
    {
        return $dataTable->render('user.index');
    }

jangan lupa masukan class UsersDatatablenya juga

use App\DataTables\UsersDataTable;

lanjut ke bagian viewnya

<div class="table-responsive p-2">
                    {{$dataTable->table()}}
                </div>

kita juga memasukan script js dari variable $dataTablenya

jika kalian menggunakan laravel versi terbaru dan menggunakan livewire

<x-slot name="scripts">
        {{$dataTable->scripts()}}
    </x-slot>

jika menggunakan laravel blade biasanya kalian juga bisa menggunakan @stack yang ada di layout bladenya

misal @stack(‘scripts’) maka

@push('scripts')
        {{$dataTable->scripts()}}
    @endpush

ok sekarang coba buka halaman yang ada datatablenya

tampilannya kira kira akan seperti itu

seperti yang tadi saya maksud bahwa plugin-plugin untuk datatableny adalah tombol-tombol bawaan seperti create export hingga tombol print

untuk tombol exportnya ada pdf,csv,excel tapi untuk bisa menggunakannya kalian harus menginstall library lainnya lagi yaitu untuk pdf adalah https://github.com/barryvdh/laravel-snappy dan untuk excel adalah https://laravel-excel.com/

jika kalian tidak ingin menggunakan tombol-tombol tersebut atau hanya menggunakan beberapa kalian bisa mengeditnya di class UsersDataTabel di bagian fungsi html()

jika kalian tidak mau menggunakan tombolnya kalian bisa menghapus dari bagian dom dan buttonsnya

maka tampilannya akan seperti ini

kemudian jika kalian perhatikan ada kolom tambahan yaitu Action dengan isian users.action,secara default users.action merujuk ke file views yang akan di render namun jika tidak di temukan maka akan di anggap string biasany seperti namanya kolom Action bisa kita gunakan untuk menaruh tombol edit,detail,hapus dan lainnya

untuk itu kita bisa membuat view baru untuk user.action atau lainnya sama halnya dengan penamaan dan pemanggilan file view

mislanya saya akan menggunakan view user.action

lalu buka kembali class UsersDataTable-nya lalu ubah bagian fungsi dataTable()

perhatikan bagian addColumn(‘action’,’user.action’) untuk parameter pertama merupakan nama untuk kolom custom kita yang bernama kolom action kemudian parameter kedua merupakan nama/path dari views kita bisa di lihat tadi sata membuat viewnya di user/action.blade.php jadi pemanggilan viewnya adalah user.action

kembali ke file user/action.blade.php kita tambahkan beberapa tombolnya

<a href="{{ url('user/'.$id.'/edit') }}" class="btn btn-warning btn-sm">Edit {{ $name }}</a>

bisa kita lihat laravel datatable otomati akan mengubah setiap kolom menjadi masing-masing variable tersendiri kolom id akan tersedia sebagai variable $id begitu juga dengan kolom name akan tesedia variable dengan nama $name

maka jika kita buka lagi halamannya

kemudian bagaimana memdindahkan urutan halaman misal umumnya kita menaruh kolom action yang ada tombolnya di bagian kanan,kita bisa mengubah urutannya di class UserDataTable di bagian fungsi getColumns()

yang sebelumnya kolom action berada di sebelum id kita ubah menjadi sesudah kolom updated_at

kalian juga bisa mengatur urutan kolom lainya

kemudian kita akan mengganti kolom id dengan kolom no urut tentunya secara umum nomor urut tidak ada di database dan hanya tampil di table

buka kembali class UserDataTable lalu ubah di bagian dataTable() kita tambahkan kolom index yang berfungsi sebagai no urut

public function dataTable($query)
    {
        return datatables()
            ->eloquent($query)
            ->addColumn('action', 'user.action')
            ->addIndexColumn();//no urut
    }

lalu kita perlu menambahkan lagi di bagian getColumn() sama halnya dengan column action

protected function getColumns()
{
    return [
        Column::computed('DT_RowIndex')->title('No')->orderable(false)->searchable(false),//kolom no urut
        Column::make('id'),
        Column::make('name')->title("Nama Lengkap"),//memeberikan alias atau nama lain saat di tampilkan di tabel
        Column::make('email'),
        Column::make('created_at'),
        Column::make('updated_at'),
        Column::computed('action')
                ->exportable(false)
                ->printable(false)
                ->width(60)
                ->addClass('text-center'),
    ];
}

kolom index secara default bernama DT_RowIndex tentunya kita ingin menampilkan nama kolom yang jelas di tabel nanti jadi kita bisa menggunakan fungsi ->title() untuk memberikan nama atau alias kepada kolom terntentu misal disini kolom DT_RowIndex akan di tampilkan di table sebagai kolom No,title() jiga bisa digunakan di kolom lainnya misalnya kolom name menjadi nama lengkap

maka hasilnya akan seperti ini

Leave a comment