Kotchasan PHP Framework

[ตอนที่ 4] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลลงฐานข้อมูล

สำหรับในเรื่องของฟอร์มต่างๆ เช่นฟอร์มหน้าเพจ และ ฟอร์มเมนู แทบไม่มีอะไรต่างจากเดิม จะมีเปลี่ยนแปลงก็ส่วนข้อมูลบางรายการที่ออกแบบให้เหมาะสมกับฐานข้อมูลเท่านั้น ดังนั้นผมจะข้ามส่วนฟอร์มไป และจะไปอธิบายที่ส่วนรับค่าจากฟอร์มแทน
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 ธรรมดา

สำหรับในส่วนของเมนูก็มีการบันทึกคล้ายๆกันครับ ต่างกันนิดหน่อยที่วิธีการจัดการกับข้อมูล โดยที่เมื่อต้องการบันทึกข้อมูลเมนู ระบบจะ
  1. อ่านข้อมูลเมนูทั้งหมดออกมาก่อน
  2. ลบข้อมูลเมนูทั้งหมดออกจากฐานข้อมูล
  3. ทำการแก้ไขข้อมูลเมนูหรือเพิ่มข้อมูลเมนูใหม่
  4. เรียงลำดับเมนูใหม่ ไม่ให้ ID ของเมนูซ้ำกัน
  5. บันทึกข้อมูลเมนูกลับไปยังฐานข้อมูล
เป็นอันจบสิ้นกระบวนการเกี่ยวกับเมนูและหน้าเพจ ในส่วนที่ซ้ำกับเวิร์คช้อปก่อนหน้า ซึ่งในตอนต่อไปเราจะมาเพิ่มความสามารถของเวิร์คช้อปนี้ด้วยการสร้างโมดูลมาเสริมความสามารถ