[ตอนที่ 4] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลลงฐานข้อมูล
สำหรับในเรื่องของฟอร์มต่างๆ เช่นฟอร์มหน้าเพจ และ ฟอร์มเมนู แทบไม่มีอะไรต่างจากเดิม จะมีเปลี่ยนแปลงก็ส่วนข้อมูลบางรายการที่ออกแบบให้เหมาะสมกับฐานข้อมูลเท่านั้น ดังนั้นผมจะข้ามส่วนฟอร์มไป และจะไปอธิบายที่ส่วนรับค่าจากฟอร์มแทน
กระบวนการรับค่าจากฟอร์มก็ไม่ได้แตกต่างจากวิธีการรับค่าในเวิร์คช้อปก่อนหน้านัก โดยมีการเปลี่ยนชื่อเมธอดสำหรับรับค่าจากฟอร์มเป็น update เนื่องจาก เมธอดนี้อยู่ในคลาสที่สืบถอดมาจาก Recordset และ save() เป็นเมธอดหนึ่งของ Recordset อยู่แล้ว ทำให้เราไม่สามารถใช้ชื่อ save เหมือนเดิมได้
โค้ดส่วนอื่นๆ ของเมธอดนี้ก็แทบไม่แตกต่างกัน จะมาเริ่มแตกต่างกันก็ตรงที่จะเก็บค่าลงฐานข้อมูลนี่แหละ
เมธอด insert() และ update() เป็นเมธอดหนึ่งของ CRUD (Create Read Update Delete) ของฐานข้อมูล ซึ่งผมเลือกใช้วิธีนี้เพราะต้องการแสดงให้เห็นว่าเราสามารถเลือกใช้วิธีที่เหมาะสมในการจัดการกับฐานข้อมูลได้ ไม่จำเป็นต้องเจาะจงไปที่วิธีใดวิธีหนึ่ง ซึ่งทั้ง QueryBuilder และ Recordset ต่างก็สามารถ insert และ update ได้เหมือนกันทั้งหมด
ข้อสังเกตุอย่างหนึ่งของการใช้ CRUD ก็คือ เราจะไม่สามารถระบุชื่อของตารางตรงๆให้กับ method ได้ แต่เราจะต้องแปลงชื่อย่อของตาราง (แบบที่ส่งให้กับ QueryBuilder ได้) ให้เป็นชื่อตารางแบบเต็มๆก่อนด้วย $model->getTableName() เนื่องจากตัว CRUD จะกระทำกับพารามิเตอร์ที่ส่งให้เหมือนการเขียนคำสั่งด้วย PHP ธรรมดา
สำหรับในส่วนของเมนูก็มีการบันทึกคล้ายๆกันครับ ต่างกันนิดหน่อยที่วิธีการจัดการกับข้อมูล โดยที่เมื่อต้องการบันทึกข้อมูลเมนู ระบบจะ
public function update(Request $request)
{
// session, token, member
if ($request->initSession() && $request->isSafe() && Login::isMember()) {
// รับค่าจากการ POST
$save = array(
'module' => $request->post('write_module')->username(),
'topic' => $request->post('write_topic')->topic(),
'detail' => $request->post('write_detail')->detail()
);
// รายการที่แก้ไข 0 รายการใหม่
$id = $request->post('write_id')->toInt();
// ตรวจสอบค่าที่ส่งมา
$ret = array();
if ($id > 0) {
// ตรวจสอบรายการที่แก้ไข
$index = self::get($id);
}
if ($id > 0 && !$index) {
$ret['alert'] = 'ไม่พบข้อมูลที่แก้ไข กรุณารีเฟรช';
} elseif ($save['module'] == '') {
$ret['alert'] = 'กรุณากรอก โมดูล';
$ret['input'] = 'write_module';
} elseif ($save['topic'] == '') {
$ret['alert'] = 'กรุณากรอก หัวข้อ';
$ret['input'] = 'write_topic';
} else {
// เรียกใช้งาน Model
$model = new \Kotchasan\Model;
// บันทึก
if ($id == 0) {
// ใหม่
$model->db()->insert($model->getTableName('site'), $save);
} else {
// แก้ไข
$model->db()->update($model->getTableName('site'), $id, $save);
}
// เคลียร์ Token
$request->removeToken();
// คืนค่า
$ret['alert'] = 'บันทึกเรียบร้อย';
$ret['location'] = 'index.php?module=pages';
}
// คืนค่าเป็น JSON
echo json_encode($ret);
}
}
กระบวนการรับค่าจากฟอร์มก็ไม่ได้แตกต่างจากวิธีการรับค่าในเวิร์คช้อปก่อนหน้านัก โดยมีการเปลี่ยนชื่อเมธอดสำหรับรับค่าจากฟอร์มเป็น update เนื่องจาก เมธอดนี้อยู่ในคลาสที่สืบถอดมาจาก Recordset และ save() เป็นเมธอดหนึ่งของ Recordset อยู่แล้ว ทำให้เราไม่สามารถใช้ชื่อ save เหมือนเดิมได้
โค้ดส่วนอื่นๆ ของเมธอดนี้ก็แทบไม่แตกต่างกัน จะมาเริ่มแตกต่างกันก็ตรงที่จะเก็บค่าลงฐานข้อมูลนี่แหละ
// เรียกใช้งาน Model
$model = new \Kotchasan\Model;
// บันทึก
if ($id == 0) {
// ใหม่
$model->db()->insert($model->getTableName('site'), $save);
} else {
// แก้ไข
$model->db()->update($model->getTableName('site'), $id, $save);
}
เมธอด insert() และ update() เป็นเมธอดหนึ่งของ CRUD (Create Read Update Delete) ของฐานข้อมูล ซึ่งผมเลือกใช้วิธีนี้เพราะต้องการแสดงให้เห็นว่าเราสามารถเลือกใช้วิธีที่เหมาะสมในการจัดการกับฐานข้อมูลได้ ไม่จำเป็นต้องเจาะจงไปที่วิธีใดวิธีหนึ่ง ซึ่งทั้ง QueryBuilder และ Recordset ต่างก็สามารถ insert และ update ได้เหมือนกันทั้งหมด
ข้อสังเกตุอย่างหนึ่งของการใช้ CRUD ก็คือ เราจะไม่สามารถระบุชื่อของตารางตรงๆให้กับ method ได้ แต่เราจะต้องแปลงชื่อย่อของตาราง (แบบที่ส่งให้กับ QueryBuilder ได้) ให้เป็นชื่อตารางแบบเต็มๆก่อนด้วย $model->getTableName() เนื่องจากตัว CRUD จะกระทำกับพารามิเตอร์ที่ส่งให้เหมือนการเขียนคำสั่งด้วย PHP ธรรมดา
สำหรับในส่วนของเมนูก็มีการบันทึกคล้ายๆกันครับ ต่างกันนิดหน่อยที่วิธีการจัดการกับข้อมูล โดยที่เมื่อต้องการบันทึกข้อมูลเมนู ระบบจะ
- อ่านข้อมูลเมนูทั้งหมดออกมาก่อน
- ลบข้อมูลเมนูทั้งหมดออกจากฐานข้อมูล
- ทำการแก้ไขข้อมูลเมนูหรือเพิ่มข้อมูลเมนูใหม่
- เรียงลำดับเมนูใหม่ ไม่ให้ ID ของเมนูซ้ำกัน
- บันทึกข้อมูลเมนูกลับไปยังฐานข้อมูล