CI Notice: Only variable references should be returned by reference

Screen Shot 2557-11-18 at 20.27.23

ให้แก้ไขไฟล์ Common.phop ในไดเรกทอรี system/core/ บรรทัดที่ 257 จาก

return $_config[0] =& $config;

ให้เป็น

$_config[0] =& $config;
return $_config[0];

อ้างอิง: https://ellislab.com/forums/viewthread/244510/#1066558

วิธีติดตั้ง Smarty 3.1.7 กับ CodeIgniter 2.1.0

ผมหาทางติดตั้ง  Smarty 3.1.7 เพื่อให้ใช้งานได้กับ CodeIgniter 2.1.0  ได้  โดยมีขั้นดังนี้

  1. ดาวน์โหลดและติดตั้ง CodeIgniter ตามปกติ
  2. การติดตั้ง Smarty จะดำเนินการโดยใช้ Ci-Smarty  ที่พัฒนาขึ้นโดยคุณ Dwayne Charrington   ให้ดาวน์โหลดและติดตั้งลงใน CodeIgniter ในข้อ 1.  แล้วให้ทำการทดสอบว่าสามารถใช้งาน Smarty ได้จริง
  3. เนื่องจากในขณะที่เขียนบทความนี้ Smarty ที่ิติดตั้งใน Ci-Smarty เป็นเวอร์ชัน 3.1.1 เราจึงต้องมีการแก้ไขปรับแก้ไฟล์  โดยโครงสร้างไฟล์ของ Ci-Smarty มีดังภาพข้างล่างนี้
  4. เราต้องปรับแก้ 3 ส่วน ตามที่ลูกศรชี้ไว้
  • ส่วนที่ 1 แก้ไขไฟล์ smarty.php ในไดเรกทอรี config  โดยให้แก้ตัวแปร $config[‘cache_status’] ให้มีค่าเป็น TRUE จากเดิมที่เป็น 1 เนื่องจากในไฟล์ libraries/Smarty.php ตรวจสอบค่า $config[‘cache_status’] ว่าเป็น TRUE หรือไม่
    $config['cache_status'] = TRUE;

    และให้เพิ่ม 2 บรรทัดต่อไปนี้ที่ท้ายไฟล์  เพื่อจะได้เป็นการบังคับให้ให้มีการ compile template ทุกครั้งในระหว่างที่เรากำลังพัฒนาโปรแกรม   และเมื่อจะนำไปใช้งานจริงก็ควรกำหนดค่าให้เป็น FALSE ทั้ง 2 ตัวแปร

    $config['compile_check'] = TRUE; 
    $config['force_compile'] = TRUE;
  • ส่วนที่ 2 แก้ไขไฟล์ Smarty.net ในไดเรอกทอรี libraries  โดยให้เพิ่ม 2 คำสั่งต่อไปนี้ใต้บรรทัดที่มี $this->template_ext เพื่อนำค่าจากการแก้ไขส่วนที่ 1 มาใช้งาน
    $this->compile_check = config_item('compile_check');
    $this->force_compile = config_item('force_compile');

    หลังจากนั้นให้ทำการ comment ในคำสั่งส่วนที่จะทำการเพิ่ม helper ต่างๆ ​ โดยใส่เครื่องหมาย /* และ */ ครอบเอาไว้  สาเหตุที่ต้อง comment ไว้ก็เพราะเมื่อเรา upgrade Smarty เป็น 3.1.7 แล้ว คำสั่งในส่วนนี้จะทำให้เกิด error  (หากอยากทราบว่าเป็นอย่างไรก็ปล่อยไว้ได้)

    /*
     // Add all helpers to plugins_dir
     $helpers = glob(APPPATH . 'helpers/', GLOB_ONLYDIR | GLOB_MARK);
    foreach ($helpers as $helper)
     {
     $this->plugins_dir[] = $helper;
     }
     */
  • ส่วนที่ 3 ให้ทำการดาวน์โหลด Smarty 3.1.7  แล้วแตกไฟล์และคัดลอกเอาไฟล์และไดเรกทอรีภายใต้ libs มาทับของเดิมใน third_party/Smarty/ ทั้งหมด

ขอขอบคุณ คุณ Dwayne Charrington ที่ได้พัฒนา Ci-Smarty ไว้ครับ  ขั้นตอนข้างบนนี้จะไม่จำเป็นเมื่อ Ci-Smarty มีการ update ครับ  และผมไม่รับประกันความเสี่ยงที่เกิดขึ้น รวมทั้งปัญหาที่ตามมาใดๆ ทั้งสิ้นครับ!

Happy Coding Year! 😀

Object Relational Mapper (ORM)

Object-relational mapping (ORMO/RM, and O/R mapping) in computer software is a programming technique for converting data between incompatible type systems in relational databases and object-oriented programming languages.

From: http://en.wikipedia.org/wiki/Object-relational_mapping

หากมีเวลาก็ทดลองใช้งาน ORM ต่างๆ ได้

CodeIgniter – Session Bug within object storage

ผมใช้ CodeIginter แล้วเจอ error เกี่ยวกับ session library แบบนี้

A PHP Error was encountered
Severity: 4096
Message: Object of class stdClass could not be converted to string
Filename: libraries/Session.php
Line Number: 715

ลองค้นดูในเน็ตแล้วพบว่าเป็นบั๊กของ session เกี่ยวกับ object storage วิธีการแก้ที่
http://codeigniter.com/forums/viewthread/95690/P0/

โดยให้แก้ไฟล์ system/libraries/Session.php ที่บรรทัด 683 และ  714  จาก

