จากเนื้อหาตอนที่แล้ว เราได้สร้าง project เว็บไซต์อย่างง่าย
เขียน controller class และ view สร้างเว็บไซต์อย่างง่าย
https://www.ninenik.com/content.php?arti_id=662 via @ninenik
รวมถึงการตั้งค่าต่างๆ เบื้องต้นสำหรับการใช้งาน Codeigniter โดยเฉพาะใน
ส่วนของ URL อย่างเช่นการกำหนดตัวแปร
$config['base_url'] = 'http://localhost/learnci/';
ติดตั้ง และ ใช้งาน CodeIgniter สำหรับพัฒนา website หรือ web app
https://www.ninenik.com/content.php?arti_id=661 via @ninenik
พบว่าในการเรียกใช้งานเว็บไซต์ project จะมีการเรียกไฟล์ index.php เสมอ
เช่น
สำหรับใครที่ทดสอบตามและใช้ bootstrap กับ jquery ให้เข้าไปทำการโหลดไฟล์
http://localhost/learnci/index.php/home/ http://localhost/learnci/index.php/aboutus/ http://localhost/learnci/index.php/service/ http://localhost/learnci/index.php/contactus/
ซึ่งโดยปกติการใช้งานจริง เราต้องการให้ URL ของเว็บไซต์ของเรา รองรับ search-engine
และอ่านออกเข้าใจง่าย เช่น
http://localhost/learnci/home/ http://localhost/learnci/aboutus/ http://localhost/learnci/service/ http://localhost/learnci/contactus/
การตัด index.php ด้วยการใช้ mod_rewrite จึงถูกนำมาใช้
สำหรับการแก้ปัญหานี้ และแน่นอนว่า เมื่อมีการใช้งาน mod_rewrite ย่อมจะมีผลต่อการ
กำหนด path ในส่วนของไฟล์ต่างๆ เช่น ไฟล์ในโฟลเดอร์ css js images หรืออื่นๆ
ดังนั้น URL Helper จึงจำเป็นสำหรับนำมาใช้ใน project เราเสมอ เพื่อใช้ในการดึง path
ของตำแหน่งข้อมูล URL ต่างๆ มาใช้ เช่น base_url เป็นต้น
อ้างอิงจากเนื้อหาตอนที่แล้ว
การตัด index.php ด้วย mod_rewrite
เบื้องต้นให้เราสร้างไฟล์ชื่อ .htaccess ไว้ในโฟลเดอร์ root (ตำแหน่งเดียวกับโฟลเดอร์ apps และ sys)
และกำหนดค่าในไฟล์ดังนี้
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
จากนั้นให้ไปที่ไฟล์ config.php ในโฟลเดอร์ apps > config และแก้ไขโค้ด
ในส่วนการกำหนด ndex_page
$config['index_page'] = 'index.php';
ให้เราเปลี่ยนเป็นค่าว่าง จะได้เป็น
$config['index_page'] = '';
เท่านี้เป็นอันเสร็จ ในขั้นตอนการตัด index.php เราสามารถเรียกใช้งาน
http://localhost/learnci/home/ แทน http://localhost/learnci/index.php/home/ * กรณีทดสอบและมี port อื่นให้ระบุ port ไปด้วย เช่น http://localhost:8080/learnci/home/
การเรียกใช้งาน URL Helper
ไฟล์ URL Helper จะประกอบไปด้วยฟังก์ชั่นสำหรับใช้งานเกี่ยวกับ URL ต่างๆ
เช่น site_url() base_url() เป็นต้น ดังนั้นให้เราทำการ โหลด URL Helper อัตโนมัติ
โดยเข้ากำหนดค่าดังนี้
แก้ไขไฟล์ autoload.php ที่อยู่ในโฟลเดอร์ apps > config
โดยให้ทำการเพิ่ม URL Helper
$autoload['helper'] = array('url');
เท่านี้เราก็สามารถเรียกใช้งานฟังก์ชั่นเกี่ยวกับ URL ที่ใช้บ่อย เช่น site_url() หรือ base_url() ได้แล้ว
เรามาดูการใช้งานอ้างอิงจากไฟล์ header.php ที่อยู่ในโฟลเดอร์ templates จากเนื้อหาตอนที่แล้ว
<?php $baseURL="http://localhost/learnci/"; ?> <!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="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> </head> <body> <nav class="navbar navbar-default"> <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="<?=$baseURL?>">LearnCI</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="<?=$baseURL?>index.php/home/">Home</a></li> <li><a href="<?=$baseURL?>index.php/aboutus/">About Us</a></li> <li><a href="<?=$baseURL?>index.php/service/">Service</a></li> <li><a href="<?=$baseURL?>index.php/contactus/">Contact Us</a></li> </ul> </div> </div> </nav>
จากโค้ดข้างต้น ขออธิบาย 2 ส่วน
ส่วนแรก
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
จะเห็นว่าเรามีการเรียกใช้ไฟล์ css และ javascript จากภายนอก
แต่กรณีใช้งานจริง เราควรเรียกจาก path server ของเราจะดีกว่า ดังนั้น เราจะสร้างโฟลเดอร์
css js และ images ในตำแหน่งเดียวกับโฟลเดอร์ apps และ sys
จากนั้นเรากำหนด path เบื้องต้น ของแต่ละส่วนใหม่ได้ดังนี้
<link rel="stylesheet" href="css/bootstrap-3.3.5/css/bootstrap.min.css"> <script src="js/jquery-1.11.3.min.js"></script> <script src="css/bootstrap-3.3.5/js/bootstrap.min.js"></script>
สำหรับใครที่ทดสอบตามและใช้ bootstrap กับ jquery ให้เข้าไปทำการโหลดไฟล์
และบันทึกลงโฟลเดอร์ และเรียก path ให้ถูกต้อง
จะเห็นว่าการกำหนดใหม่ข้างต้น เป็นการกำหนด path แบบ relative หรืออาศัยความสัมพันธ์กับ
url ปัจจุบันที่แสดงบนบราวเซอร์ เช่น ถ้าที่บราวเซอร์ URL เป็น
http://localhost/learnci/home/
ไฟล์ jquery ในโฟลเดอร์ js จะมี path ที่ผิดเพี้ยนไปจากความเป็นจริง
http://localhost/learnci/home/js/jquery-1.11.3.min.js
ซึ่งจริงแล้ว path ที่ถูกต้องคือ
http://localhost/learnci/js/jquery-1.11.3.min.js
ดังนั้นเป็นเหตุผลและความสำคัญที่เราจะใช้งาน URL Helper โดยเราจะเรียกใช้ฟังก์ชั่น
base_ur() ซึ่งจะได้ค่าที่กำหนดในไฟล์ config.php ในโฟลเดอร์ apps > config
$config['base_url'] = 'http://localhost/learnci/';
เราจึงกำหนดใหม่ดังนี้
<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>
ส่วนที่สอง
ส่วนของลิ้งค์ต่างๆ ก็กำหนด เช่น จากเดิม เราใช้วิธีใส่ตัวแปรแบบกำหนด
เพราะยังไม่ได้มีการเรียกใช้งาน URL Helper แต่เมื่อเราเรียกใช้งาน URL Helper
แล้วเราสามารถกำหนดใหม่ได้ดังนี้
<a class="navbar-brand" href="<?=base_url()?>">LearnCI</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="<?=base_url('home')?>">Home</a></li> <li><a href="<?=base_url('aboutus')?>">About Us</a></li> <li><a href="<?=base_url('service')?>">Service</a></li> <li><a href="<?=base_url('contactus')?>">Contact Us</a></li> </ul> </div>
รูปแบบการใช้งาน ฟังก์ชั่น base_url() เบื้องต้น
ถ้าเรากำหนด base_ur ที่กำหนดในไฟล์ config.php ในโฟลเดอร์ apps > config
$config['base_url'] = 'http://localhost/learnci/';
เมื่อมีการเรียกใช้งานฟังก์ชั่น
<?=base_url()?>
จะได้ค่า เดียวกับ $config['base_url'] คือ
http://localhost/learnci/
และถ้าเรากำหนดค่า string เข้าไป จะเป็นการต่อ URL เช่น
<?=base_url('home')?>
ก็จะได้ เป้น
http://localhost/learnci/home
หากต้องการกำหนด protocal เช่น https ftp เป้นต้น (หากไม่กำหนดก็จะเป็น http)
<?=base_url('home','https')?>
ค่าจะได้ เป้น
https://localhost/learnci/home
นอกจากนั้น เรายังสามารถกำหนดเข้าไปใน path โฟลเดอร์ย่อยเข้าไปได้ เช่น การใช้งาน
กับไฟล์รูปภาพ image css หรือ javascipt เข่น
<?=base_url('images/logo.png')?>
ก็จะหมายถึง path เต็มดังนี้
https://localhost/learnci/images/logo.png
ดังนั้นเมื่อเราแก้ไขไฟล์ header.php ตามรูปแบบการใช้งานใหม่ จะได้ดังนี้
<!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-default"> <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()?>">LearnCI</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="<?=base_url('home')?>">Home</a></li> <li><a href="<?=base_url('aboutus')?>">About Us</a></li> <li><a href="<?=base_url('service')?>">Service</a></li> <li><a href="<?=base_url('contactus')?>">Contact Us</a></li> </ul> </div> </div> </nav>
ขอจบในส่วนของการใช้ mod_rewrite เพื่อตัด index.php และการใช้งาน
URL Helper ซึ่งมีความสำคัญต้นๆ ไว้เพียงเท่านี้