Element - Table Element

Introduction

Element Table digunakan untuk mempresentasikan ui table

Table Options

setPagingList
setLabelNoData
setDatabaseResolver
setActionHeaderLabel
setScrollX
setScrollY
setActionLocation
setDomain
setInfoText
setColReorder
setFixedColumn
setFixedHeader
setTableStriped
setTableBordered
setWidgetTitle
setDom
setCustomColumnHeader
setResponsive
setShowHeader
setTbodyId
setHeaderNoLineBreak
setOption
setAjax
setAjaxMethod
setApplyDataTable
setDisplayLength

setDisplayLength menampilkan jumlah default data ditampilkan per halaman, jika tidak di set maka secara default ditampilkan 10 data per halaman

$app = c::app();
$table = $app->addTable();
$table->setDisplayLength(5);    // menampilkan jumlah data per halaman
$table->addColumn('role')->setLabel('Role');
$table ...
return $app;

Table Data

setDataFromArray

setDataFromArray melakukan pengisian data ke datatable secara langsung dari array method setDataFromArray tidak direkomendasikan jika data array sangat banyak

$app = c::app();
$table = $app->addTable();
$table->setDataFromArray([
    [
        'role'=>'Developer',
        'username'=>'albert',
        'name'=>'Albert',
    ],
    [
        'role'=>'QA',
        'username'=>'adam',
        'name'=>'Adam',
    ],
]);
$table->addColumn('role')->setLabel('Role');
$table->addColumn('username')->setLabel('Username');
$table->addColumn('name')->setLabel('Nama');
return $app;
setDataFromQuery

Table dapat diisi dengan data langsung dari perintah sql command.

$app = c::app();
$table $app->addTable();
$q = 'select u.*, r.name as role_name
    from users as u inner join roles as r on r.role_id=u.role_id
    where u.status>0
';
$table->setDataFromQuery($q);
$table->addColumn('role_name')->setLabel('Role');
$table->addColumn('username')->setLabel('Username');
$table->addColumn('name')->setLabel('Nama');
return $app;
setDataFromModel
$app = c::app();
$table $app->addTable();
$table->setDataFromModel(CModel_App_User::class,function(CModel_Query $q){
    //$q->with(['role']); agar role di load secara eager loading saat iterasi table
    $q->with(['role']);
});
$table->addColumn('role.name')->setLabel('Role');
$table->addColumn('username')->setLabel('Username');
$table->addColumn('name')->setLabel('Role');
return $app;

Koneksi yang digunakan pada table adalah sesuai koneksi default pada config database.php

Column Callback

$table->addColumn('request')->setLabel('Request')->setCallback(function ($row, $value) {
    return CElement_Component_ShowMore::factory()->addClass('whitespace-pre')->add(json_encode(json_decode($value, true), JSON_PRETTY_PRINT));
});

Translations/Label

Secara default translation dapat dicopy dari path {DOCROOT}system/i18n/en_US/element/datatable.php setelah dicopy ke path yang sesuai pada application maka labels otomatis dapat di overwrite dengan yang baru

Key language sama dengan key javascript datatables yang dapat dilihat pada documentation datatable

Data Table Language Documentation



Contoh isi file translation:

<?php

return  [
    'emptyTable' => 'No data available in table',
    'info' => 'Showing _START_ to _END_ of _TOTAL_ entries',
    'infoEmpty' => 'Showing 0 to 0 of 0 entries',
    'infoFiltered' => '(filtered from _MAX_ total entries)',
    'infoThousands' => ',',
    'lengthMenu' => 'Show _MENU_ entries',
    'loadingRecords' => 'Loading...',
    'processing' => 'Processing...',
    'search' => 'Search',
    'zeroRecords' => 'No matching records found',
    'thousands' => ',',
    'paginate' => [
        'first' => 'First',
        'last' => 'Last',
        'next' => 'Next',
        'previous' => 'Previous'
    ],
    // ...
]

Row Actions

Contoh kode untuk ubah label sesuai condition:

$table->addRowAction()->withRowCallback(function ($element, $row) {
    $isActive = carr::get($row, 'is_active');
    $element->setIcon($isActive ? 'ti ti-close' : 'ti ti-check')
        ->setLabel($isActive ? 'Non Aktifkan' : 'Aktifkan')
        ->setLink(c::url('url/toactivate/or/nonactivate/customer/{customer_id}'));
});

Contoh kode untuk hide / show action saat kondisi tertentu

$table->addRowAction()->withRowCallback(function ($element, $row) {
    $isLocked = carr::get($row, 'is_locked');
    if (!$isLocked) {
        $element->setVisibility(true);
        $element->setIcon('ti ti-trash')
            ->setLabel('Delete')
            ->setConfirm(true)
            ->setLink(c::url('url/todelete/{something_id}'));
    } else {
        $element->setVisibility(false);
    }
});