การจัดการเมนูของ Admin Framework และโปรแกรมต่างๆที่สร้างจาก Admin Framework
มีคำถามเกี่ยวกับการสร้างและจัดการเมนูของโปรเจ็คต่างๆของ Kotchasan กันมาพอสมควร (ทุกโปรเจ็คที่ใช้ Admin Framework เป็นแกนของระบบจะมีลักษณะเดียวกัน เช่น SMS, OAS, Repair) ซึ่งในตัวอย่างนี้ผมจะอ้างอิงไปที่ Repair เป็นหลักนะครับ
เนื่องจาก Kotchasan เป็น MMVC ทำให้แต่ละโปรเจ็คแบ่งออกเป็นโมดูลแยกกันไป ซึ่งเราสามารถถอดออกหรือนำมารวมกันได้ ดังนั้นเมนูของแต่ละโมดูลจึงต้องถูกจัดการแยกต่างหากในแต่ละโมดูล (เมื่อโมดูลถูกลบ เมนูก็จะหายไปด้วย ทำนองเดียวกัน เมื่อมีการติดตั้งโมดูล เมนูของโมดูลก็จะแสดงผล)
เมนูหลัก หรือเมนูของส่วน Core ของ Admin Framework จะอยู่ที่ \Index\Menu\Model (modules/index/models/menu.php ใครไม่รู้ให้ไปอ่านคู่มือของคชสารก่อนนะครับ) โดยเมธอด getMenus จะถูกเรียกเพื่อคืนค่าของรายการเมนูในรูปแบบแอเรย์
เมนูหลักของคชสารรองรับเมนูสูงสุด 3 ชั้นครับ
home คือชื่อเมนู ถูกใช้เป็นคลาสของเมนู
text ข้อความแสดงบนเมนู
url คือลิงค์ของเมนูที่ต้องการเมือคลิกเมนู
เมนูรายการนี้คือเมนูปกติ ไม่มีเมนูย่อย สำหรับเมนูที่มีเมนูย่อยจะมี property submemu เพื่มมาเพื่อเก็บรายการเมนูย่อย
เมนู Users จะมี 2 เมนูย่อย คือ Member list และ Register และสามารถใส่เมนูย่อยเพิ่มเติมได้อีกชั้นหนึ่ง (ไม่มีในโค้ดตัวอย่าง)
เราสามารถนำรายการเมนูทั้งหมดใส่ลงในฐานข้อมูล หรือสามารถเขียนการตรวจสอบสิทธิเพื่อแยกเมนูของใครของมันเพิ่มเติมได้ ขึ้นกับการออกแบบของแต่ละคนเลย เพราะสุดท้ายแล้วโปรแกรมต้องการเพียงผลลัพท์ข้อมูลเมนูในรูปแบบแอเรย์เท่านั้น
เมนูของโมดูล จะอยู่ที่แต่ละโมดูล เช่น \Repair\Init\Controller (modules/repair/controllers/init.php) ซึ่งในที่นี้คือโมดูล Repair นั่นเอง เนื่องจากทุกครั้งที่มีการเรียกเว็บจะมีการเรียกไปยังเมธอด execute ของคลาส Init\Controller ของแต่ละโมดูล (ถ้ามี) เสมอ ซึ่งที่เมธอด execute เราสามารถเขียนคำสั่งเพื่อสร้างเมนูเพิมเติมได้ (หรือเขียนคำสั่งที่ต้องดำเนินการเมื่อมีการเรียกหน้าเว็บ)
คำสั่งชุดแรกเป็นการเตรียมเมนูย่อย ซึ่งจะมีรูปแบบเหมือนคำสั่งด้านบนครับ ต่างแค่สามารถเขียนได้แค่ส่วนเมนูย่อยเท่านั้น
คำสั่งถัดมาเป็นการเพิ่มเมนู Repair Jobs ชื่อ(หรือคลาสของเมนู) คือ repair เอาไว้ก่อนเมนู member โดยมีเมนูย่อยที่เตรียมไว้ที่ $submenus
คำสั่งชุดสุดท้ายเป็นการเพิ่มเมนูย่อยลงในเมนูบนสุดที่กำหนด (เมนู settings)
สำหรับรูปแบบคำสั่งเต็มๆให้ไปไล่ดูจากโค้ดนะครับ ผมจะไม่อธิบายในที่นี้
ทิปเล็กๆน้อย เราสามารถสร้างเมนูโดยเพิ่มเมนูที่ต้องการลงใน \Index\Menu\Model ตรงๆเลยก็ได้โดยไม่ต้องมาจัดการโดยโมดูล หากมั่นใจว่าโมดูลจะไม่ถูกถอดออกแน่ๆ เพราะจุดประสงค์ของการสร้างเมนูที่แต่ละโมดูลก็เพียงเพื่อการเพิ่มเมนูโดยอัตโนมัติเท่านั้น
เนื่องจาก Kotchasan เป็น MMVC ทำให้แต่ละโปรเจ็คแบ่งออกเป็นโมดูลแยกกันไป ซึ่งเราสามารถถอดออกหรือนำมารวมกันได้ ดังนั้นเมนูของแต่ละโมดูลจึงต้องถูกจัดการแยกต่างหากในแต่ละโมดูล (เมื่อโมดูลถูกลบ เมนูก็จะหายไปด้วย ทำนองเดียวกัน เมื่อมีการติดตั้งโมดูล เมนูของโมดูลก็จะแสดงผล)
เมนูหลัก หรือเมนูของส่วน Core ของ Admin Framework จะอยู่ที่ \Index\Menu\Model (modules/index/models/menu.php ใครไม่รู้ให้ไปอ่านคู่มือของคชสารก่อนนะครับ) โดยเมธอด getMenus จะถูกเรียกเพื่อคืนค่าของรายการเมนูในรูปแบบแอเรย์
/**
* รายการเมนู
*
* @param array $login
* @return array
*/
public static function getMenus($login)
{
$menus = array(
'home' => array(
'text' => 'หน้าหลัก',
'url' => 'index.php?module=home'
),
.........
'member' => array(
'text' => 'สมาชิก',
'submenus' => array(
array(
'text' => 'รายชื่อสมาชิก',
'url' => 'index.php?module=member'
),
array(
'text' => 'สมัครสมาชิก',
'url' => 'index.php?module=register'
)
),
),
.........
);
return $menus;
}
เมนูหลักของคชสารรองรับเมนูสูงสุด 3 ชั้นครับ
'home' => array(
'text' => 'หน้าหลัก',
'url' => 'index.php?module=home'
),
home คือชื่อเมนู ถูกใช้เป็นคลาสของเมนู
text ข้อความแสดงบนเมนู
url คือลิงค์ของเมนูที่ต้องการเมือคลิกเมนู
เมนูรายการนี้คือเมนูปกติ ไม่มีเมนูย่อย สำหรับเมนูที่มีเมนูย่อยจะมี property submemu เพื่มมาเพื่อเก็บรายการเมนูย่อย
'member' => array(
'text' => 'Users',
'submenus' => array(
array(
'text' => 'Member list',
'url' => 'index.php?module=member'
),
array(
'text' => 'Register',
'url' => 'index.php?module=register'
)
),
),
เมนู Users จะมี 2 เมนูย่อย คือ Member list และ Register และสามารถใส่เมนูย่อยเพิ่มเติมได้อีกชั้นหนึ่ง (ไม่มีในโค้ดตัวอย่าง)
เราสามารถนำรายการเมนูทั้งหมดใส่ลงในฐานข้อมูล หรือสามารถเขียนการตรวจสอบสิทธิเพื่อแยกเมนูของใครของมันเพิ่มเติมได้ ขึ้นกับการออกแบบของแต่ละคนเลย เพราะสุดท้ายแล้วโปรแกรมต้องการเพียงผลลัพท์ข้อมูลเมนูในรูปแบบแอเรย์เท่านั้น
เมนูของโมดูล จะอยู่ที่แต่ละโมดูล เช่น \Repair\Init\Controller (modules/repair/controllers/init.php) ซึ่งในที่นี้คือโมดูล Repair นั่นเอง เนื่องจากทุกครั้งที่มีการเรียกเว็บจะมีการเรียกไปยังเมธอด execute ของคลาส Init\Controller ของแต่ละโมดูล (ถ้ามี) เสมอ ซึ่งที่เมธอด execute เราสามารถเขียนคำสั่งเพื่อสร้างเมนูเพิมเติมได้ (หรือเขียนคำสั่งที่ต้องดำเนินการเมื่อมีการเรียกหน้าเว็บ)
$submenus = array();
if (Login::checkPermission($login, 'can_received_repair')) {
$submenus[] = array(
'text' => 'Get a repair',
'url' => 'index.php?module=repair-receive'
);
}
$submenus[] = array(
'text' => 'Repair list',
'url' => 'index.php?module=repair-setup'
);
คำสั่งชุดแรกเป็นการเตรียมเมนูย่อย ซึ่งจะมีรูปแบบเหมือนคำสั่งด้านบนครับ ต่างแค่สามารถเขียนได้แค่ส่วนเมนูย่อยเท่านั้น
// repair module
$menu->addTopLvlMenu('repair', 'Repair Jobs', null, $submenus, 'member');
คำสั่งถัดมาเป็นการเพิ่มเมนู Repair Jobs ชื่อ(หรือคลาสของเมนู) คือ repair เอาไว้ก่อนเมนู member โดยมีเมนูย่อยที่เตรียมไว้ที่ $submenus
// ตั้งค่าโมดูล
$menu->add('settings', 'Repair settings', 'index.php?module=repair-settings');
foreach (Language::get('REPAIR_CATEGORIES') as $key => $value) {
$menu->add('settings', $value, 'index.php?module=repair-category&typ='.$key);
}
คำสั่งชุดสุดท้ายเป็นการเพิ่มเมนูย่อยลงในเมนูบนสุดที่กำหนด (เมนู settings)
สำหรับรูปแบบคำสั่งเต็มๆให้ไปไล่ดูจากโค้ดนะครับ ผมจะไม่อธิบายในที่นี้
ทิปเล็กๆน้อย เราสามารถสร้างเมนูโดยเพิ่มเมนูที่ต้องการลงใน \Index\Menu\Model ตรงๆเลยก็ได้โดยไม่ต้องมาจัดการโดยโมดูล หากมั่นใจว่าโมดูลจะไม่ถูกถอดออกแน่ๆ เพราะจุดประสงค์ของการสร้างเมนูที่แต่ละโมดูลก็เพียงเพื่อการเพิ่มเมนูโดยอัตโนมัติเท่านั้น