Category: CodeIgniter

  • Codeigniter: Check if libraries/helper/core files is loaded

    使用 CodeIgniter 框架開發時,會透過 $this->load->library() 之類的方法來載入特定的檔案。在 CI 的 routing 規則中,同一個檔案只會被載入一次,因此多寫幾次 $this->load->library() 是不會發生什麼慘劇的。 不過有時候還是想確認到底某 class 有沒有載入過,而不想到處丟 $this->load->xxx() 的話,可以用以下方法來確認。 if (class_exists(‘Library’)) { $this->library->myMethod(); } 要注意的是 CI 有別名的規則,比如說有個 model 叫 ‘file_model’。使用別名載入時,會寫成以下 $this->load->model(‘file_model’, ‘file’); $this->file->do_something(); 這種情況下,若要檢查是否已載入,要用原名。如下: if (class_exists(‘File_model’)) { // do something }

  • Using Static Context in CodeIgniter

    前些時候在專案開發時寫了一支 API,其中大部份的方法是以 static 方式呼叫的。 最近想把這支程式放到 CodeIgniter 裡當 Library 用。第一次在 CI 呼叫 static method,用起來還挺簡潔的。 <?php $this->load->model(‘user’); $user = User::get_by_email_address(‘qoding@example.com’); // print all of the comments by the user echo “<h2>Comments by $user->name</h2>”; foreach ($user->comments() as $comment) { echo “<p>$comment->body</p>”; } ?>  

  • CodeIgniter: How to get current page with pagination library

    CodeIgniter 內建了一套功能完整的分頁函式庫,不過有時候需要知道現在是第幾頁時,卻不知道從何取得。 雖然在文件上沒有寫,不過實際上有個內部變數在紀錄目前的頁數,只要使用 $this->pagination->cur_page 就能取得目前的頁數。 <?php echo ‘您正在閱讀第  ‘.$this->pagination->cur_page.’ 頁,共 ‘.ceil(($this->pagination->total_rows/$this->pagination->per_page)). ‘ 頁。’; ?>

  • PHP: Reading $_GET variable

    在 PHP 環境下要取得 GET 變數的內容只要用 $_GET 就可以取得,不過在 CodeIgniter Framework 或其他特殊環境下,$_GET 預設是被關掉的時候,想要正常使用 GET (如 AJAX) 時就得費一點點工夫了。 <?php $url_segs = parse_url($_SERVER[‘REQUEST_URI’]); parse_str($url_segs[‘query’], $_GET); // urldecode automatically print_r($_GET); // 印出 $_GET 內容 ?> 完工,就醬。  updated Feb 1, 2012 後來才注意到 CI 的 config.php 大約在 157 行的地方有一行設定 $config[‘allow_get_array’]        = TRUE; 預設打開了 $_GET,不需要用上述的方法,改用 $this->input->get() 即可取得 $_GET 內容。

  • CodeIgniter: How To Set date.timezone

    最近寫了幾支程式,在檢查時間的時候發現都慢了八小時,才想到應該是沒設定時區,PHP 的預設時區是 GMT 或 UTC,而台灣是 GMT +8,所以系統慢了八小時。 在不改 php.ini 的前提下,可以將時區設定寫在 CodeIgniter 的 index.php 裡面。 // Insert code before this line, // require_once BASEPATH.’codeigniter/CodeIgniter’.EXT; if( ! ini_get(‘date.timezone’) ) { date_default_timezone_set(“Asia/Taipei”); } 這樣就完成 CI 的時區設定了。這段設定要放在 require_once BASEPATH.’codeigniter/CodeIgniter’.EXT; 之前。

  • CodeIgniter: Build RSS Feed

    最近自己用 CodeIgniter 寫了個小網站,讓網友可以提供一些圖片素材。雖然後台有做了統計和紀錄功能,不過想再加一個訂閱 RSS 的功能,這樣我從 Google Reader 就能知道又有新素材出現。因為新網站是用 CI 寫的,想說就用 CI 寫一個 RSS feed。查了一資料,相關教學都有互抄的感覺,連 bug 都很一致是怎樣? 所以我又做了一些修改,確認每個瀏覽器打開都會認得它是一份 RSS 文件,Google Reader 也能正確讀取。

  • CodeIgniter: Using PHPMailer to Send Email via GMAIL

    CodeIgniter 內建的 Email Class 對雙位元文字的處理實在很糟,設了 charset 也無法正確寄出 UTF-8 中文信件,從 1.7.1 到 2.0.3 都沒有解決這個問題。同事的處理手法有點囧,是用 iconv 把繁中轉成 GBK 再寄送,但這個方法也不完美,不是每個 Email Client 都能正確無誤地顯示,而且標題也有字數限制。 最近要處理一個電子報系統,再用 CI 那跛腳 Email Class 大概會被客訴到瘋掉。所以還是認命改用老牌的 PHPMailer Library。稍微試一下,發現在 CI 裡使用 PHPMailer 相當無痛,先到官網下載一份 PHPMailer (本文完成時的最新版本是 5.2.0),解壓縮後把整個資料夾丟到 CI\application\libraries\PHPMailer_5.2.0。接著在 libraries 下建立新檔案,就叫 mailer.php 好了。

  • CodeIgniter: Use Ellipsize Helper For Custom Encoding

    CodeIgniter 的 Text Helper 裡有一個 function ellipsize(),用來截斷過長的文字,同時可以指定顯示長度、截斷位置,功能上相當不錯。 殘念的是這支 function 並不支援雙位元文字或其他特殊編碼的文字,拿中文字去切非常容易出現亂碼。所以決定幫這支程式做點小小的修改,讓它可以指定編碼,拿來截斷中文也沒問題。 function ellipsize($codepage = ‘UTF-8’, $str, $max_length, $position = 1, $ellipsis = ‘&hellip;’) { // Strip tags $str = trim(strip_tags($str)); // Is the string long enough to ellipsize? if (mb_strlen($str, $codepage) <= $max_length) { return $str; } $beg = mb_substr($str, 0, floor($max_length * $position), $codepage); $position…

  • CodeIgniter: Display ActiveRecord Generated SQL

    感覺在台灣用 CodeIgniter 開發的公司還不少,CodeIgniter (簡稱 CI) 是以 MVC 為基礎的 PHP framework,輕量以及容易上手是相當吸引人的特色。 CI 的 Database Library 中實作了 ActiveRecord 的功能,雖然它實際上是個 query builder,而不是真正的 ActiveRecord pattern,不過對於開發人員來說還是能有效地完成資料庫的存取動作,並減少自己組合 SQL 的麻煩。 在撰寫存取資料的 Model 時,經常需要查看 query string 來 debug,CI 提供了兩個方法來取得 query builder 產生出來的 query string。 一個是在 query 執行前用 $this->db->_compile_select(); 另一個是在 query 執行後用 $this->db->last_query(); 雖然不太清楚為什麼要分成執行前執行後,不過至少提供了 debug 的工具。 另外在成功 insert 資料後,也可以用下列方法取回自動增加 (auto increment) 的 id 值。…