ก่อนอื่นเพื่อความเข้าใจเบื้องต้น model ก็คือไฟล์ php ที่เราสร้างขึ้นเพื่อเก็บ class ชุดคำสั่งต่างๆ
ที่ต้องการใช้งาน เหมาะสำหรับใช้งานร่วมกับฐานข้อมูล อย่างเช่น ใช้ในการเพิ่ม ลบ แก้ไข
หรือดึงรายการข้อมูลมาแสดง ซึ่งจริงๆ แล้วเราสามารถเขียนไว้ในไฟล์ controllers หรือ views ก้ได้
ดังนั้นการใช้งาน model ก็เป้นเพียงอีกทางเลือกหนึ่ง เพื่อให้การเขียนโค้ดของเราเป็นไปในรุปแบบ MVC มากขึ้น
ก่อนเข้าสู่รายละเอียดเพิ่มเติม ขออ้างอิงจากเนื้อหาตอนที่แล้ว
codeigniter กับ การเชื่อมต่อฐานช้อมูล และการเพิ่ม ลบ แก้ไข แสดงรายการ
https://www.ninenik.com/content.php?arti_id=666 via @ninenik
ในตอนที่แล้วเราทำการแสดงรายการ เพิ่ม ลบ แก้ไข ข้อมูล จากฐานข้อมูลในรูปแบบเบื้องต้นไปแล้ว
เป็นการทำเกี่ยวกับระบบสมาชิกผู้ดูแลระบบ
สำหรับเนื้อหาในตอนนี้ เราจะมาสร้างส่วนจัดการเนื้อหาของเมนู บริการของเรา กัน
// ลิ้งค์หน้าบริการของเรา http://localhost/learnci/service // ลิ้งค์หน้าจัดการเนื้อหา "บริการของเรา" ของ admin http://localhost/learnci/admin/service
ให้เราสร้างไฟล์ admin_service.php ในโฟลเดอร์ apps > views > admin
ด้วยโค้ดตัวอย่างดังนี้
<div class="container"> Service <br><br> <?php if($action==null){?> <a href="<?=base_url('admin/service/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>Title</th> <th width="150" class="text-center">Modify Date</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>Service <?=$i?></td> <td class="text-center"><?=date("Y-m-d H:i:s")?></td> <td class="text-center"> <a href="<?=base_url('admin/service/edit/'.$i)?>" class="btn btn-success btn-sm"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> </a> <a href="<?=base_url('admin/service/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/service')?>" class="btn btn-warning btn-sm">< Back</a> <br><br> <form action="<?=base_url('admin/service/create')?>" method="post" enctype="multipart/form-data"> <table class="table table-bordered"> <thead> <tr class="active"> <th colspan="2">Add New Service</th> </tr> </thead> <tbody> <tr > <th width="120">Title:</th> <td> <input type="text" name="service_title" style="width:500px;"> </td> </tr> <tr> <th width="120">Detail:</th> <td> <textarea name="service_detail" cols="85" rows="10"></textarea> </td> </tr> <tr> <th width="120">Images:</th> <td> <input type="file" name="service_image" > </td> </tr> <tr> <th></th> <td> <input type="submit" class="btn btn-success btn-sm" name="btn_add" value="Add Service"> </td> </tr> </tbody> </table> </form> <?php } ?> <?php if($action=="edit"){?> <a href="<?=base_url('admin/service')?>" class="btn btn-warning btn-sm">< Back</a> <br><br> <form action="<?=base_url('admin/service/edit/'.$id)?>" method="post" enctype="multipart/form-data"> <table class="table table-bordered"> <thead> <tr class="active"> <th colspan="2">Edit Service</th> </tr> </thead> <tbody> <tr > <th width="120">Title:</th> <td> <input type="text" name="service_title" style="width:500px;"> </td> </tr> <tr> <th width="120">Detail:</th> <td> <textarea name="service_detail" cols="85" rows="10"></textarea> </td> </tr> <tr> <th width="120">Images:</th> <td> <input type="file" name="service_image" > </td> </tr> <tr> <th></th> <td> <input type="submit" class="btn btn-success btn-sm" name="btn_add" value="Edit Service"> </td> </tr> </tbody> </table> </form> <?php } ?> <?php if($action=="delete"){?> <a href="<?=base_url('admin/service')?>" 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/service')?>" class="text-success">< Back > </a> </div> <?php } ?> </div>
จากนั้นให้เราไปเพิ่มเมนูจัดการที่ไฟล์ admin_header.php ในโฟลเดอร์ apps > views > admin
<li><a href="<?=base_url('admin/service')?>">Service</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/service')?>">Service</a></li> <li><a href="<?=base_url('admin/logout')?>">Logout</a></li> <?php } ?>
เป็นอันเรียบร้อยในส่นของการวางโครงของไฟล์ admin_service.php
และการกำหนดลิ้งค์ในไฟล์ admin_header.php
การสร้าง Model
ต่อไปเรามาดูในส่วนของการสร้าง model ไฟล์ เพื่อใช้สำหรับจัดการระบบ "บริการของเรา"
รุปแบบการกำหนดชื่อไฟล์ จะคล้ายกับ controllers ต้องเป็นภาษาอังกฤษ อักษรตัวแรกเป็นตัวใหญ่
โดยไฟล์ของ model จะอยู่ในโฟลเดอร์ apps > models
และในโฟลเดอร์ models เราสามารถสร้างโฟลเดอร์ย่อยเพื่อจัดเก็บ models เป็นหมวดหมู่ได้
ให้ทำตามดังนี้ สร้างโฟลเดอร์ชื่อ admin ไว้ในโฟลเดอร์ apps > models
จากนั้นสร้างไฟล์ Service_model.php ในโฟลเดอร์ admin และกำหนดโค้ดดังนี้
<?php class Service_model extends CI_Model { public function __construct() { parent::__construct(); } public function getlist(){ echo "List"; } public function create(){ echo "Create"; } public function view(){ echo "View"; } public function edit(){ echo "Edit"; } public function delete(){ echo "Delete"; } }
สังเกตว่าเราจะกำหนดรูปแบบไฟล์ ในลักษณะ [ชื่อที่ต้องการ_model.php] เหตุผลเพื่อนำไปประยุกต์
ในการโหลด model เข้ามาใน controller
การโหลด model มาใช้งาน ใน controller
การโหลด model จะใช้งานคำสั่ง
$this->load->model('model_name');
model_name ก็คือชื่อ class model ที่เรากำหนด
จากไฟล์ของเรา ก็จะได้เป็น
$this->load->model('service_model');
และกรณีหากเรากำหนดโฟลเดอร์ย่อย สำหรับ model การโหลดมาใช้งานจะกำหนด
ได้ดังนี้ สมมติตามโปรเจ็คเรากำหนดไว้ในโฟลเดอร์ admin อีกที ก็จะได้เป้น
$this->load->model('admin/service_model');
*ต้องไม่เปิดหรือปิดด้วย / เช่น
$this->load->model('admin/service_model/'); // แบบนี้ไม่ถูกต้อง $this->load->model('/admin/service_model'); // แบบนี้ไม่ถูกต้อง
และถ้าหากเราต้องการเปลี่ยนชื่อ เพื่อให้สะดวกในการเรียกใช้ ก็สามารถกำหนด ชื่อ object ที่ต้องการ
ใน parameter ตัวที่สอง เช่น
$this->load->model('admin/service_model','service'); // แบบนี้ก็จะใช้ service แทน service_model
ที่นี้เรามาประยุกต์การใช้งานกับโปรเจ็คของเรา เนื่องจากว่าในระบบ admin เราจะใช้งาน
controller แค่อันเดียว ดังนั้น เพื่อรองรับ การเรียกใช้ model หลายอัน จึงจำเป็นต้อง
กำหนดเงื่อนไขให้สอดคล้องกัน ดังนี้
เปิดไฟล์ Admin.php ในโฟลเดอร์ apps > controllers
แล้วให้ทำการเพิ่มนี้ลงไป
$file_model=APPPATH.'/models/admin/'.ucfirst($admin_pages).'_model.php'; if(file_exists($file_model)) { $this->load->model('admin/'.$admin_pages.'_model'); }
โดยแทรกไว้ดังนี้
// แสดงหน้า admin อย่างง่ายเมื่อมีการล็อกอิน และสร้าง session $data['title']="Admin Home"; $data['title_h1']="Page Admin Home"; $data['action']=$action; $data['id']=$id; $file_model=APPPATH.'/models/admin/'.ucfirst($admin_pages).'_model.php'; if(file_exists($file_model)) { $this->load->model('admin/'.$admin_pages.'_model'); } $this->load->view('admin/admin_header', $data); $this->load->view('admin/admin_'.$admin_pages,$data); $this->load->view('admin/admin_footer');
หลักการคือ
$file_model=APPPATH.'/models/admin/'.ucfirst($admin_pages).'_model.php';
กำหนดตัวแปร $file_model เพื่อระบุ path ของไฟล์ model โดยชื่อจะต้องมีส่วนที่ตรงกับตัวแปร $admin_pages
และใช้ฟังก์ชั่น ucfirst() แปลงตัวอักษรแรกให้เป็นตัวใหญ่ ตัวอย่าง
สมมติเมื่อ ส่งคำว่า service มา ก็จะได้เป็น Service และมาต่อด้วย _model.php ก็จะได้ชื่อไฟล์
Service_model.php
สำหรับ APPPATH คือค่า contanst คือตำแหน่งของไฟลเดอร์ apps
เมื่อต่อส่วนต่างๆ ก็จะได้ path ของไฟล์ model ที่ต้องการ
จากนั้นใช้คำสั่ง file_exists()
if(file_exists($file_model)) { $this->load->model('admin/'.$admin_pages.'_model'); }
เพื่อครวจสอบว่ามีไฟล์ model นั้นหรือไม่ ถ้ามีก็ให้ทำการ โหลด model นั้นมาไว้ใช้งาน
ขอจบในส่วนของการสร้าง model และการประยุกต์การโหลดมาใช้ในโปรเจ็คไว้เท่านี้
ตอนต่อไปจะลงในรายละเอียดการเรียกใช้งาน