หมวดหมู่: jQuery

DataTables: แสดงเลขที่รายการDataTables: แสดงเลขที่รายการ

เมื่อมีข้อมูลจำนวนมาก โดยที่ไม่ได้แสดง primary key หรือข้อมูลมาจากการ join ข้อมูลหลาย ๆ ตาราง การอ้างอิงแถวในตารางก็จะทำไม่สะดวก เดิมจะใช้วิธี query โดยใช้ :rownum หรือ row_number ให้แสดงแถวของข้อมูลตาม database ที่ใช้ แต่ข้อเสียก็คือ มันจะเพิ่มภาระให้ฐานข้อมูล ซึ่งจริง ๆ แล้วสามารถผลักภาระส่วนนี้ไปให้ทางฝั่ง client ได้

<!doctype html>
<html>

<head>
 <meta charset="utf-8">
 <meta name="author" content="Pitt Phunsanit">
 <title>DataTables: row number</title>
 <link href="../vendor/twbs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css">
 <link href="../vendor/twbs/bootstrap/dist/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css">
 <link href="../vendor/datatables/datatables/media/css/dataTables.bootstrap.min.css" rel="stylesheet" type="text/css">
</head>

<body>
 <table class="table table-bordered table-hover table-striped" id="tableA" width="100%"></table>
 <script src="../vendor/components/jquery/jquery.min.js"></script>
 <script src="../vendor/datatables/datatables/media/js/jquery.dataTables.min.js"></script>
 <script src="../vendor/datatables/datatables/media/js/dataTables.bootstrap.min.js"></script>
 <script src="row_number.js"></script>
</body>

</html>

$ (function () {

 tableA = $ ('#tableA') ;

 datatable = tableA.DataTable ({
 "ajax": {
 "data": function (parameters) {},
 "method": "POST",
 "url": "data.json.php",
 },
 "columns": [{
 "orderable": false,
 "render": function render (data, type, row, meta) {
 var row_number = (parseInt (meta.settings._iDisplayStart) + parseInt (meta.row) + 1) ;
 return String (row_number) .replace (/ (\d) (?= (\d{3})) /g, '$1,') ;;
 },
 "searchable": false,
 "targets": 0,
 "title": "No.",
 },
 {
 "orderable": false,
 "render": function (data, type, row, meta) {
 return parseInt (meta.row) + parseInt (meta.settings._iDisplayStart) + 1;
 },
 "title": 'No.',
 "width": "10px",
 },
 {
 "orderable": false,
 "render": function (data, type, row, meta) {
 return '<input type="checkbox" value="' + row.DISTRICT_CODE + '">';
 },
 "title": '<input class="checkAll" type="checkbox">',
 "width": "10px",
 },
 {
 "orderable": false,
 "render": function (data, type, row, meta) {
 if (row.enable == '1') {
 return '<span class="glyphicon glyphicon-ok"></span>';
 } else {
 return '<span class="glyphicon glyphicon-remove"></span>';
 }
 },
 "title": "Enable",
 "width": "10px",
 }, {
 "data": "DISTRICT_CODE",
 "title": "District Code",
 "width": "90px",
 }, {
 "data": "DISTRICT_NAME",
 "title": "District Name",
 }, {
 "data": "PROVINCE_NAME",
 "title": "Province Name",
 }
 ],
 /* default sort */
 "order": [
 [3, "asc"],
 [4, "asc"],
 ],
 "processing": true,
 "serverSide": true,
 "stateSave": true,
 }) ;

 $ ('.checkAll', tableA) .click (function () {
 $ ('input:checkbox', tableA) .not (this) .prop ('checked', this.checked) ;
 }) ;

}) ;

<?php
/* https://datatables.net/manual/server-side */

$output = [
 'data' => [],
 'debug' => [
 'length' => $_REQUEST['length'],
 'post' => $_REQUEST,
 'sqlCount' => '',
 'sqlResult' => '',
 'start' => $_REQUEST['start'],
 ],
 'draw' => $_REQUEST['draw'],
 'recordsFiltered' => $_REQUEST['length'],
 'recordsTotal' => 0,
];

