สวัสดีครับ
คือผมอยากได้โค้ดตัวอย่าง CRUD (create, read, update, delete) อย่างเรียบง่าย แล้วนำข้อมูลไปแสดงผลเป็นตาราง HTML ธรรมดา พอดีได้ลองศึกษาทำเองแล้ว (แบบมั่วๆ) ไม่รู้ว่ามีความถูกต้องแค่ไหนยังจับจุดไม่ค่อยถูก คำถามคือ:
- controller ดึงข้อมูลจาก model แล้วส่งข้อมูลไปกำหนดการแสดงผลให้ View เพื่อส่งต่อไปแสดงอีกทีใน Template ผมเข้าคอนเซปนี้ถูกต้องหรือป่าวคับ?
- ผมยังสับสนหน้าที่ของ View คำถามคือพวก HTML และ CSS ไปสร้างที่ไหนครับ? มันมีความเยื่อมโยงกันยัง...
อยากได้เพื่อเป็นแนวทางในการศึกษาต่อไปครับ และได้ศึกษา gcms 11 แล้ว ระบบมันใหญ่และซับซ้อนเริ่มต้นไม่ถูกครับ
ขอบคุณครับ
กรกฎ วิริยะ 19 ส.ค. 2559 10:52
ปกติแล้วการเรียกใช้ MVC จะเป็นการเรียกไปยัง Controller เป็นอันดับแรกครับ ซึ่งที่ Controller เราจะเขียนคำสั่งทุกอย่างที่นี่เป็นหลักครับ โดยที่
1. เมื่อต้องการข้อมูล เราจะไปเรียกข้อมูลจากฐานข้อมูล
2.เมื่อต้องการแสดงผล เราก็จะไปเรียก View เพื่อจัดการการแสดงผล

Model จะทำหน้าที่ในการ query ข้อมูลออกมาครับ เราจะเขียน crud ที่นี่แหละ โดยให้ผลลัพท์เป็นข้อมูล
View สำหรับ Kotchasan มันทำหน้าที่เป็น Template Engine ด้วย โดยจะมีฟังก์ชั่นจัดการ Template ที่นี่ เราสามารถ แสดงหน้าเว็บที่ View เลยก็ได้ (ด้วยการ echo) หรือจะส่งกลับไปยัง Controller เพื่อจัดการแสดงผลด้วย Response อีกทีก็ได้

ส่วน HTML และ CSS ตลอดจน JS ของ Kotchasan มีการจัดการที่ง่ายมากๆเลยครับ โดยแนวคิดก็คือ ใช้ HTML CSS และ JS เหมือนการเขียนเว็บไซต์ปกติครับ (คือ include ลงในเว็บตรงๆ)

ผมแนะนำให้ดูตัวอย่าง https://github.com/...ontrollers/index.php ประกอบนะครับ เพราะมันจะมีการเรียกใช้ระบบที่กล่าวถึงทั้งหมดอย่างง่ายๆ
กรกฎ วิริยะ 19 ส.ค. 2559 10:56
    // ตัวแปรป้องกันการเรียกหน้าเพจโดยตรง
    define('MAIN_INIT', __FILE__);
    // check login
    $request->initSession();
    // ตรวจสอบการ login
    Login::create();
    // กำหนด skin ให้กับ template
    Template::init('admin');
    // backend
    $view = new \Kotchasan\View;

