ตามเนื้อหาตอนที่แล้ว ที่เราได้เริ่มสร้างส่วนของระบบการจัดการเนื้อหาของ admin
โดยจำลองการล็อกอิน ผ่านฟังก์ชั่น login() และจำลองการล็อกเอาท์ผ่านฟังก์ชั่น logout()
อย่างง่ายไปแล้ว
ในตอนนี้เราจะมาศึกษาการกำหนด routing สำหรับจัดรูปแบบ URL ในการเรียกใช้งานให้มี
ความยืดหยุ่นเพิ่มขึ้นในระบบ admin โดยในระบบของเรา จะมีการเพิ่มส่วนของการจัดการสมาชิก
ผู้ดูแลระบบเข้ามา (ในตอนนี้จะเป็นแค่เพียงโครงสร้างก่อน ยังไม่ลงฐานข้อมูล)
หรือก็คือระบบจัดการสมาชิกของ admin โดยมีรูปแบบให้สามารถ เพิ่ม ลบ แก้ไข และแสดง
รายชื่อสมาชิกของผู้แลระบบได้
จากรูปแบบการกำหนด admin controller class จากตัวอย่างตอนที่แล้ว
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Admin extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); // เรียกใช้งาน session } public function index() { // ตรวจสอบตัวแปร session ที่เราจะสร้างและใช้เป็นเงื่อนไข if(!isset($_SESSION['ses_admin_id']) || $_SESSION['ses_admin_id']==""){ // ยังไม่ล็อกอิน // แสดงหน้าล็อกอินอย่างง่าย $data['title']="Admin Login"; $data['title_h1']="Page Admin Login"; $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_login',$data); $this->load->view('admin/admin_footer'); }else{ // แสดงหน้า admin อย่างง่ายเมื่อมีการล็อกอิน และสร้าง session $data['title']="Admin Home"; $data['title_h1']="Page Admin Home"; $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_home',$data); $this->load->view('admin/admin_footer'); } } // เมื่อทำการล็อกอิน public function login(){ // สมมติการล็อกอินสร้างตัวแปร session อย่างง่าย $_SESSION['ses_admin_id']=1; $_SESSION['ses_admin_name']="Admin"; redirect('admin'); // ไปหน้า admin } // เมื่อทำการล็อกเอาท์ public function logout(){ // สมมติล็อกเอาท์ ลบค่า session unset($_SESSION['ses_admin_id']); unset($_SESSION['ses_admin_name']); redirect('admin'); // ไปหน้า admin } }
จาก admin controller class บางส่วนของต้น
โดยทั่วไปรูปแบบ URL ที่เราเรียกใช้งาน จะเป็นดังนี้
http://localhost/learnci/class/function/id/
ตัวอย่างเช่น
http://localhost/learnci/admin หรือ http://localhost/learnci/admin/index
คำว่า admin คือชื่อ class ของ controller
index ก็คือฟังก์ชั่น
สังเกตว่า class ของ controller จะต้องประกอบด้วยฟังก์ชั่น index() เสมอ
จากโค้ด admin controller class ด้านบนจะเห็นว่า ฟังก์ชั่น index() ไม่มีการกำหนด parameter
เพิ่มเติม ดังนั้นค่า id ในรูปแบบ url จึงไม่มี รูปแบบก็จะเหลือเพียง
http://localhost/learnci/class/function/
ทีนี้เมื่อเราต้องการสร้างหน้าจัดการสมาชิกของผู้ดูแลระบบเพิ่มเข้ามา เราก็สามารถสร้าง
controllers class ขึ้นมาอีกได้เรื่อยๆ สมมติเช่น สร้างไฟล์ Admin_user.php
แบบนี้จะทำให้ URL ของระบบ admin จะได้เป็น
http://localhost/learnci/admin_user/index
แบบนี้เป็นต้น
แต่ที่จะแนะนำและลองทำไปพร้อมกันในที่นี้คือ เราจะใช้แค่ admin controller class เพียงอันเดียว
โดยจะให้รูปแบบ URL ในส่วนของระบบ admin เป็นดังนี้
http://localhost/learnci/admin/index/หน้าเพจ/การกระทำ/ค่า id
เช่น
// หน้าแสดงรายชื่อสมาชิกในระบบ admin http://localhost/learnci/admin/index/user // หน้าสำหรับแสดงฟอร์มสำหรับเพิ่มข้อมูล http://localhost/learnci/admin/index/user/create // หน้าสำหรับแสดงฟอร์มสำหรับแกไขข้อมูล http://localhost/learnci/admin/index/user/edit/1 // หน้าสำหรับทำงานคำสั่งลบข้อมูล http://localhost/learnci/admin/index/user/delete/1
สังเกตจาก URL ข้างต้น จำนวน parameter ที่มากสุดจะมีอยู่ 3 รายการคือ
- หน้าเพจ ที่ต้องการไปเรียกใช้งาน
- การกระทำ ตัวแปรสำหรับกำหนดการแสดงข้อมูลในหน้าไฟล์นั้นที่จะเรียกใช้
- ส่วนของค่า id ที่ต้องใช้ในการแก้ไขข้อมูล หรือลบข้อมูล
ให้เราแก้โค้ด admin controller ใหม่ดังนี้ เพื่อรองรับการส่งค่า parameter ในการเรียก
ใช้งานไฟล์ที่แสดง
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Admin extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); // เรียกใช้งาน session } public function index($admin_pages="home",$action=null,$id=null) { // ตรวจสอบตัวแปร session ที่เราจะสร้างและใช้เป็นเงื่อนไข if(!isset($_SESSION['ses_admin_id']) || $_SESSION['ses_admin_id']==""){ // ยังไม่ล็อกอิน // if(!$this->session->has_userdata('ses_admin_id') || $this->session->ses_admin_id==""){ // แสดงหน้าล็อกอินอย่างง่าย $data['title']="Admin Login"; $data['title_h1']="Page Admin Login"; $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_login',$data); $this->load->view('admin/admin_footer'); }else{ // แสดงหน้า admin อย่างง่ายเมื่อมีการล็อกอิน และสร้าง session $data['title']="Admin Home"; $data['title_h1']="Page Admin Home"; $data['action']=$action; $data['id']=$id; $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_'.$admin_pages,$data); $this->load->view('admin/admin_footer'); } } // เมื่อทำการล็อกอิน public function login(){ // สมมติการล็อกอินสร้างตัวแปร session อย่างง่าย // $_SESSION['ses_admin_id']=1; // $_SESSION['ses_admin_name']="Admin"; $newdata = array( 'ses_admin_id' =>1, 'ses_admin_name' => "Admin" ); $this->session->set_userdata($newdata); redirect('admin'); // ไปหน้า admin } // เมื่อทำการล็อกเอาท์ public function logout(){ // สมมติล็อกเอาท์ ลบค่า session // unset( // $_SESSION['ses_admin_id'], // $_SESSION['ses_admin_name'] // ); $array_items = array( 'ses_admin_id', 'ses_admin_name' ); $this->session->unset_userdata($array_items); redirect('admin'); // ไปหน้า admin } }
ให้เราสังเกตที่ฟังก์ชั่น index ใหม่ ที่มีการกำหนดให้รับค่า parameter อีก 3 รายการ
public function index($admin_pages="home",$action=null,$id=null)
โค้ดข้างต้น ถ้าไม่มีการกำหนด ค่า $admin_pages จะเท่ากับค่า home
ค่า $action และ $id จะเป็น null
เนื่องจากรูปแบบไฟล์ที่เรากำหนดใน admin เราจะใช้ในรุปแบบ นำหน้าไฟล์ด้วย admin_
ดังนั้นตัวแปร $admin_pages เราจึงระบุแค่ส่วนที่ขยายของไฟล์ เช่น ถ้าไฟล์
admin_user.php ค่าที่ส่งมาก็จะเป็น user แบบนี้เป็นต้น
เรามาดูในส่วนของการเรียกใช้งานไฟล์ แสดงผล
// แสดงหน้า admin อย่างง่ายเมื่อมีการล็อกอิน และสร้าง session $data['title']="Admin Home"; $data['title_h1']="Page Admin Home"; $data['action']=$action; $data['id']=$id; $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_'.$admin_pages,$data); $this->load->view('admin/admin_footer');
เรามีการส่งค่าตัวแปรจาก parameter เข้าไปในไฟล์ views ด้วยค่าต่อไป
$data['action']=$action; $data['id']=$id;
และส่วนของการเรียกใช้งานไฟล์แสดงผล เราจะใช้วิธีต่อค่าตัวแปร $admin_pages
สังเกตตามบรรทัดด้านล่าง
$this->load->view('admin/admin_'.$admin_pages,$data);
ถ้าไม่ได้กำหนดค่าตัวแปร $admin_pages เข้ามา ค่า $admin_pages ก็จะเป็น home
จากโค้ดจึงทำให้มีการไปเรียกไฟล์ admin_home.php มาแสดง
ในที่นี้เราต้องการให้ไปเรียกไฟล์ชื่อ admin_user.php โดยจะใช้คำว่า user
เป็น parameter ตัวแรก
ให้เราสร้างไฟล์ admin_user.php ไว้ในโฟลเดอร์ apps > views > admin >
โค้ดไฟล์ admin_user.php
<div class="container"> Admin User <br><br> <?php if($action==null){?> <a href="<?=base_url('admin/user/create')?>" class="btn btn-primary btn-sm">Create</a> <br><br> <table class="table table-striped table-bordered table-condensed"> <thead> <tr> <th width="50" class="text-center">#</th> <th>Name</th> <th width="150" class="text-center">Last Login</th> <th width="150" class="text-center">Manage</th> </tr> </thead> <tbody> <?php for($i=1;$i<=5;$i++){?> <tr> <td class="text-center"><?=$i?></td> <td>User <?=$i?></td> <td class="text-center"><?=date("Y-m-d H:i:s")?></td> <td class="text-center"> <a href="<?=base_url('admin/user/edit/'.$i)?>" class="btn btn-success btn-sm"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> </a> <a href="<?=base_url('admin/user/delete/'.$i)?>" class="btn btn-danger btn-sm"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </a> </td> </tr> <?php } ?> </tbody> </table> <?php } ?> <?php if($action=="create"){?> <a href="<?=base_url('admin/user')?>" class="btn btn-warning btn-sm">< Back</a> <br><br> <form action="<?=base_url('admin/user/create')?>" method="post"> <table class="table table-bordered"> <thead> <tr class="active"> <th colspan="2">Create User</th> </tr> </thead> <tbody> <tr > <th width="120">Username:</th> <td> <input type="text" name="username"> </td> </tr> <tr> <th width="120">Password:</th> <td> <input type="password" name="password" > </td> </tr> <tr> <th></th> <td> <input type="submit" class="btn btn-success btn-sm" name="btn_add" value="Add User"> </td> </tr> </tbody> </table> </form> <?php } ?> <?php if($action=="edit"){?> <a href="<?=base_url('admin/user')?>" class="btn btn-warning btn-sm">< Back</a> <br><br> <form action="<?=base_url('admin/user/edit/'.$id)?>" method="post"> <table class="table table-bordered"> <thead> <tr class="active"> <th colspan="2">Edit User</th> </tr> </thead> <tbody> <tr > <th width="120">Username:</th> <td> <input type="text" name="username"> </td> </tr> <tr> <th width="120">Password:</th> <td> <input type="password" name="password" > </td> </tr> <tr> <th></th> <td> <input type="submit" class="btn btn-success btn-sm" name="btn_add" value="Edit User"> </td> </tr> </tbody> </table> </form> <?php } ?> <?php if($action=="delete"){?> <a href="<?=base_url('admin/user')?>" class="btn btn-warning btn-sm">< Back</a> <br><br> <div class="bg-success text-center" style="padding:10px;"> <p class="text-success">Delete data complete</p> <a href="<?=base_url('admin/user')?>" class="text-success">< Back > </a> </div> <?php } ?> </div>
จากโค้ดข้างต้น จะเป็นการวางโครงร่างของรุปแบบไฟล์ admin_user.php ทั้งในส่วนของ
การแสดงรายการในตาราง ฟอร์มเพิ่ม แก้ไข และส่วนของการลบข้อมูล
ในการใช้งาน URL ต่างๆ ในไฟล์ จะเห็นว่าเรามีการตัดคำว่า index ออกเพื่อให้รูปแบบการใช้งาน
ดูเข้าใจง่าย ส่วนนี้เราจะกำหนดเพิ่มเติมใน routing
แต่ก่อนอื่นให้เราไปเพิ่มลิ้งค์เมนู จัดการสมาชิกผู้ดูแลระบบ เข้าไปในไฟล์ admin_header.php
ในโฟลเดอร์ apps > views > admin >
ดังนี้
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title><?=$title?></title> <link rel="stylesheet" href="<?=base_url('css/bootstrap-3.3.5/css/bootstrap.min.css')?>"> <script src="<?=base_url('js/jquery-1.11.3.min.js')?>"></script> <script src="<?=base_url('css/bootstrap-3.3.5/js/bootstrap.min.js')?>"></script> </head> <body> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="<?=base_url('admin')?>">Admin</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="<?=base_url('admin')?>">Home</a></li> <?php if(isset($_SESSION['ses_admin_id']) && $_SESSION['ses_admin_id']!=""){?> <li><a href="<?=base_url('admin/user')?>">User</a></li> <li><a href="<?=base_url('admin/logout')?>">Logout</a></li> <?php } ?> </ul> </div> </div> </nav>
จากโค้ดเราได้เพิ่มลิ้งค์สำหรับไปที่หน้า รายการสมาชิกของผู้ดูแลระบบ
<li><a href="<?=base_url('admin/user')?>">User</a></li>
การกำหนด Routing เพื่อจัดการ URL
เราจะกำหนด route ได้ที่ไฟล์ routes.php ในโฟลเดอร์ apps > config
ขอพิจารณาไปที่ละจุด ตามจำนวน parameter จากมากไปน้อย ดังนี้
// หน้าสำหรับทำงานคำสั่งลบข้อมูล http://localhost/learnci/admin/index/user/delete/1 // หน้าสำหรับแสดงฟอร์มสำหรับแกไขข้อมูล http://localhost/learnci/admin/index/user/edit/1
เราต้องการให้เป็น
http://localhost/learnci/admin/user/delete/1 http://localhost/learnci/admin/user/edit/1
จะได้เป็น
$route['admin/(:any)/(:any)/(:num)'] = 'admin/index/$1/$2/$3';
admin / ตามด้วยอะไรก็ได้ / ตามด้วยอะไรก็ได้ / ตามด้วยตัวเลข
admin / user / delete / 1
admin / user / edit / 1
// หน้าสำหรับแสดงฟอร์มสำหรับเพิ่มข้อมูล
http://localhost/learnci/admin/index/user/create
เราต้องการให้เป็น
http://localhost/learnci/admin/user/create
จะได้เป็น
$route['admin/(:any)/(:any)'] = 'admin/index/$1/$2';
admin / ตามด้วยอะไรก็ได้ / ตามด้วยอะไรก็ได้
admin / user / create
// หน้าแสดงรายชื่อสมาชิกในระบบ admin
http://localhost/learnci/admin/index/user
เราต้องการให้เป็น
http://localhost/learnci/admin/user
จะได้เป็น
$route['admin/(:any)'] = 'admin/index/$1';
admin / ตามด้วยอะไรก็ได้
admin / user
นอกจากนี้เรายังต้องกำหนดในส่วนของลิ้งค์สำหรับ login และ logout เพิ่ม
เพราะเมื่อเรา ใช้งาน
$route['admin/(:any)'] = 'admin/index/$1';
จะมีผลกับ
http://localhost/learnci/admin/login http://localhost/learnci/admin/logout
โดยให้เราเพิ่ม สองค่า route นี้เข้าไปด้วย
$route['admin/login'] = 'admin/login'; $route['admin/logout'] = 'admin/logout';
สุดท้ายจะได้ไฟล์เป็นดังนี้ (ขอตัดมาเฉพาะส่วนด้านล่างของโค้ดไฟล์ routes.php)
$route['admin/login'] = 'admin/login'; $route['admin/logout'] = 'admin/logout'; $route['admin/(:any)/(:any)/(:num)'] = 'admin/index/$1/$2/$3'; $route['admin/(:any)/(:any)'] = 'admin/index/$1/$2'; $route['admin/(:any)'] = 'admin/index/$1'; $route['home'] = 'home'; $route['aboutus'] = 'aboutus'; $route['service'] = 'service'; $route['contactus'] = 'contactus'; $route['default_controller'] = 'home'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE;
ทดสอบเรียกใช้งาน โดยเรียกผ่าน URL
http://localhost/learnci/admin โดยเมื่อทำการล็อกอินอย่างง่าย จะมีเมนู user เพิ่มเข้ามา