$dns = new PDO ('mysql:host=localhost;dbname=snippets', 'root', '', [
 //PDO::ATTR_EMULATE_PREPARES => false,
 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
]) ;

$condition = [];
$from = ' FROM district AS d LEFT JOIN province AS p ON d.PROVINCE_ID = p.PROVINCE_ID';
$parameters = [];
$where = '';

if (isset ($_REQUEST['filters']) || isset ($_REQUEST['search']['value'])) {

 if (isset ($_REQUEST['search']['value'])) {
 if ($_REQUEST['search']['value'] != '') {

 $parameter = ':d_DISTRICT_NAME';

 $parameters[$parameter] = '%' . $_REQUEST['search']['value'] . '%';
 array_push ($condition, 'd.DISTRICT_NAME LIKE ' . $parameter) ;
 }
 }

 if (isset ($_REQUEST['filters'])) {
 foreach ($_REQUEST['filters'] as $tableAlias => $filter) {
 foreach ($filter as $field => $value) {
 if ($value != '') {
 $parameter = ':' . $tableAlias . '_' . $field;

 $parameters[$parameter] = '%' . $value . '%';
 array_push ($condition, $tableAlias . '.' . $field . ' LIKE ' . $parameter) ;
 }
 }
 }
 }

}

if (isset ($_REQUEST['geo_id']) && $_REQUEST['geo_id'] != '') {
 $parameter = ':d_geo_id';

 $parameters[$parameter] = $_REQUEST['geo_id'];
 array_push ($condition, 'd.GEO_ID = ' . $parameter) ;
}

if (count ($parameters)) {
 $where = ' WHERE ' . implode ("\n\t AND ", $condition) ;
}

if (isset ($_REQUEST['order']) && isset ($_REQUEST['order'][0])) {
 $columns = [
 0 => 'DISTRICT_NAME',
 3 => 'DISTRICT_CODE',
 4 => 'DISTRICT_NAME',
 5 => 'PROVINCE_NAME',
 ];

 $order = ' ORDER BY ' . $columns[$_REQUEST['order'][0]['column']] . ' ' . strtoupper ($_REQUEST['order'][0]['dir']) ;
} else {
 $order = ' ORDER BY DISTRICT_NAME ASC';
}

$output['debug']['parameters'] = $parameters;

/* Total records, before filtering */
$sql = 'SELECT COUNT (d.DISTRICT_ID) ' . $from;
try {
 $output['debug']['sqlCount'] = $sql;
 $stmt = $dns->prepare ($sql) ;
 $stmt->execute ($parameters) ;
 $output['recordsTotal'] = (int) $stmt->fetchColumn (0) ;
} catch (PDOException $e) {
 exit ($e->getMessage ()) ;
}

/* Total records, after filtering */
$sql = 'SELECT COUNT (d.DISTRICT_ID) ' . $from . $where;
try {
 $output['debug']['sqlCount'] = $sql;
 $stmt = $dns->prepare ($sql) ;
 $stmt->execute ($parameters) ;
 $output['recordsFiltered'] = (int) $stmt->fetchColumn (0) ;
} catch (PDOException $e) {
 exit ($e->getMessage ()) ;
}

/* data */
if ($output['recordsTotal'] > 0) {
 $sql = 'SELECT d.enable, d.DISTRICT_ID, d.DISTRICT_CODE, d.DISTRICT_NAME, p.PROVINCE_NAME' . $from . $where . $order . " LIMIT " . $_REQUEST['start'] . ", " . $_REQUEST['length'] . ";";

 try {
 $output['debug']['sqlResult'] = $sql;
 $stmt = $dns->prepare ($sql) ;
 $stmt->execute ($parameters) ;
 $output['data'] = $stmt->fetchAll (PDO::FETCH_ASSOC) ;
 } catch (PDOException $e) {
 exit ($e->getMessage ()) ;
 }
}

/* unset debug for security */
unset ($output['debug']) ;

header ('Content-type: application/json; charset=utf-8') ;
echo json_encode ($output) ;