PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

ประยุกต์ routing จัดการ URL ร่วมกับ controllers สำหรับหน้าเว็บไซต์หลัก

26 September 2015 By


เนื้อหาต่อไปของโปรเจ็ค เราจะมาดูการจัดการเกี่ยวกับหน้าเว็บเพจต่างๆ ของเว็บไซต์
ของเรา ซึ่งตามเคยบอกมา เว็บไซต์ของเราจะประกอบไปด้วย 4 หน้าหลัก ได้แก่
หน้าแรก [home] หน้าเกี่ยวกับเรา [about us] หน้าบริการของเรา [service] และหน้า
ติดต่อเรา [contact us]  โดยรูปแบบจะคล้ายๆ กับการจัดการ routing ในระบบ admin
จากบทความ
 
การกำหนด routing เพิ่มเติม เพื่อจัดการ URL ในระบบ admin 
http://www.ninenik.com/content.php?arti_id=665 via @ninenik
 
ก่อนอื่นเรามาดูที่มาของแต่ละหน้า ของเว็บไซต์เรา จากบทความนี้กันก่อน
 
เขียน controller class และ view สร้างเว็บไซต์อย่างง่าย 
http://www.ninenik.com/content.php?arti_id=662 via @ninenik
 
จากบทความการสร้างเว็บไซต์อย่างง่าย เราจะพบว่า ในแต่ละหน้าเพจ เราจะ
มีการสร้าง controllers ไฟล์ขั้นมาทุกครั้ง สำหรับใช้กับหน้าเพจนั้นๆ เช่น
(ไฟล์ controllers อยู่ในโฟลเดอร์ apps > controllers)
Home.php  , Aboutus.php , Service.php และ Contactus.php
 
