เนื้อหาตอนต่อไปนี้ จะขอถือเป็นตอนสุดท้ายของโปรเจ็คการเรียนรู้ และใช้งาน codeigniter
อย่างไรก็ตาม เนื้อหาเกี่ยวกับ codeigniter ก็จะยังมีเพิ่มเติม รวมถึงบางส่วนของ
library หรือส่วนประกอบอื่นๆ ที่ยังไม่ได้กล่าวถึง โดยจะนำมาอธิบาย หรือแนะนำ
แยกออกจากโปรเจ็คที่เราศึกษามาแต่ต้น
การจบส่วนของโปรเจ็คนี้ หากใครกดติดตามบทความ ตั้งแต่ต้น จนถึงตอนนี้ จะสามารถดาวน์
โหลดโปรเจ็ค ที่ใช้งาน codeigniter 3.0.1 ไปต่อยอดหรือปรับแต่งใช้งานเพิ่มเติมได้
ส่วนของเนื้อหาที่เราเหลืออยู่ก็คือ หน้า home , aboutus และ service
โดยหน้า home เราจะปล่อยเป็นหน้าว่าง นั่นก็คือ เราจะใส่ข้อมูลอะไรก็ได้ ประยุกต์เพิ่มเติมเอา
ส่วนหน้า aboutus อันนี้จะเป็นแค่การดึงข้อมูลมาแสดง อ้างอิงจากบทความ
การใช้งาน CKEditor CDN ร่วมกับ codeigniter อย่างง่าย
https://www.ninenik.com/content.php?arti_id=676 via @ninenik
และหน้า service ก็จะเป็นการดึงข้อมูลมาแสดงเช่นกัน แต่หน้านี้จะพิเศษขึ้นมาหน่อย คือ
เราจะมาดูในเรื่องของการกำหนด url ให้รองรับ seo เช่น url เป็นภาษาไทย
การแสดงข้อมูลหน้า Aboutus
ให้เปิดไฟล์ aboutus.php ในโฟลเดอร์ apps > views > pages
แล้วกำหนดโค้ดประมาณนี้
<div class="container"> <div class="container-fluid"> <?php $query = $this->db->get_where("tbl_aboutus",array("aboutus_id"=>1)); $row = $query->row_array(); //คิวรี่ข้อมูลมาแสดงแค่รายการเดียว if(isset($row)) // ถ้ามีข้อมูล { ?> <h1><?=$row['aboutus_title']?></h1> <p> <?=$row['aboutus_detail']?> </p> <?php } ?> </div> </div>
การแสดงข้อมูลหน้า Service และการกำหนด URL ให้รองรับ SEO
สำหรับรายละเอียดการดึงข้อมูลในหน้า Service มาแสดงและแบ่งหน้า นั้นจะคล้ายๆ กับในส่วน
ของตอนที่เกี่ยวกับการจัดการ Service ของ admin ดึงนั้นจะไม่ลงรายละเอียดอธิบายซ้ำ
ก่อนอื่นเรามาดูรูปแบบ URL ของหน้า service ของเว็บไซต์โปรเจ็คของเราก่อน
รูปแบบ URL จะเป็น
http://localhost/learnci/service // หน้าปกติ http://localhost/learnci/service/page/2 // มีการแบ่งหน้า http://localhost/learnci/service/view/1 // แสดงข้อมูล อ้างอิง id ข้อมูลเท่ากับ 1 http://localhost/learnci/service/view/หัวข้อของบริการ_ที่_1 // แสดงแบบรองรับ SEO
เริ่มต้นให้เราสร้างไฟล์ชื่อ Service_model.php ไว้ในโฟลเดอร์ apps > models
<?php class Service_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->library('user_agent'); $this->load->library('pagination'); } public function getlist($id,$query_str=null){ $config['base_url'] = base_url('service/page/'); // url เพจข้อมูลของเรา $config['per_page'] = 5; // จำนวนแสดงต่อหน้า $config['num_links'] = 2; // จำนวนเลขซ้ายขวา เช่น 1 2 3 4 5 คือหน้า 2 หลัง 2 $config['use_page_numbers'] = TRUE; // แสดงเลขหน้าตามจริง เช่นหน้า 1 ก็เป็นเลข 1 // ส่วนของการกำหนดหน้าตาของ การแบ่งหน้า เนื่องจากเราใช้ bootstrap css จึงสามารถนำมาใช้ได้เลย $config['full_tag_open'] = '<nav><ul class="pagination">'; // เปิดแท็กทั้งหมด $config['full_tag_close'] = '</ul><nav>'; // ปิดแท็กทั้งหมดด้วย $config['first_link'] = 'First'; // ข้อความแสดงหน้าแรก $config['first_tag_open'] = '<li>'; // แท็กเปิดข้อความหน้าแรก $config['first_tag_close'] = '</li>'; // แท็กปิดข้อความหน้าแรก $config['first_url'] = ''; //url หน้าแรก $config['last_link'] = 'Last'; // ข้อความสแดงหน้าสุดท้าย $config['last_tag_open'] = '<li>'; // แท็กเปิดข้อความหน้าสุดท้าย $config['last_tag_close'] = '</li>'; // แท็กปิดข้อความหน้าสุดท้าย $config['next_link'] = '>'; // ข้อความหน้าก่อนหน้า ในที่นี้ใช้สัญลักษณ์ < $config['next_tag_open'] = '<li>'; // แท็กเปิดข้อความแสดงหน้าก่อนหน้า $config['next_tag_close'] = '</li>'; // แท็กปิดข้อความแสดงหน้าก่อนหน้า $config['prev_link'] = '<'; // ข้อความหน้าถัดไป ในที่นี้ใช้สัญลักษณ์ > $config['prev_tag_open'] = '<li>'; // แท็กเปิดข้อความหน้าถัดไป $config['prev_tag_close'] = '</li>'; // แท็กปิดข้อความหน้าถัดไป $config['cur_tag_open'] = '<li class="active"><a href="javascript:void();">'; // แท็กหน้าเลขเพจปัจจุบัน $config['cur_tag_close'] = '</a></li>'; // แท้กปิดหน้าเพจปัจจุบัน $config['num_tag_open'] = '<li>'; // แท็กเปิดหน้าเพจเลขต่างๆ $config['num_tag_close'] = '</li>'; // แท็ปิดหน้าเพจเลขต่างๆ $config['reuse_query_string'] = TRUE; $config['total_rows'] = $this->db->count_all_results('tbl_service',FALSE); $this->pagination->initialize($config); // ตั้งค่าการกำหนด การแบ่งหน้า $begin=(isset($id) && $id>1)?($id-1)*$config['per_page']:0; $this->db->limit($config['per_page'], $begin); $query = $this->db->get(); return $query->result_array(); } public function view($id){ // มี $id เป็น parameter ไว้กำหนดเงื่อนไข if(intval($id)>0){ $query = $this->db->get_where('tbl_service',array('service_id'=>$id)); }else{ $arr_where=array( 'service_title'=>preg_replace('/_/',' ',$id) ); $query = $this->db->get_where('tbl_service',$arr_where); } return $query->row_array(); // ส่งข้อมูลผลัพธ์กลับเป็น array แถวข้อมูล } }
จากโค้ดด้านบน เราจะขอพูดเฉพาะในส่วนของ ฟังก์ชั่น view($id)
จะเห็นว่า เราจะมีการกำหนดเงื่อนไข โดยการตรวจสอบค่าจากตัวแปร $id
if(intval($id)>0){ // ถ้าแปลค่าตัวแปร $id แล้วมีค่ามาก 0 แสดง่ว่าข้อมูลที่ส่งมา
เป็นลักษณะของตัวเลข เช่นเราเรียก URL
http://localhost/learnci/service/view/1
ถ้าเรากำหนด URL ในลักษณะข้างต้น เลข 1 ก็คือค่าในฟิลด์ service_id ของตาราง tbl_service
การคิวรี่ข้อมูลจึงเป็นการเทียบกับค่าของ service_id
$query = $this->db->get_where('tbl_service',array('service_id'=>$id));
หากเป็นกรณีอื่น เช่น เมื่อแปลงค่าเป็นตัวเลขแล้วมีค่าน้อยกว่าหรือท่ากับ 0
แสดงว่าค่าของตัวเปร $id เป็นในลักษณะของข้อความตัวอักษร โดยรูปแบบนี้
เราจะใช้ประโยชน์สำหรับ SEO สำหรับใช้กับ URL ตัวอย่าง
http://localhost/learnci/service/view/หัวข้อของบริการ_ที่_1
จากตัวอย่าง ค่า $id ก็คือ หัวข้อของบริการ_ที่_1 ซึ่งได้มาจากข้อความ
ของฟิลด์ service_tile มีค่าเป็น "หัวข้อของบริการ ที่ 1"
เราจะเห็นว่า หัวข้อจริงๆ แล้วจะมีช่องว่าง แต่สำหรับกำหนดให้ URL รองรับ SEO
จึงได้ทำการแปลงจากช่องว่างให้เป็นเครื่องหมาย _ (underscore) แทนด้วยฟังก์ชั่น
$service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title'])); // อยู่ในไฟล์ service.php
ดังนั้นเมื่อค่าที่ส่งมามีเครื่องหมาย _ เวลาเอาไปใช้ จึงต้องแปลงกลับ
ด้วยคำสั่ง
preg_replace('/_/',' ',$id)
การเปรียบเทียบค่า WHERE ก็จะได้เป็น service_title='หัวข้อของบริการ ที่ 1'
$arr_where=array( 'service_title'=>preg_replace('/_/',' ',$id) ); $query = $this->db->get_where('tbl_service',$arr_where);
การกำหนดในลักษณะนี้ จะทำให้สามารถรองรับการใช้งานทั้งแบบค่า id และค่าที่เป็นข้อความ
เพื่อรองรับ SEO
ต่อไปเรามาดูที่ไฟล์ service.php ในโฟลเดอร์ apps > views > pages
โค้ดสำเร็จจะได้เป็นดังนี้
<div class="container"> <?php if($action==null || $action=='page'){?> <h1><?=$title_h1?></h1> <?php $query_str = $this->input->get(); $keyword = $this->input->get('keyword'); $result = $this->service_model->getlist($id,$query_str); ?> <?php $i_num=0; if(!isset($id)){ $id=1; } if(count($result)>0){ foreach($result as $row){ $i_num++; $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title'])); ?> <div class="container-fluid"> <img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" style="width:150px;" alt=""> <br> <!-- <a href="<?=base_url('service/view/'.$row['service_id'])?>"><?=$row['service_title']?></a>--> <a href="<?=base_url('service/view/'.$service_title_url)?>"><?=$row['service_title']?></a> <p> <?=mb_substr(strip_tags($row['service_detail']),0,30)?> <!-- <a href="<?=base_url('service/view/'.$row['service_id'])?>">อ่านเพิ่ม..</a>--> <a href="<?=base_url('service/view/'.$service_title_url)?>">อ่านเพิ่ม..</a> </p> <br> </div> <?php } ?> <?php } ?> <?php echo $this->pagination->create_links(); ?> <?php } ?> <?php if($action=='view'){?> <?php $previous_url = $this->agent->referrer(); // เรียกใช้ฟังก์ชั่น view() ดึงข้อมูลมาแสดงก่อนแก้ไข $row = $this->service_model->view($id); ?> <div class="container-fluid"> <h1><?=$row['service_title']?></h1> <p> <img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" alt=""> <br><br> <?=$row['service_detail']?> </p> <br> <a href="<?=$previous_url?>" class="btn btn-warning btn-sm">< Back</a> <br><br> </div> <?php } ?> </div>
ดูในส่วนแรกกัน คือส่วนของ $action เท่ากับ null หรือ $action เท่ากับ page
ซึ่งก็คือหน้าที่เราเปิดเข้ามา และก็หน้าที่การแบ่งหน้า หรือเลือกหน้าของข้อมูล
<?php if($action==null || $action=='page'){?> <h1><?=$title_h1?></h1> <?php $query_str = $this->input->get(); $keyword = $this->input->get('keyword'); $result = $this->service_model->getlist($id,$query_str); ?> <?php $i_num=0; if(!isset($id)){ $id=1; } if(count($result)>0){ foreach($result as $row){ $i_num++; // แปลงหัวข้อให้รองรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _ $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title'])); ?> <div class="container-fluid"> <img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" style="width:150px;" alt=""> <br> <!-- <a href="<?=base_url('service/view/'.$row['service_id'])?>"><?=$row['service_title']?></a>--> <a href="<?=base_url('service/view/'.$service_title_url)?>"><?=$row['service_title']?></a> <p> <?=mb_substr(strip_tags($row['service_detail']),0,30)?> <!-- <a href="<?=base_url('service/view/'.$row['service_id'])?>">อ่านเพิ่ม..</a>--> <a href="<?=base_url('service/view/'.$service_title_url)?>">อ่านเพิ่ม..</a> </p> <br> </div> <?php } ?> <?php } ?> <?php /// ส่วนของการแบ่งหน้า echo $this->pagination->create_links(); ?> <?php } ?>
โค้ดในส่วนนี้ไม่มีอะไร คล้ายเนื้อหาที่เราเคยศึกษามาแล้ว แต่ให้สังเกตตรงฟังก์ชั่น
// แปลงหัวข้อให้รองรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _ $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title']));
ส่วนนี้ จะเป็นส่วนที่เราจะแปลงหัวข้อมูลให้รอบรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _
เพื่อส่งเข้าไปในหน้าลิ้งค์แสดงข้อมูล คือจากหัวข้อ "หัวข้อของบริการ ที่ 1" ก็แปลงเป็น
"หัวข้อของบริการ_ที่_1" ส่งไปกับ URL ให้รองรับ SEO
ในโค้ดเรายังมีลิ้งค์ที่เรากำหนดการส่งแบบค่า service_id เข้าไป แต่เราไม่ได้ใช้ คอมเม้นท์ปิดไว้
ให้ดูเป็นแนวทาง เลือกว่าจะใช้แบบไหน ซึ่งฟังก์ชั่นที่เราเขียนไว้รองรับทั้งสองแบบอยู่แล้ว
ต่อมาเรามาดูในส่วนของการแสดงข้อมูล เมื่อคลิกลิ้งค์หัวข้อของบริการ
<?php if($action=='view'){?> <?php $previous_url = $this->agent->referrer(); // เรียกใช้ฟังก์ชั่น view() ดึงข้อมูลมาแสดงก่อนแก้ไข $row = $this->service_model->view($id); ?> <div class="container-fluid"> <h1><?=$row['service_title']?></h1> <p> <img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" alt=""> <br><br> <?=$row['service_detail']?> </p> <br> <a href="<?=$previous_url?>" class="btn btn-warning btn-sm">< Back</a> <br><br> </div> <?php } ?>
ในหน้านี้จะเห็นว่าเรามีการส่ง $id ในที่นี้ก็คือหัวข้อที่จัดรูปแบบให้รองรับ SEO แล้ว
เข้าไปทำการคิวรี่ข้อมูลผ่านฟังก์ชั่น view() ใน model ถ้าหัวข้อที่ส่งไปกับ URL
ตรงกับหัวข้อในฐานข้อมูลฟิลด์ service_title ก็จะทำการดึงข้อมูลรายละเอียด
และข้อมูลอื่นๆ ของ service มาแสดง
สำหรับโปรเจ็ค การเรียนรู้การใช้งาน codeigniter ของเราก็ขอจบเพียงเท่านี้
ใครที่กดติดตาม เนื้อหาหมวด codeigniter ตั้งแต่ต้นจนถึงตอนนี้ ก็รอโหลด
ไฟล์โปรเจ็คจากเมนูสมาชิกด้านขวา เร็วๆ นี้ ได้เลย
ส่วนใครที่อยากได้โค้ดส่วนนี้ ก็ไล่กดติดตามเนื้อหาให้ครบตามเงื่อนไข ก็จะสามารถ
ดาวน์โหลดได้
ปล. เนื้อหาเกี่ยวกับ codeigniter จะยังมีเพิ่มเติมตามความเหมาะสม