การกระทำต่างๆก็ตามคำอธิบายเลยครับ
Template::init('admin'); คือเป็นการบอกว่าจะเลือกใช้ template ชื่อ admin https://github.com/...ter/admin/skin/admin
กรกฎ วิริยะ 19 ส.ค. 2559 10:59
    if ($login = Login::isMember()) {
      // Controller หลัก
      $main = new \Index\Main\Controller;
      $bodyclass = 'mainpage';
    } else {

โค้ดด้านบนคือ มันจะเรียกไปยัง \Index\Main\Controller ถ้ามีการ login แล้ว
 // forgot or login
      if ($request->request('action')->toString() === 'forgot') {
        $main = new \Index\Forgot\Controller;
      } else {
        $main = new \Index\Login\Controller;
      }
      $bodyclass = 'loginpage';

หรือ ถ้ายังไม่ได้ login ก็จะเรียก ไปยังหน้า login หรือ forgot
กรกฎ วิริยะ 19 ส.ค. 2559 11:02
    // เนื้อหา
    $view->setContents(array(
      // main template
      '/{MAIN}/' => $main->execute($request),
      // title
      '/อยากได้โค้ดตัวอย่าง CRUD อย่างเรียบง่าย/' => $main->title(),
      // class สำหรับ body
      '/fullwidth/' => $bodyclass
    ));
    if ($login) {
      // โหลดเมนู
      $menu = new \Index\Menu\Controller;
      $view->setContents(array(
        // ID สมาชิก
        '/{LOGINID}/' => $login['id'],
        // ชื่อ นามสกุล
        '/{LOGINNAME}/' => empty($login['name']) ? $login['username'] : $login['name'],
        // ไอคอนสมาชิก
        '/{USERICON}/' => WEB_URL.(is_file(ROOT_PATH.self::$cfg->usericon_folder.$login['id'].'.jpg') ? self::$cfg->usericon_folder.$login['id'].'.jpg' : 'skin/img/noicon.jpg'),
        // สถานะสมาชิก
        '/{STATUS}/' => $login['status'],
        // เมนู
        '/{MENUS}/' => $menu->getTopMenus($login['status'])
      ));
    }

โค้ดส่วนนี้ ก็จะเป็นการเอาเนื่อหาใส่ลงใน template ครับ ให้สังเกตุนะครับว่า เราจะแทนที่ข้อมูลต่างๆลงในตัวแปร {XXX} ซึ่งอยู่ใน template (ลองเปิด template index.html ดู)
กรกฎ วิริยะ 19 ส.ค. 2559 11:03
    // ส่งออก เป็น HTML
    $response = new Response;
    $response->withContent($view->renderHTML())->send();

สุดท้ายคือเป็นการแสดงผลโดยใช้ Response ครับ
กรกฎ วิริยะ 19 ส.ค. 2559 11:26
    $model = new \Kotchasan\Model;
$result = $model->db()->customQuery('SELECT * FROM `table_name` WHERE `status`=2 LIMIT 1');
var_dump($result);

ส่วนการใช้งาน CRUD แบบ ง่ายที่สุดก็ตามด้านบนเลยครับ เป็นการ query ข้อมูลด้วย SQL command ตรงๆ สามารถทำได้ทุกอย่างเลยครับ (สามารถเรียกใช้ที่ไหนก็ได้ ไม่ว่าจะเป็นใน Model, Controller หรือ View)
กรกฎ วิริยะ 19 ส.ค. 2559 11:30
    $model = new \Kotchasan\Model;
$result = $model->db()->select('table_name', array('id', 1), array(), 1);
var_dump($result);

READ ครับ
SELECT * FROM `table_name` WHERE `id`=1 LIMIT 1
กรกฎ วิริยะ 19 ส.ค. 2559 11:32
    $model = new \Kotchasan\Model;
$model->db()->update('table_name', array('id', 1), array(
'email' => 'admin@demo.com',
'password' => 'xxxxx',
'status' => 2
));

UPDATE ครับ ตรง array('id', 1) สามารถใส่ค่าได้หลายรูปแบบครับ เช่น ถ้าใส่เป็นตัวเลข 1 จะได้ผลลัพท์เป็น WHERE id=1 (เหมือนกับการใช้ array('id', 1))
UPDATE `table_name` SET (`email`='admin@demo.com',`password`='xxxxx',`status`=2) WHERE `id`=1 LIMIT 1
กรกฎ วิริยะ 19 ส.ค. 2559 11:36
$model = new \Kotchasan\Model;
$new_id = $model->db()->insert('table_name', array(
'email' => 'admin@demo.com',
'password' => 'xxxxx',
'status' => 2
));

CREATE ครับ แบบนี้จะปลอดภัยหน่อย เพราะมีการใช้ความสามารถของ PDO ในการกรองข้อมูล
INSERT INTO `table_name` (`email`,`password`,`status`) VALUES ('admin@demo.com','xxxxx',2)
กรกฎ วิริยะ 21 ส.ค. 2559 00:26
$model = new \Kotchasan\Model;
$model->db()->delete('table_name', array('id', 1));

DELETE
DELETE FROM `table_name` WHERE `id`=1

โพสต์ตอบกลับ

กรุณาตรวจสอบให้ถูกต้องก่อนส่ง สามารถใช้ BBCode ได้
ประเภท jpg, jpeg, png, webp อัปโหลดรูปภาพหรือไม่ก็ได้