คู่มือการใช้งาน Admin Framework by Kotchasan ตอนที่ 2
โมดูลของ Admin Framework มีโครงสร้างคร่าวๆดังนี้ (ตัวอย่างนี้แสดงถึงโครงสร้างของโมดูล demo เพียงอย่างเดียว ส่วนโมดูลอื่นๆก็มีลักษณะเดียวกัน)
อย่างที่ผมได้บอกไว้ตั้งแต่ตอนก่อนหน้าว่า จาก URL ที่เรียก Admin Framework จะทำการเรียกไปยัง Controller ของโมดูลนั้นๆ แต่จะเป็น Controller ใดก็แล้วแต่ URL ที่ส่งมา ซึ่งนี่เป็นข้อดีที่เราไม่ต้องพะวงกับการจัดการกับ Router เหมือนในเฟรมเวอร์คอื่นๆ การเพิ่มหน้าหรือโมดูลทำได้ง่ายๆแค่การสร้าง Controller มารองรับเท่านั้น
Controller ของ Admin Framework จะต้องสืบทอดมาจาก Gcms\Controller เท่านั้น ดูตัวอย่าง Demo\Table\Controller
ถ้ายังจำได้ Controller นี้จะถูกเรียกใช้ผ่าน URL index.php?module=demo-table และถ้าได้สังเกตุให้ดี Controller แต่ละตัวจะมีโค้ดที่คล้ายๆกันแทบทั้งหมด
ขั้นตอนการทำงานของ Controller ตามด้านบนเป็นดังนี้
หน้าที่หลักของ Controller คือการตรวจสอบสิทธิ์การใช้งานหน้านี้ หากมีสิทธิ์สมบูรณ์ก็จะไปโหลด View มาแสดง หรือหากไม่มีสิทธิ์ (หรือค่าที่ส่งมาไม่ถูกต้อง) ก็จะส่งไปทำงานที่ Index\Error\Controller นอกจากนั้นใน Controller ยังได้ใส่การสร้างส่วน Header ไว้ใน Controller เพื่อให้โค้ดใน View มีแต่โค้ดส่วนที่เป็นตาราง หรือในกรณีของฟอร์มก็จะมีแต่เพียงโค้ดสำหรับสร้างฟอร์มเท่านั้น
ข้อกำหนดของ Admin Framework กำหนดให้ Controller จะผูกกับ View และ Model ที่ชื่อเดียวกัน เช่น Demo\Table\Controller จะไปเรียกใช้ View ชื่อ Demo\Table\View และหากมีการเชื่อมต่อกับฐานข้อมูล ก็จะมีการเรียกใช้ผ่าน Demo\Table\Model (เป็นข้อกำหนดเบื้องต้นเพื่อให้สามารถทำความเข้าใจกับโมดูลได้ง่ายเท่านั้น ในทางปฏิบัติสามารถเขียนได้ตามแนวทางของ MVC)
View จะต้องสืบทอดมาจาก Gcms\View เท่านั้น ดังตัวอย่าง Demo\Table\View (ผมแสดงเฉพาะโครงสร้างของคลาสนะครับ)
ใน View ก็จะเป็นคำสั่งสำหรับสร้างเนื้อหาต่างๆของหน้า ซึ่งผลลัพท์สุดท้ายคือคำสั่ง HTML ส่งกลับไปยัง Controller นั่นเอง
- modules/
- demo/
- controllers/
- models/
- views/
- script.js ไฟล์ Javascript ที่ใช้ภายในโมดูล ไม่มีไม่ต้องสร้าง
- style.css ไฟล์ CSS ที่ใช้ภายในโมดูล ถ้าไม่ต้องกำหนดก็ไม่ต้องสร้างก็ได้เช่นกัน
- demo/
อย่างที่ผมได้บอกไว้ตั้งแต่ตอนก่อนหน้าว่า จาก URL ที่เรียก Admin Framework จะทำการเรียกไปยัง Controller ของโมดูลนั้นๆ แต่จะเป็น Controller ใดก็แล้วแต่ URL ที่ส่งมา ซึ่งนี่เป็นข้อดีที่เราไม่ต้องพะวงกับการจัดการกับ Router เหมือนในเฟรมเวอร์คอื่นๆ การเพิ่มหน้าหรือโมดูลทำได้ง่ายๆแค่การสร้าง Controller มารองรับเท่านั้น
Controller ของ Admin Framework จะต้องสืบทอดมาจาก Gcms\Controller เท่านั้น ดูตัวอย่าง Demo\Table\Controller
<?php
/**
* @filesource modules/demo/controllers/table.php
* @link http://www.kotchasan.com/
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*/
namespace Demo\Table;
use \Kotchasan\Http\Request;
use \Kotchasan\Html;
use \Gcms\Login;
/**
* module=demo-table
*
* @author Goragod Wiriya <admin@goragod.com>
*
* @since 1.0
*/
class Controller extends \Gcms\Controller
{
/**
* Controller สำหรับคัดเลือกหน้าของโมดูล demo
*
* @param Request $request
* @return string
*/
public function render(Request $request)
{
// ข้อความ title bar
$this->title = 'Data Table';
// เลือกเมนู
$this->menu = 'demo';
// ตรวจสอบ premission (can_config)
if ($login = Login::checkPermission(Login::isMember(), 'can_config')) {
// แสดงผล
$section = Html::create('section');
// breadcrumbs
$breadcrumbs = $section->add('div', array(
'class' => 'breadcrumbs'
));
$ul = $breadcrumbs->add('ul');
$ul->appendChild('<li><span class="icon-home">หน้าหลัก</span></li>');
$section->add('header', array(
'innerHTML' => '<h2 class="icon-table">'.$this->title.'</h2>'
));
// แสดงตาราง
$section->appendChild(createClass('Demo\Table\View')->render($request));
return $section->render();
}
// 404.html
return \Index\Error\Controller::page404();
}
}
ถ้ายังจำได้ Controller นี้จะถูกเรียกใช้ผ่าน URL index.php?module=demo-table และถ้าได้สังเกตุให้ดี Controller แต่ละตัวจะมีโค้ดที่คล้ายๆกันแทบทั้งหมด
ขั้นตอนการทำงานของ Controller ตามด้านบนเป็นดังนี้
- กำหนดข้อความใน title ที่ $this->title
- เลือกเมนูที่จะ highlight ที่ $this->menu ซึ่งปกติการ highlight เมนูจะทำที่เมนูระดับบนสุดเท่านั้น เนื่องจากหากทำ hightlight เมนูย่อยก็จะมองไม่เห็นอยู่ดี สำหรับค่าที่ส่งให้กับเมนูนี่ก็จะอยู่ที่ค่าคีย์ของแอเรย์ระดับบนสุดในตัวแปร $menus ใน Index\Menu\Model หรือสามารถดูได้จากคลาสของเมนู
- ตรวจสอบสิทธิ์ด้วยคำสั่ง Login::checkPermission ถ้าไม่ได้รับสิทธิ์ให้ดูหน้านี้ ก็จะแสดงข้อความแจ้งเตือนโดยส่งการทำงานไปที่ \Index\Error\Controller::page404(); แทน
- หากการตรวจสอบสิทธิ์เรียบร้อย ขั้นตอนต่อไปก็จะเริ่มต้นแสดงผลโมดูลโดยการสร้างส่วนหัว (header) ของหน้า ซึ่งประกอบด้วยหัวข้อ (h2) และ Breadcrumbs (ul+li)
- ถัดจากนี้ก็จะเป็นการโหลด View ที่ต้องการ และส่งค่ากลับเป็น HTML ไปยัง Controller ที่เรียกมาอีกที
หน้าที่หลักของ Controller คือการตรวจสอบสิทธิ์การใช้งานหน้านี้ หากมีสิทธิ์สมบูรณ์ก็จะไปโหลด View มาแสดง หรือหากไม่มีสิทธิ์ (หรือค่าที่ส่งมาไม่ถูกต้อง) ก็จะส่งไปทำงานที่ Index\Error\Controller นอกจากนั้นใน Controller ยังได้ใส่การสร้างส่วน Header ไว้ใน Controller เพื่อให้โค้ดใน View มีแต่โค้ดส่วนที่เป็นตาราง หรือในกรณีของฟอร์มก็จะมีแต่เพียงโค้ดสำหรับสร้างฟอร์มเท่านั้น
ข้อกำหนดของ Admin Framework กำหนดให้ Controller จะผูกกับ View และ Model ที่ชื่อเดียวกัน เช่น Demo\Table\Controller จะไปเรียกใช้ View ชื่อ Demo\Table\View และหากมีการเชื่อมต่อกับฐานข้อมูล ก็จะมีการเรียกใช้ผ่าน Demo\Table\Model (เป็นข้อกำหนดเบื้องต้นเพื่อให้สามารถทำความเข้าใจกับโมดูลได้ง่ายเท่านั้น ในทางปฏิบัติสามารถเขียนได้ตามแนวทางของ MVC)
View จะต้องสืบทอดมาจาก Gcms\View เท่านั้น ดังตัวอย่าง Demo\Table\View (ผมแสดงเฉพาะโครงสร้างของคลาสนะครับ)
<?php
/**
* @filesource modules/demo/views/table.php
* @link http://www.kotchasan.com/
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*/
namespace Demo\Table;
use \Kotchasan\Http\Request;
/**
* module=demo-table
*
* @author Goragod Wiriya <admin@goragod.com>
*
* @since 1.0
*/
class View extends \Gcms\View
{
/**
* แสดงตาราง
*
* @param Request $request
* @return string
*/
public function render(Request $request)
{
....
// คืนค่า HTML
return .....;
}
}
ใน View ก็จะเป็นคำสั่งสำหรับสร้างเนื้อหาต่างๆของหน้า ซึ่งผลลัพท์สุดท้ายคือคำสั่ง HTML ส่งกลับไปยัง Controller นั่นเอง