Tag: codeigniter

Using Static Context in CodeIgniter

Posted by – July 8, 2013

前些時候在專案開發時寫了一支 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

Posted by – July 31, 2012

CodeIgniter 內建了一套功能完整的分頁函式庫,不過有時候需要知道現在是第幾頁時,卻不知道從何取得。

雖然在文件上沒有寫,不過實際上有個內部變數在紀錄目前的頁數,只要使用

$this->pagination->cur_page

就能取得目前的頁數。

<?php

echo '您正在閱讀第  '.$this->pagination->cur_page.' 頁,共 '.ceil(($this->pagination->total_rows/$this->pagination->per_page)). ' 頁。';

?>

PHP: Reading $_GET variable

Posted by – January 10, 2012

在 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

Posted by – October 18, 2011

最近寫了幾支程式,在檢查時間的時候發現都慢了八小時,才想到應該是沒設定時區,PHP 的預設時區是 GMTUTC,而台灣是 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

Posted by – September 22, 2011

rss icon最近自己用 CodeIgniter 寫了個小網站,讓網友可以提供一些圖片素材。雖然後台有做了統計和紀錄功能,不過想再加一個訂閱 RSS 的功能,這樣我從 Google Reader 就能知道又有新素材出現。因為新網站是用 CI 寫的,想說就用 CI 寫一個 RSS feed。查了一資料,相關教學都有互抄的感覺,連 bug 都很一致是怎樣?

所以我又做了一些修改,確認每個瀏覽器打開都會認得它是一份 RSS 文件,Google Reader 也能正確讀取。

More

CodeIgniter: Using PHPMailer to Send Email via GMAIL

Posted by – September 21, 2011

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 好了。

More

CodeIgniter: Use Ellipsize Helper For Custom Encoding

Posted by – September 9, 2011

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 = ($position > 1) ? 1 : $position;

	if ($position === 1)
	{
		$end = mb_substr($str, 0,
			-($max_length - mb_strlen($beg, $codepage)), $codepage);
	}
	else
	{
		$end = mb_substr($str,
			-($max_length - mb_strlen($beg, $codepage)), $max_length, $codepage);
	}

	return $beg.$ellipsis.$end;
}

主要的修改是將 substr 與 strlen 換成 mb_substr 與 mb_strlen,然後加上編碼參數,並不是很複雜的修改。不過往後碰到需要截斷過長文字的程式都可以拿這支來用,實性用很高。

CodeIgniter: Display ActiveRecord Generated SQL

Posted by – September 2, 2011

感覺在台灣用 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 值。

$this->db->insert_id();