Konfigurasi Datatables
Sebelum kita melanjutkan latihan praktik membuat datatable dengan use case spesifik. Kita akan memepelajari terlebih dahulu konfigurasi yang tersedia untuk package yajra/laravel-datatables
Konfigurasi tersebut terdapat pada config/datatables.php.
Pencarian / Search
Konfigurasi search mengatur tentang perilaku pencarian pada datatable yang kita pakai.
smart
Konfigurasi pertama pada kelompok konfigurasi pencarian adalah smart, konfigurasi ini mengatur apakah keyword yang dimasukkan pada input pencarian di datatable akan dikelilingi dengan % seperti ini LIKE "%keyword%".
Tentu kamu paham kan, perbedaan jika menggunakan % dan tidak. Sebagai pengingat, pada SQL, pencarian dengan perintah LIKE keyword akan mencari row yang memiliki cell bernilai seperti keyword, mirip seperti = meskipun berbeda, tapi secara garis besar keduanya mirip.
Sementara jika keyword dikelilingi % % seperti ini LIKE "%keyword%"" maka pencarian akan dilakukan terhadap row dengan cell yang mengandung keyword tidak peduli di depan, di tengah atau di belakang posisi keyword tersebut.
Untuk mengaktifkan smart kamu cukup biarkan saja konfigurasi seperti bawaan yaitu bernilai true, jika ingin menonaktifkan mode smart maka kamu ubah nilai konfigurasinya menjadi false.
multi_term
Konfigurasi berikutnya adalah multi term, apabila bernilai true maka kata kunci pencarian akan dipecah dan digunakan sebagai keyword tersendiri bukan satu kesatuan.
Misalnya jika kita mencari nama Muhammad Azamuddin, maka datatable akan memecah menjadi dua kata kunci yaitu Muhammad dan Azamuddin, sehingga setiap User di database dengan kata yang mengandung Muhammad atau Azamuddin akan masuk ke hasil pencarian.
Sementara jika kita ubah nilai konfigurasi multi term ini menjadi false maka kata kunci Muhammad Azamuddin akan diperlaukan sebagai satu kata kunci dan tentu hasilnya adalah users yang memiliki nama mengandung Muhammad Azamuddin, sedangkan Muhammad Ilzam atau Azamuddin Kahfi tidak masuk hasil pencarian.
case_insensitive
Konfigurasi ini sangat jelas ya, jika bernilai true maka kata kunci pencarian pada DataTable akan diperlakukan secara case insenstive alias tidak peduli kapitalisasi hurufnya, yakni kata kunci Muhammad Azamuddin dianggap sama saja dengan muhammad azamuddin.
Sementara jika kita ubah menjadi false, maka kedua kata kunci tadi dianggap kata kunci yang berbeda.
use_wildcards
Secara bawaan nilai dari konfigurasi ini adalah false, jika dijadikan true maka kata kunci akan disisipkan karakter wildcard (%) pada setiap karakter kata kunci misalnya Muhammad Azamuddin akan menjadi %M%u%h%a%m%m%a%d% %A%z%a%m%u%d%d%i%n% pada SQL pencariannya.
starts_with
Konfigurasi terakhir pada kelompok konfigurasi pencarian adalah starts_with, nilai bawaan dari konfigurasi ini adalah false. Jika kita ubah menjadi true, maka datatable akan melakukan pencarian keyword pada bagian awal setiap cell yang dicari. Alias menggunakan SQL semacam ini keyword%
nulls_last_sql
Merupakan konfigurasi untuk mengatur perintah SQL yang digunakan untuk mensortir pada kolom agar nilai NULL ditampilkan paling akhir. Kenapa diperlukan konfigurasi ini? Karena perintah yang digunakan tergantung database engine yang kita gunakan.
Nilai bawaan dari konfigurasi ini adalah untuk database Postgres atau Oracle yaitu:
:column :direction NULLS LASTJika kamu menggunakan MySQL silahkan ubah nilainya menjadi seperti ini:
CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :directionerror
Konfigurasi ini kita gunakan untuk menentukan pesan error yang akan diberikan yang terkait dengan package yajra/laravel-datatables. Ada 3 nilai yang bisa kita berikan yaitu:
- null
- 'throw'
- pesan custom
Secara bawaan nilai dari konfigurasi ini adalah null.
Untuk mengubah nilai konfigurasi ini, kamu bisa mengubah langsung pada file config/datatables.php atau dengan mengubah pada file .env dengan key DATATABLES_ERROR, hal ini karena secara bawaan konfigurasi ini membaca dari file .env terlihat dari kode env('DATATABLES_ERROR', null)
Berikut adalah penjelasan masing-masing nilai yang bisa kita pilih.
null
Jika kita menggunakan nilai null maka pesan asli terkait error akan ditampilkan misalnya seperti ini:
{
"draw": 24,
"recordsTotal": 200,
"recordsFiltered": 0,
"data": [],
"error": "Exception Message:\n\nSQLSTATE[42S22]: Column not found: 1054 Unknown column 'xxx' in 'order clause' (SQL: select * from `users` where `users`.`deleted_at` is null order by `xxx` asc limit 10 offset 0)"
}'throw'
Jika kita menggunakan nilai 'throw' maka package akan melemparkan Exception yaitu \Yajra\DataTables\Exception. Kemudian kita bisa menangani kesalahan Exception tersebut pada app/Exceptions/Handler.php seperti ini:
Pada method render di file app/Exceptions/Handler.php kita mengecek terlebih dahulu apakah $exception berasal dari \Yajra\DataTables\Exception, jika iya maka tangani dengan kode berikut:
return response([
'draw' => 0,
'recordsTotal' => 0,
'recordsFiltered' => 0,
'data' => [],
'error' => 'Laravel Error Handler',
]);Sehingga file tersebut menjadi seperti ini:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Throwable $exception)
{
if ($exception instanceof \Yajra\DataTables\Exception) {
return response([
'draw' => 0,
'recordsTotal' => 0,
'recordsFiltered' => 0,
'data' => [],
'error' => 'Terjadi kesalahan terkait datatable',
]);
}
return parent::render($request, $exception);
}Pesan Custom
Untuk menggunakan pesan custom kita cukup gunakan String pesan yang kita inginkan misalnya "Terjadi kesalahan terkait datatables", kita juga bisa menggunakan key pada penerjemahan misalnya datatables.error (dengan asumsi kamu sudah memiliki key tersebut)
Contoh response dengan pesan custom
{
"draw": 24,
"recordsTotal": 200,
"recordsFiltered": 0,
"data": [],
"error": "Terjadi kesalahan terkait datatables"
}Columns / Kolom
Kelompok konfiguarsi kolom mengatur bagaimana perilaku kolom pada DataTable yang kita gunakan.
excess
Konfigurasi ini berbentuk Array yang memiliki nilai bawaan yaitu ['rn', 'row_num'].
Item yang berada pada Array di atas adalah nama dari kolom yang ingin disembunyikan dari DataTable. Jika ingin menambahkan kolom lain maka kita cukup tambahkan item pada Array tersebut misalnya menjadi ['rn', 'row_num', 'internal_id']
escape
Konfigurasi ini juga bertipe Array yang menentukan kolom mana saja yang akan dilakukan escape sehingga aman dari serangan XSS. Nilai bawaannya adalah * yang artinya semua kolom dilakukan escaping.
Jika ada kolom yang ingin kita non aktifkan escape ini maka kita ganti nilainya dari * menjadi misalnya ['free_column']
Untuk menonaktifkan pada semua kolom maka kita gunakan Array kosong seperti ini []
raw
Konfigurasi ini berisi kolom yang diizinkan untuk berisi HTML dan merender konten HTML tersebut. Secara bawaan bernilai ['action'] yang berarti kolom action diizinkan untuk memuat HTML dan merendernya.
Kita bisa menambahkan kolom lain jika diperlukan, tapi perlu diingat bahwa menambahkan kolom di sini itu berarti kita membuka diri terhadap serangan XSS untuk kolom tersebut.
blacklist
Konfigurasi ini digunakan untuk melarang kolom untuk dicari pada pencarian ataupun dilakukan sortir.
Secara bawaan nilainya adalah ['password', 'remember_token'] yang berarti kolom password dan remember_token tidak akan bisa dilakukan pencarian maupun sortir pada DataTable.
whitelist
Merupakan kebalikan dari blacklist, hanya kolom yang terdaftar di sini yang bisa dilakukan pencarian / sortir.
Nilai bawaan dari konfigurasi ini adalah * yang artinya semua kolom bisa dilakukan pencarian maupun sortir, kecuali yang didaftarkan pada konfigurasi blacklist
Konfigurasi Lainnya
Konfigurasi yang tidak dijelaskan di atas kami kelompokkan pada Konfigurasi Lainnya karena konfigurasi ini mungkin tidak akan teman-teman gunakan, namun untuk pengetahuan tetap kami sebutkan di sini.
json
Terdapat dua konfigurasi pada kelompok konfigurasi json yaitu header dan option, konfigurasi ini digunakan untuk melakukan setting terhadap response header dan options.
index_column
Untuk mengubah nama internal column index yang digunakan oleh DataTable, nilai bawaanya adalah DT_RowIndex.
engines
Berisi mapping builder yang tersedia pada DataTable, kita bisa menambahkan builder custom jika mau. Nilai bawaanya adalah seperti berikut:
'engines' => [
'eloquent' => Yajra\DataTables\EloquentDataTable::class,
'query' => Yajra\DataTables\QueryDataTable::class,
'collection' => Yajra\DataTables\CollectionDataTable::class,
'resource' => Yajra\DataTables\ApiResourceDataTable::class,
],builders
Berisi builder yang diterima oleh DataTable dan diteruskan melalui mapping pada konfigurasi engines.