การทำในส่วนโค้ดของ Server-side ของ DataTables นั้นจะใช้ภาษาอะไรก็ได้ แต่ในตัวอย่างในโค้ดของเคนจะเป็นภาษา PHP และใช้อยู่ใน Codeigniter 3 นะ เพราะเคนใช้อันนี้เป็น Framework หลัก
HTML
ในส่วนนี้จะไม่ต้องทำอะไรมาก แค่สร้าง Table ใส่ Class ใส่ Id และกำหนดแค่ส่วน thead แค่นี้ก็โอเคแล้ว
<table class="table table-bordered table-hover" id="js_datatable">
<thead>
<tr>
<th style="width: 40px;" class="text-center">ไอดี</th>
<th>ชื่อ</th>
<th style="width: 150px;" class="text-center">วันที่</th>
<th style="width: 100px;" class="text-center">สถานะ</th>
</tr>
</thead>
</table>
Javascript
ส่วนนี้เคนใช้ร่วมกับ jQuery นะ ถ้าใครใช้ Javascript เพียวๆ ก็เอาไปแปลงเอานะ แล้วก็ทำการ import datatables.js , datatables.css ให้เรียบร้อยก่อนนะ
$(document).ready(function() {
$('#js_datatable').DataTable({
responsive: true,
processing: true,
serverSide: true,
pageLength: 10, // ต้องการหน้าละกี่รายการ กำหนดเอาเลย
ajax: {
url: "/home/get_datatables_data", // กำหนด URL ที่ต้องการยิง Ajax ไปทำการเรียกข้อมูล
type: 'POST',
// ข้อมูลที่ส่งกลับมาจะมีชื่อในอาเรย์ตามนี้ dataid, name, date, status
},
columns: [ // กำหนดข้อมูลที่ส่งกลับมาว่าจะไปลงที่ td column ไหน โดยจะเรียงจากอันแรกไปจนถึงอันท้ายเหมือนตอนเราสร้าง Table tr td ลงข้อมูลปกติ
{ data: 'dataid' },
{ data: 'name' },
{ data: 'date' },
{ data: 'status' },
],
});
})
PHP – Codeigniter 3
อันนี้จะเป็นฟังก์ชั่นไว้ทดสอบเท่านั้น โดยการรับค่าพื้นฐานที่ DataTables ส่งมา เช่น start, length, search และทำการสร้างอาเรย์ข้อมูลแล้วส่งกลับเป็น JSON โดยส่วนที่ต้องส่งกลับจริงๆ มี 3 ตัวคือ iTotalDisplayRecords, iTotalRecords, data
โดยตัว data จะทำการส่งกลับเป็นข้อมูลตามจำนวนเรคคอร์ดต่อหน้านะ เช่น เรามีข้อมูล 500 รายการ ถ้าเราแสดงแต่ละหน้า หน้าละ 50 รายการ ข้อมูลใน data ต้องทำการส่งกลับแค่เพียง 50 รายการ ใส่ในอาเรย์เริ่มตั้งแต่ตัวที่ 0 – 49 โดยที่ถ้าเราส่งกลับหมดเลยทั้ง 500 รายการมันจะเอาไปโปะหน้าเดียว 500 รายการเลย
หากต้องการส่งกลับทีเดียว 500 รายการ แล้วต้องการให้ DataTables ไปจัดการเอาเองให้ไปดูเพิ่มเติมที่ส่วนของ Client-side แทน มันทำได้เช่นกันเพราะลองแล้ว แต่พอข้อมูลเยอะมากๆๆๆๆ การทำ Server-side ตัดส่งไปทีละนิด จะดีกว่า
class Home extends CI_Controller
{
public function get_datatables_data()
{
$post = $this->input->post();
$start_record = $post['start'];
$per_page = $post['length'];
$search = $post['search'];
$items = [];
for ($i = 0; $i < $per_page; $i++) {
$items[$i]['dataid'] = ($i + $start_record + 1);
$items[$i]['name'] = 'item :' . ($i + $start_record + 1);
$items[$i]['date'] = '2020-06-17 08:05:00';
$items[$i]['status'] = 'Normal';
}
$count_all_items = 1000; // จำนวนข้อมูลสูงสุดที่เรามี ในส่วนนี้ปกติก็ num_rows() เอาจากฐานข้อมูลนะ แต่อันนี้กำหนดเอาดื้อๆ เลยว่ามี 1000 มันจะเอาจำนวนนี้ไปคำนวณว่าจะมีกี่หน้า
$response = array(
"iTotalDisplayRecords" => $count_all_items,
"iTotalRecords" => $count_all_items,
"data" => $items,
);
echo json_encode($response);
}
}