$data[$key] = str_replace('\', '{{slash}}', $val);

ให้่เป็น

if(!is_object($val))    $data[$key] = str_replace('{{slash}}', '\', $val);

Codeigniter ตอน pagination class

Codeiginer มี pagination class เพื่อช่วยในการจัดแบ่งข้อมูลที่จะนำแสดงบนเว็บ โดยผู้ใช้สามารถกำหนดได้ว่าในแต่ละหน้านั้น จะให้แสดงจำนวนข้อมูลจำนวนเท่าใด โดยจะมีการทำลิ้งก์ให้เลือกหน้าถัดไปหรือย้อนหลังให้อัตโนมัติ เช่น

« First < 1 2 3 4 5 > Last »

ตัวอย่างการใช้งาน

$this->load->library('pagination');

$config['base_url'] = 'http://example.com/index.php/test/page/';
$config['total_rows'] = '200';
$config['per_page'] = '20';

$this->pagination->initialize($config);

echo $this->pagination->create_links();

องค์ประกอบเบื้องต้น
ตัวแปร  $config จากตัวอย่างข้างต้น  ใช้ในการกำหนดองค์ประกอบที่ต้องการ  โดยสามารถสร้างไฟล์สำหรับเก็บตัวแปร $config ชื่อ  pagination.php  แยกไว้ต่างหาก   แล้วบันทึกไฟล์ไว้ที่ config/pagination.php

  • base_url เป็น URL ของ controller class  และ function ของเพจที่เราต้องการแบ่งการแสดงผลเป็นหน้า  ซึ่งจะต้องกำหนดค่าให้ถูกต้อง  เพราะเวลาเปลี่ยนหน้านั้นจะมีการส่งค่าให้ function  เพื่อนำไป query ข้อมูลจากฐานข้อมูล
  • total_rows เป็นจำนวนข้อมูลทั้งหมดที่เราต้องการนำมาแบ่งการแสดงผลเป็นหน้า  จากตัวอย่างข้างต้นเป็นการกำหนดข้อมูลให้มีค่าเป็น 200   แต่ในการใช้งานจริงนั้น จำนวนข้อมูลทั้งหมดจะเป็นจำนวน record ที่ได้มาจากการ query ข้อมูลจากฐานข้อมูล
  • per_page เป็นการกำหนดจำนวนข้อมูลที่จะให้แสดงในแต่ละหน้า
  • initialize() เป็นฟังก์ชันส่งตัวแปร $config ให้ pagination class  เพื่อให้จัดองค์ประกอบอย่างที่เราต้องการ
  • create_links()  เป็นฟังก์ชันที่สร้างลิ้งก์เลือกหน้าให้เราโดยอัตโนมัติ

ในการใช้งานจริงนั้น ส่วนของ base_url  เราสามารถใช้ฟังก์ชัน base_url()  ของ  URL helper มาช่วยได้ เช่น

$config['base_url'] =  base_url().'/controller/function';

และสำหรับจำนวนข้อมูลทั้งหมดนั้น สามารถใช้ฟังก์ชัน count_all() ของ  Active record class มาช่วยนับจำนวน record ทั้งหมดในตารางได้ เช่น

$config['total_rows'] = $this->db->count_all('table');

สำหรับในกรณีที่ต้องการจำนวน record ที่ได้จากคำสั่ง query  สามารถใช้ฟังก์ชัน count_all_results() ของ   Active record class หรือฟังก์ชัน  num_rows()  จาก Result helper class ช่วยหาข้อมูลได้

ตัวอย่างการใช้ pagination class ใน controller มีดังนี้

function showdata()
{
	// Pagination section
	$config['base_url'] =  base_url().'/controller/showdata';
	$config['total_rows'] = $this->db->count_all('data_table');
	$config['per_page'] = '10';

	$this->pagination->initialize($config);
	$pagination_link = $this->pagination->create_links();
        // Send pagination link to Smarty
	$this->cismarty->assign('pagination_link', $pagination_link);

	// Get data from my_model
	$data = $this->my_model->get_data( $config['per_page'], $this->uri->segment(3) );
	$this->cismarty->assign('data', $data);

	// Output to browser
	$this->cismarty->display('showdata.tpl');
}

จากตัวอย่างข้างต้น  จะเห็นฟังก์ชัน get_data()  ต้องการ 2 อาร์กิวเม้นต์คือ $config[‘per_page’]  และ $this->uri->segment(3)

  • $config[‘per_page’]  ใช้สำหรับกำหนดจำนวนข้อมูลที่ต้องการให้แสดงในแต่ละหน้า  ดังที่อธิบายไว้ข้างต้น  ซึ่งจะถูกใช้เป็นค่าของ limit ในการ query ข้อมูล
  • $this->uri->segment(3)  เป็นการอ้างถึงค่าของ segment ที่ 3 ใน URL   เช่น เลข 5  ใน URL ต่อไปนี้  http://www.domain.com/controller/showdata/5  เป็นค่าที่อยู่ใน segment ที่ 3  ซึ่งจะถูกใช้เป็นค่า offset ในการ query ข้อมูล

ตัวอย่างฟังก์ชัน get_data() ของ my_model มีดังนี้

function get_data($per_page, $offset)
{

	$this->db->from('data_table');
	$this->db->limit($per_page, $offset);
	$query = $this->db->get();
	$data = $query->result_array();

        // Other code here ...
}

เทียบได้กับการใช้คำสั่ง  SELECT * FROM data_table  LIMIT  $per_page, $offset
($this->db->limit() เป็นฟังก์ชันของ Active record class)

อ้างอิง

ข้อมูลเพิ่มเติม