การจัดการเมนูของ 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 จะถูกเรียกเพื่อคืนค่าของรายการเมนูในรูปแบบแอเรย์
  /**
   * รายการเมนู
   *
   * @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 ตรงๆเลยก็ได้โดยไม่ต้องมาจัดการโดยโมดูล หากมั่นใจว่าโมดูลจะไม่ถูกถอดออกแน่ๆ เพราะจุดประสงค์ของการสร้างเมนูที่แต่ละโมดูลก็เพียงเพื่อการเพิ่มเมนูโดยอัตโนมัติเท่านั้น
0SHAREFacebookLINE it!