ในการทำ Code Completion ใน Netbeans ทำได้ 2 วิธีโดยวิธีแรกนั้น ลุงบ๊อบ สมาชิกภายในบอร์ด CodeIgniter ได้แปลและนำมาเผยแพร่ให้แก่ชุมชมแห่งนี้ครับ
วิธีแรกโดยลุงบ๊อบ
ผมคนนึงแหละคับที่ใช้ netbeans เขียนเพราะว่ามันมี feature ที่ผมชอบคือ Code completion
ซึ่ง ธรรมดาแล้วถ้าเรายังไม่ทำการ define class property ลงไป (ตามด้านล่าง) จะไม่สามารถทำ Code completion กับ codeigniter ได้อย่างสมบูรณ์..ต่อไปนี้ผมจะเป็นวิธีการ implement Codeigniter กับ Code completion ของ Netbean นะคับ1. พิม /** แล้วกดปุ่ม enter ตรงนี้ืำทำใต้ tag <?php นะคับ2. มันจะ Display เป็น block ออกมาแบบนี้
3. ต่อไปเราจะทำการ define class property ลงไปใน block ที่เราสร้างขึ้น
จากนั้นมันจะขึ้นเป็น หน้าต่างตัว Code completion ขึ้นมาให้เราเลือกว่าเราจะ define ตัีวไหน4. Just for example, we want to use some functions from the email class .. * @property CI_Email $email ...ทีนี้เราก็สารถ พิม $this->CI_Email -> แล้วก็จะมี Code completion ขึ้นมาแล้วคับตัวอย่างหลายๆอัน/*** @property CI_Loader $load* @property CI_Form_validation $form_validation* @property CI_Input $input* @property CI_Email $email* @property CI_DB_active_record $db* @property CI_DB_forge $dbforge*/ซึ่งสามารถทำไปต่อยอดเป็น Template หรือ abbreviation ต่อได้คับผิดพลาดประการใดต้องขอโทษด้วยครับผม
วิธีที่สองเพิ่มเติมจากลุงบ๊อบ
ล่าสุดเราไม่จำเป็นจะต้องทำแบบนี้กับทุกไฟล์ที่เราต้องการใช้ Code Completion อีกต่อไป เราเพียงนำไฟล์นี้ ไปใส่ในโฟลเดอร์ nbproject ของโปรเจคเรา แล้วเปลี่ยนชื่อจาก netbeans_ci_code_completion.php.txt เป็น netbeans_ci_code_completion.php แค่นี้ก็ใช้งานได้แล้ว
ปล. สำหรับคนที่เห็นเป็น netbeans_ci_code_completion.php เฉยๆให้เปิดโชว์นามสกุลโดยเข้าไปใน folder แล้วกด Tools->Folder Options-> แท็บ View แล้วให้ติกถูกออก Hide extensions for known file types ก็จะเห็น .txt ขึ้นมาแล้ว ก็ให้เปลี่ยนชื่อตามที่บอกเป็นอันเสร็จ
References :http://codeigniter.com/forums/viewthread/94145/#522295http://www.mybelovedphp.com/2009/01/23/netbeans-revisited-code-completion-for-code-igniter/http://www.mybelovedphp.com/2009/01/27/netbeans-revisited-code-completion-for-code-igniter-ii/
เคยเป็นไหมที่ทำงานบนเครื่อง แล้วเมื่อทำเสร็จแล้วเวลาจะนำขึ้นไปใช้บน Server จริงแล้วต้องมานั่งแก้ base url ให้ตรงกับเซิร์ฟเวอร์ที่เราจะนำขึ้นไป เพื่อแก้ปัญหานี้ผมเอา code ที่จะทำให้เราไม่ต้องมาคอยแก้ไขตรงส่วนนี้อีกเลย โดยบทความนี้ได้เอามาจาก Codeigniter's Wiki : Automatic config base url อันนี้ โดยวิธีทำก็ง่ายๆครับ เข้าไปที่ config.php ของ CodeIgniter เสร็จแล้วนำโค้ดตรงส่วนนี้แทนที่ $config['base_url'] ของเดิม
$config['base_url'] = "http://".$_SERVER['HTTP_HOST']; $config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
โดยโค้ดด่านบนนั้นจะใช้ได้เฉพาะแบบ http ส่วน https นั้นจะต้องใช้โค้ดด้านล่างนี้ (ถ้าทำแล้วต้องยุ่งทั้งสองอย่าง ก็ใช้ด้านล่างครับ แต่ถ้าไม่ code ด้านบนก็เพียงพอ)
$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http"); $config['base_url'] .= "://".$_SERVER['HTTP_HOST']; $config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
หรืออันนี้ซึ่งเป็นแบบสั้นของอันที่สอง ซึ่งให้ผลเหมือนกัน
$config['base_url'] = "http://".$_SERVER['HTTP_HOST'].str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
เวอร์ชั่นนี้ได้ลองใช้กับ CodeIgniter 1.7.1 แล้วซึ่งบทความที่แท้จริงมาจาก ที่นี้ ครับ ซึ้งเป็นบทความภาษาอังกฤษ โดยผมสรุปขั้นตอนดังนี้ครับ
เป็นอันเสร็จขั้นตอนเบื้องต้นที่นี้เป็นวิธีการเรียกใช้สำหรับรุ่นใหม่ๆแล้วลองใส่ตัวอย่างดังนี้ ใน Controller ของคุณครับ
<?php
class Welcome extends Controller {
function Welcome()
{
parent::Controller();
}
function index()
{
// อันนี้แบบเก่า
//$this->load->library('zend', 'Zend/Service/Flickr');
// เราใช้วิธีนี้เป็นแบบ CodeIgniter แบบใหม่
$this->load->library('zend');
$this->zend->load('Zend/Service/Flickr');
$flickr = new Zend_Service_Flickr('YOUR_FLICKR_API_KEY');
$results = $flickr->tagSearch('php');
foreach ($results as $result)
{
echo $result->title . '<br />';
}
//$this->load->view('welcome_message');
}
}
?>
เสร็จแล้วง่ายไหม ? แต่มีข้อยกเว้นอย่างหนึ่งครับ เจ้า Zend นั้นใช้ได้เฉพาะบน PHP 5 ดังนั้นใครใช้ PHP 4 หมดสิทธิ์ใ้ช้ครับ
ไหนๆ ก็ทดลองเล่น Codeigniter 1.7.1 แล้ว ก็ลองจับ ADOdb มาใช้ซะเลย ไปเจอข้อมูลใน jQueryTips by Tee++ ดูแล้วน่าจะ work แต่ลองทำตามแล้วใช้ไม่ได้
รวมไปถึงมีข้อจำกัดว่า ถ้าผมจะใช้หลาย Database ก็จะเจอปัญหา เพราะของคุณ Tee++ จะระบุไปเลยว่าอ่านจาก $active_group ซึ่ง มันจะใช้ได้ตัวเดียวเท่านั้นคือ Database ตัวล่างสุดที่เราทำการ config ไว้
เลยลองไปค้นๆ ดูอีกที ที่ narisa.com ตัวนี้ก็ดีครับ แก้ปัญหาเรื่องจะใช้หลาย Database ได้ เพราะได้ส่ง parameter บอกไปด้วยว่าจะใช้ config group ไหน
ว่าแล้วก็จับเอาสองตัวนี้มาผสมกันเสียเลย ใครจะใช้ก็นำไปใช้ได้เลยนะครับ ทำตามนี้
1. โหลด ADOdb Lib มาก่อน ที่นี่ Download ADBDB Library (ที่ผมทดสอบเป็น ADOdb for php5)
2. คลาย zip ไว้ที่ /application/libraries/ ก็จะได้เป็น /application/libraries/adodb5
3. สร้างไฟล์ชื่อ Adodb.php นำโค้ดด้านล่างมาใส่ แล้วนำไปไว้ใน /application/libraries/
class Adodb {
function Adodb($params=null) {
// check if adodb already loaded
if (!class_exists('ADONewConnection')) {
require_once(APPPATH.’libraries/adodb5/adodb.inc.php’);
}
// database handler’s name, defaults to ‘adodb’
$dbh = (isset($params['name'])) ? $params['name'] : ‘adodb’;
// the db settings group from the database.php config
$db_group = (isset($params['group'])) ? $params['group'] : ”;
$this->_init_adodb_library($dbh,$db_group);
}
function _init_adodb_library($dbh,$db_group) {
// get database config
include(APPPATH.’config/database.php’);
// check which database group settings to use
// default to database setting default
$db_group = (!empty($db_group)) ? $db_group : $active_group;
$cfg = $db[$db_group];
// check that driver is set
if (isset($cfg['dbdriver'])) {
$CI->$dbh =& ADONewConnection($cfg['dbdriver']);
// set debug
$CI->$dbh->debug = $cfg['db_debug'];
if ($cfg['cache_on'] && is_dir(APPPATH.$cfg['cachedir'])){
GLOBAL $ADODB_CACHE_DIR;
$ADODB_CACHE_DIR = APPPATH.$cfg['cachedir'];
}
// check for persistent connection
if ($cfg['pconnect']) {
// persistent
$CI->$dbh->PConnect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die(”can’t do it: ” . $CI->$dbh->ErrorMsg());
}
else
{
//normal
$CI->$dbh->Connect($cfg['hostname'],$cfg['username'],$cfg['password'],$cfg['database']) or die("can’t do it: " . $CI->$dbh->ErrorMsg());
}
if ($cfg['char_set'] && $cfg['dbcollat']) {
$CI->$dbh->Execute(’SET character_set_results=’.$cfg['char_set']); $CI->$dbh->Execute(’SET collation_connection=’.$cfg['dbcollat']); $CI->$dbh->Execute(’SET NAMES ‘.$cfg['char_set']);
}
return true;
}
else {
die(”database settings not set”);
return false;
}
}
}
วิธีการใช้งานก็ลองตามนี้เลยครับ (เอาไว้ทดสอบว่าใช้ได้หรือไม่) $this->load->library('adodb',array('name'=>'db1','group'=>'slave')); print_r($this->db1);
- db1 คือ ชื่อ object ที่จะใช้งาน - slave คือ ชื่อ group ของ database ที่เราจะใช้งาน ($active_group ใน config นั่นเอง)
ใครลองแล้วได้ความว่าไง แชร์ประสบการณ์หน่อยนะครับ
------------- เกร็ดเล็กๆ จากการทดสอบ หากจะใช้ SQLite 3 ให้ทำการคั้ง driver เป็น 'pdo' จากนั้นเวลาระบุที่อยู่ไฟล์ ให้ใช้ระบุใน hostname ครับ ไม่ใช่ใน database เพราะโค้ดมันนะ hostname มานำหน้า และนำ hostname ไปตัดเพื่อหา DNS อีกทีว่าเราใช้ PDO กับอะไร รวมไปถึง char_set และ dbcollat ตั้งให้เป้น false ทั้งคู่ ดังนั้นเวลาระบุ จะต้องเป็นประมาณนี้ครับ ถึงจะใช้ได้
$active_group = “sqlite_test”; $active_record = TRUE; $db['sqlite_term']['hostname'] = “sqlite:/usr/sqlite_file/database.sqlite”; $db['sqlite_term']['username'] = “”; $db['sqlite_term']['password'] = “”; $db['sqlite_term']['database'] = “”; $db['sqlite_term']['dbdriver'] = “pdo”; $db['sqlite_term']['dbprefix'] = “”; $db['sqlite_term']['pconnect'] = FALSE; $db['sqlite_term']['db_debug'] = TRUE; $db['sqlite_term']['cache_on'] = FALSE; $db['sqlite_term']['cachedir'] = “”; $db['sqlite_term']['char_set'] = FALSE; $db['sqlite_term']['dbcollat'] = FALSE;
[อ้างอิงจาก Codeigniter 1.7.1 + ADOdb for PHP5 + SQLite3]