Category: Programming
-
Image Problems in HTML Emails
身為一個 PHP 工程師,寫過好幾支 Email 程式也是很正常的經歷,尤其是寄送廣告傳單 EDM 之類的功能。EDM 還是很多公司行號及機關愛用的行銷模式。美術人員製作 EDM 的時候通常會將廣告內容製成一張大圖,然後根據各個連結或功能來切割圖片,最後用表格 <table> 標籤來排版。雖然聽起來很古老,不過因為在 Email 裡能使用的 HTML、CSS 有限,所以老派的做法有其優點。
-
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 好了。
-
JavaScript: Convert Size In Bytes To Human Readable Format
在程式中處理檔案的時候,時常碰到的就是檔案大小的顯示。在資料庫裡通常是以 bytes 為單位做紀錄,但是顯示到畫面上,看到 479247294213 bytes 這種天文數字任誰都很難理解它到底有多大。 將天文數字轉換成普通人能夠輕易閱讀的型式很重要,所以 bytes 在畫面上要轉成 MB 或 GB 這類的型式。KB、MB、GB 之間都是 2^10 = 1024 為一個級數,所以轉換原理只要用遞迴一直除以 1024,直到小於 1024 就轉換完了。 以下這個寫法稍微特殊一點,不過原理並沒有差太多,是在找資料的時候看到的,在此留個筆記。 <script> $(function(){ $(‘span’).html(bytesToSize(479247294213)); }); function bytesToSize (bytes) { var sizes = [‘Bytes’, ‘KB’, ‘MB’, ‘GB’, ‘TB’, ‘PB’, ‘EB’, ‘ZB’, ‘YB’]; if (bytes == 0) return ‘n/a’; var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return…
-
CodeIgniter: Use Ellipsize Helper For Custom Encoding
CodeIgniter 的 Text Helper 裡有一個 function ellipsize(),用來截斷過長的文字,同時可以指定顯示長度、截斷位置,功能上相當不錯。 殘念的是這支 function 並不支援雙位元文字或其他特殊編碼的文字,拿中文字去切非常容易出現亂碼。所以決定幫這支程式做點小小的修改,讓它可以指定編碼,拿來截斷中文也沒問題。 function ellipsize($codepage = ‘UTF-8’, $str, $max_length, $position = 1, $ellipsis = ‘…’) { // 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 值。…
-
jQuery Validation plugin: How to Use Regex as Rule?
在網頁程式中,表單的處理一直是很繁瑣的一環,client 端要用 Javascript 先對使用者的輸入進行初步過濾,資料送到了 server 端還是要再過濾一次。「永遠不要信任使用者輸入的資料」是表單程式的準則。 為了網站的安全不可少的 SOP,結果便是程式設計師要為此付出許多時間撰寫過濾程式。為了減緩程式設計師的腦細胞死亡速度,借助第三方程式的功能也是很重要的課題。在網頁前端常會用 jQuery Validation plugin 來對使用者輸入的資料進行前處理,這個套件內建一些基本規則,像是必填 (required)、電子郵件 (email)、網址 (url)、數字 (digits) 等等,但偶爾還是需要自訂特殊規則。 還好 jQuery 這個套件提供開放的接口可以自訂功能,透過簡單的幾行程式就能用正規表達式 (regular expression, regex) 來指定規則。 // 建立名為 ‘regex’ 的自訂規則 $.validator.addMethod(“regex”, function(value, element, param) { // 強制加上 ^ 與 $ 符號限制整串文字都要符合 return value.match(new RegExp(“^” + param + “$”)); }); $(“#myForm”).validate({ rules: {// 定義規則 …
-
CSS 變更選取文字的背景色
在 CSS3 的規範中,多了一些選擇器 ( selector ) 的定義,提供設計師更多元的元素操作方法。其中一項新增的選擇器是 ::selection,表示被選取的文字。 透過這項選擇器便能做出不同的選取區背景色。簡單的範例如下 <style> p.yellow::selection { background: #fff2a8; } p.yellow::-moz-selection { background: #fff2a8; } </style> 選取以下的文字試試 If you want a reason as to why this decision has been made, Blizzard is happy to provide you with two. The first is of course piracy, which they believe an always-connected game…
-
PHP mail function 如何避免亂碼?
又是一個工作上碰到的問題,需要寫一個簡單的 email 發送功能。雖然是基本功能,不過常見的作法還是藉由 PHPMailer Library 來達成。不過這個案子因為寄信頻率很低,想說用 PHP 內建的 mail() 就可以處理了。但是人算不如天算,怎知 mail() 成功了,但是卻是一堆亂碼,標題、寄件人欄位都是亂碼….. 囧 經過一番 Google Search 的奮戰,找到一個很 tricky 的解決方法。將會出現亂碼的文字用以下方式處理…. “=?UTF-8?B?”.base64_encode(” 會出現亂碼的文字 “).”?=” 這樣用 GMAIL 收到信的時候就可以看到正常的文字了。 mail function 範例如下… function sendMail($recipient){ $subject = “=?UTF-8?B?”.base64_encode(“信件標題”).”?=”; $headers = “MIME-Version: 1.0\r\n”; $headers .= “Content-type: text/html; charset=UTF-8\r\n”; $headers .= “From: “.”=?UTF-8?B?”.base64_encode(“寄件人 “).”?=”; $headers .= “<sender@email.com>”; $message = ‘<p><font size=”3″ face=”新細明體”>信件內文</font></p>…