จากนั้นในแต่ละ controllers ไฟล์ ก็จะไปเรียกใช้งาน views แยกตามหน้าเพจนั้นอีกที
(ไฟล์ views สำหรับหน้าเพจเว็บไซต์ อยู่ในโฟลเดอร์ apps > views > pages
home.php , aboutus.php , service.php และ contactus.php
 
และการกำหนด routing ในไฟล์ routes.php ในโฟลเดอร์ apps > config
ก็จะแยกกำหนดแต่ละตัวอีกเช่นกัน ในลักษณะดังนี้
 
$route['home'] = 'home';  
$route['aboutus'] = 'aboutus';  
$route['service'] = 'service';  
$route['contactus'] = 'contactus';  
$route['default_controller'] = 'home';  
 
 
แต่ในเนื้อหาในตอนนี้ เราจะไม่ใช้วิธีแบบเดิม จะใช้เป็นกาาประยุกต์ โดยสิ่งที่เปลี่ยนแปลงคือ
เราจะใช้ controllers ไฟล์เพียงอันเดียว อย่างที่เคยทำในระบบ admin ที่มีแค่ไฟล์ Admin.php
เป็น controllers หลักอันเดียว แต่สำหรับหน้าเพจ เราจะใช้เป็นชื่อ Pages.php เป็น controllers
หลัก และอีกส่วนก็คือการกำหนด routing ในไฟล์ routes.php เราจะเกำหนดแบบประยุกต์ 
และรองรับการใช้งานทั้งภาษาไทยและอังกฤษ
 
 

การประยุกต์ controllers สำหรับหน้าเพจ

 
มาเริ่มในส่วนแรก เราสามารถลบไฟล์ 
Home.php  , Aboutus.php , Service.php และ Contactus.php ออกไปได้เลย
จากนั้นในเราสร้างไฟล์ Pages.php ในโฟลเดอร์ apps > controllers
โดยใช้รูปแบบโค้ดดังนี้
 
<?php  
defined('BASEPATH') OR exit('No direct script access allowed');  
  
class Pages extends CI_Controller {  
    
    public function __construct()
    {
            parent::__construct();
    }  
    
    public function index($web_pages="home",$action=null,$id=null)  
    {  
        $data['title'] = ucfirst($web_pages);  
        $data['title_h1'] = ucfirst($web_pages);  
        $data['action'] = $action;
        $data['id']=$id;
        $file_model=APPPATH.'/models/'.ucfirst($web_pages).'_model.php';  
        if(file_exists($file_model))  
        {  
            $this->load->model($web_pages.'_model');  
        }               
        $this->load->view('templates/header', $data);  
        $this->load->view('pages/'.$web_pages,$data);  
        $this->load->view('templates/footer');  
    }  
    
}
 
 
เป็นอันเสร็จในส่วนของไฟล์ controllers จะเห็นเราใช้รุปแบบคล้ายๆ กับการใช้งาน
ในระบบ admin แต่มีการปรับเปลี่ยนในส่วนของตัวแปรบางส่วน กับ path ของ models 
กรณีที่มีการใช้งาน models ให้เหมาะสม
 
 

ประยุกต์ routing ให้กับ url หน้าเพจ

 
ต่อไปเรามาดูในส่วนของการกำหนด และประยุกต์ routing ให้กับ url หน้าเพจ
เนื่องจากเรามีการใช้งาน controller เดียว คือ Pages ดังนั้นเวลาเรียกใช้งาน
โดยปกติก็จะได้เป็น
 
http://localhost/learnci/pages/index/
 
สมมติเราใช้ url ภาษาอังกฤษ สำหรับ หน้าเพจต่างเป็นดังนี้
home,aboutus,service และ contactus เราก็จะได้ url เพจเป็น
 
http://localhost/learnci/pages/index/home
http://localhost/learnci/pages/index/aboutus
http://localhost/learnci/pages/index/service
http://localhost/learnci/pages/index/contactus
 
ซึ่งเราคงไม่ต้องการใช้แบบนี้แน่ 
แต่วิธีแก้อย่างง่าย (ซึ่งเราจะไม่ใช้วิธีนี้ แต่จะให้ดูเป็นแนวทาง)
โดยเราสามารถกำหนด routing ในส่วนจัดการในไฟล์ routes.php ในโฟลเดอร์ apps > config
เป้นดังนี้
 
$route['home'] = 'pages/index/home';  
$route['aboutus'] = 'pages/index/aboutus';  
$route['service'] = 'pages/index/service';  
$route['contactus'] = 'pages/index/contactus';  
$route['default_controller'] = 'pages/index/home';  
 
เราก็จะสามารถเรียก url ในลักษณะเป็นดังนี้ได้
 
http://localhost/learnci/home
http://localhost/learnci/aboutus
http://localhost/learnci/service
http://localhost/learnci/contactus
 
แต่ถ้ากรณีเรามีเพจจำนวนมาก การกำหนดลักษณะนี้อาจจะไม่สะดวก และถ้า
เราต้องการประยุกต์ให้รองรับ url ภาษาไทยด้วย routes ก็คงยาวพอสมควร
เราจะใช้วิธีการชื่อแบบ array ทั้ง ภาษาไทยและ ภาษาอังกฤษ แต่ให้ความสำคัญ
กับการกำหนดชื่อภาษาอังกฤษ เพราะจะมีส่วนเข้าไปเกี่ยวกับข้อง กับการกำหนด 
ชื่อไฟล์ของ models และ views ในระบบ
 
โดยเราจะกำหนดเป็นดังนี้
 
$toMap = array(
    'home','aboutus', 'service','contactus'
);
$toMapTH = array(
    'หน้าแรก','เกี่ยวกับเรา', 'บริการของเรา','ติดต่อเรา'
);
if(isset($_SERVER['PATH_INFO'])){
    $rpath = trim($_SERVER['PATH_INFO'],'/');

    foreach ($toMap as $k => $map) {
        if(strpos($rpath, $map) === 0) {
            $route[$map] = 'pages/index/'.$map;
            $route[$map.'/(:any)'] = 'pages/index/'.$map.'/$1';
            $route[$map.'/(:any/(:any))'] = 'pages/index/'.$map.'/$1/$2';
            $route[$map.'/(:any/(:any)/(:num))'] = 'pages/index/'.$map.'/$1/$2/$3';
        }
    }
    foreach ($toMapTH as $k => $map) {
        if(strpos($rpath, $map) === 0) {
            $route[$map] = 'pages/index/'.$toMap[$k];
            $route[$map.'/(:any)'] = 'pages/index/'.$toMap[$k].'/$1';
            $route[$map.'/(:any/(:any))'] = 'pages/index/'.$toMap[$k].'/$1/$2';
            $route[$map.'/(:any/(:any)/(:num))'] = 'pages/index/'.$toMap[$k].'/$1/$2/$3';
        }
    }
}
 
หลักการคือเช็ค path ปัจจุบัน แล้ววันลูป array ค่าที่เรากำหนด ค้นหาว่ามีค่านั้น
ตรงหรืออยู่ใน url path นั้นๆ หรือไม่ถ้ามี ก็ให้สร้าง route ขึ้นมา จากตัวอย่าง เราได้
กำหนดให้สร้าง route ให้รองรับภาษาไทย และมีการเพิ่มให้สามารถรับ parameter เพิ่ม
เข้ามีอีกถึง 3 ตัว  แต่จำไว้ว่า ชื่อภาษาอังกฤษที่เราใช้ จะเป็นชื่อที่เราจะใช้ใน models และ
views ตัวอย่างเช่น
home ใน models ในโฟลเดอร์ apps > models เราจะใช้เป็น Home_model.php
home ใน views ในโฟลเดอร์ apps > views > pages เราจะใช้เป็น home.php
แบบนี้เป็นต้น
 
และจากการกำหนด routes ข้างต้นเราจะได้ url คร่าวๆ ทั้งหมดเป็นดังนี้
 
http://localhost/learnci/home
http://localhost/learnci/aboutus
http://localhost/learnci/service
http://localhost/learnci/contactus
http://localhost/learnci/หน้าแรก
http://localhost/learnci/เกี่ยวกับเรา
http://localhost/learnci/บริการของเรา
http://localhost/learnci/ติดต่อเรา
 

โค้ดไฟล์ routes.php ในโฟลเดอร์ apps > config 

 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$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['admin/login'] = 'admin/login';
$route['admin/logout'] = 'admin/logout';

$toMap = array(
    'home','aboutus', 'service','contactus'
);
$toMapTH = array(
    'หน้าแรก','เกี่ยวกับเรา', 'บริการของเรา','ติดต่อเรา'
);
if(isset($_SERVER['PATH_INFO'])){
    $rpath = trim($_SERVER['PATH_INFO'],'/');

    foreach ($toMap as $k => $map) {
        if(strpos($rpath, $map) === 0) {
            $route[$map] = 'pages/index/'.$map;
            $route[$map.'/(:any)'] = 'pages/index/'.$map.'/$1';
            $route[$map.'/(:any/(:any))'] = 'pages/index/'.$map.'/$1/$2';
            $route[$map.'/(:any/(:any)/(:num))'] = 'pages/index/'.$map.'/$1/$2/$3';
        }
    }
    foreach ($toMapTH as $k => $map) {
        if(strpos($rpath, $map) === 0) {
            $route[$map] = 'pages/index/'.$toMap[$k];
            $route[$map.'/(:any)'] = 'pages/index/'.$toMap[$k].'/$1';
            $route[$map.'/(:any/(:any))'] = 'pages/index/'.$toMap[$k].'/$1/$2';
            $route[$map.'/(:any/(:any)/(:num))'] = 'pages/index/'.$toMap[$k].'/$1/$2/$3';
        }
    }
}
$route['default_controller'] = 'pages/index';  
$route['404_override'] = '';  
$route['translate_uri_dashes'] = FALSE;  
 
 
หากเราต้องการหน้าเพจอื่นๆ ก็สามารถเพิ่มค่า array เข้าไปทั้งไทยและอังกฤษได้
 
*ข่าวดี สำหรับผู้ที่กดติดตามเนื้อหาเกี่ยวกับ codeigniter ตั้งแต่ต้น เมื่อจบส่วนของโปรเจ็ค
จะได้รับลิ้งค์ดาวน์โหลด source code ของโปรเจ็คนี้ รวมถึงโครงสร้าง database เอาไว้ไปศึกษา
หรือประยุกต์ใช้งานได้เลย ใครยังกดติดตามไม่ครบ กดติดตามเนื้อหาให้ครบทุกตอน รอไว้ได้เลย

Codeigniter
http://www.ninenik.com/article_cat.php?arti_cat=19

 
 

Tags:: views codeigniter controllers routing

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง