Jan 09

有安裝 Gallery 2 作為相簿系統的人可能跟我一樣,會在 Apache 的 error log 裡面看到一大串如下的 log:

PHP Notice: Undefined index: sfPhotosRecursiveLimit in [Gallery目錄]/modules/rss/SimpleRender.inc on line 78

追了一下程式,發現是變數沒處理好。
於是,我修改了 modules/rss/SimpleRender.inc,加了以下這段程式碼處理變數:

        if ( !isset($params['sfPhotosRecursiveLimit']) ) {
                $params['sfPhotosRecursiveLimit'] = $params['sfPhotosRecurseLimit'];
        }

修改過後的某個片段長這樣:

        $params['feedDate'] = $params['sfDate'];

        if ( !isset($params['sfPhotosRecursiveLimit']) ) {
                $params['sfPhotosRecursiveLimit'] = $params['sfPhotosRecurseLimit'];
        }

        /* apply defaults */

跟我一樣,覺得那些 log 很礙眼的,就參考一下吧。
我把 patch 一併貼到官方論壇了(Problem fix for RSS module),不知道會不會被採用就是了。

Technorati Tags: , ,

Tags: , ,
(Visited 1547 times)
Dec 10

我們在開發 PHP 專案時,時常會把一些常用變數放在某個 PHP 檔案,接著用 require()require_once()incluce()include_once() 等函式將之引入。
若系統目錄很複雜,就會在很多檔案裡面看到類似這樣的語法:

require_once('../../Config.php');

然而,當這種系統必須變動目錄結構與檔案所在目錄時,開發人員就得額外多花些時間來更改上述之程式碼。

其實,PHP 的設定檔中,有個很少被注意到的變數,就是 auto_prepend_file

假設目前有個 PHP 專案,專案根目錄之系統絕對路徑為 /var/www/html/Project,
共用設定檔為 /var/www/html/Project/Config.php 。
我們可以在 /var/www/html/Project 下建立 .htaccess 檔案,內容如下:

php_value auto_prepend_file "/var/www/html/Project/Config.php"

而 /var/www/html/Project 目錄下所有的檔案,以及所有子目錄中的檔案都會自行引入 /var/www/html/Project/Config.php 。

PS. 由於 auto_prepend_file 的設定是透過 require() 來實作,使用這種方法要特別注意以下兩點:

  1. 一旦設定了 auto_prepend_file ,該檔案就必須要存在,否則就會有 error ,導致該目錄下的所有 PHP 檔案無法正常執行。
  2. include_path 會影響 auto_prepend_file。

Technorati Tags: , , , , , , ,

Tags: , , , , , , ,
(Visited 2723 times)
Sep 27

以下是在 PTT 的 PHP 板看到某篇文章後的心得,以及小小的經驗分享。

Smarty 稍有經驗的人,應該都知道樣板內可使用 {include} 這個 tag 來嵌入其他 template file。
然而,因為 Smarty 內的變數都是全域變數,所以我對這個 tag 的看法是「能不用,就不用」。

用常見的網站論壇系統舉個簡單的例子:

  • A 設計師負責開發顯示 HTML header 的 template,使用了 $title 變數作為 page title,ex:
    <html><head><title>$title</title></head>
  • B 設計師負責開發顯示論壇文章內容的 template,恰巧也使用了 $title 作為文章標題。

若 B 設計師在其 template file 中使用了 {include} 來嵌入 A 設計師的 template file,就可能會產生預期之外的顯示結果。

當然,若是開發團隊已事先溝通好各項變數的命名,就不會有這種情況。
但為了減少此類風險,降低 debug 的難度,我們會選擇使用這種方式:

  • 在系統全域共用的函式檔案中增加負責顯示 HTML header 的 function,例如 function page_header($title) { ...} ,並在 function 中 assign 變數,引入 A 設計師開發的 template file。
  • 在論壇文章內容顯示的程式檔中,呼叫 page_header($title),再 assign 文章標題的變數,引入 B 設計師開發的 template file。

當然,若嵌入的 template file 內沒有任何變數,就不須考量以上的狀況,開發/設計人員可以大膽地隨意使用。 8)

Technorati Tags: , ,

Tags: , ,
(Visited 3712 times)
Sep 09

昨晚,有個學長透過 MSN 問我有無簡單好用的 PHP 圖形驗證碼,又讓我想到 reCAPTCHA
上一次使用時,reCAPTCHA 僅提供顏色變更;如今,reCAPTCHA 已經開始支援多國語言了。

剛才稍微玩了一下,寫了這個簡單的網頁
reCAPTCHA 的多國語言化相關資訊可以參考 這裡,而我使用的中文化程式碼片段為:

<script type="text/javascript">
	var RecaptchaOptions = {
		custom_translations : {
			visual_challenge : "取得圖形驗證碼",
			audio_challenge : "取得音效驗證碼",
			refresh_btn : "重新整理圖形",
			instructions_visual : "輸入兩個英文單字:",
			instructions_audio : "輸入您聽到的聲音:",
			help_btn : "獲得協助",
			play_again : "重新播放音效",
			cant_hear_this : "將音效下載為 MP3",
			incorrect_try_again : "錯誤! 請再試一次"
		}
	};
</script>

Technorati Tags: , , , ,

Tags: , , , ,
(Visited 4251 times)
Jul 18

這兩天在處理 RoundCube 的郵件中文夾檔問題。
原本覺得情況很詭異,因為 Firefox 都很正常,可是 IE 有這兩種狀況:

  • 直接以左鍵點選,中文檔名的附帶夾檔無法下載。
  • 以滑鼠中鍵(開新的 Tab),就正常了。

坦白說,RoundCube 的程式架構實在很難摸,所以追了蠻久的..

我幫忙追問題的 RoundCube 版本是 0.1-STABLE 。
最後追到的解法是去修改 program/steps/mail/get.inc , diff -u 生出來的檔案內容是這樣:

--- program/steps/mail/get.inc.orig     2008-07-18 02:01:46.000000000 +0800
+++ program/steps/mail/get.inc  2008-07-18 15:45:37.000000000 +0800
@@ -106,9 +106,19 @@
       }
     else
       {
-      header(sprintf("Content-Disposition: %s; filename="%s";",
+       $HTTP_USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
+
+       if (strstr($HTTP_USER_AGENT, "compatible; MSIE ") !== false &&
+            strstr($HTTP_USER_AGENT, "Opera") === false) {
+             header(sprintf("Content-Disposition: %s; filename="%s";",
+                     $_GET["_download"] ? "attachment" : "inline",
+                     $part->filename ? rawurlencode(abbreviate_string($part->filename, 55)) :
+                                       rawurlencode("roundcube.$ctype_secondary")));
+       } else {
+             header(sprintf("Content-Disposition: %s; filename="%s";",
                      $_GET["_download"] ? "attachment" : "inline",
                      $part->filename ? abbreviate_string($part->filename, 55) : "roundcube.$ctype_secondary"));
+       }

       // turn off output buffering and print part content
       $IMAP->get_message_part($MESSAGE["UID"], $part->mime_id, $part, true);

關鍵就在... 給 IE 吃的話,要先用 rawurlencode() 處理一遍。 XD

Technorati Tags: ,

Tags: ,
(Visited 8979 times)
Nov 10

這幾天接了一個 PHP 的系統要作,為了防止 Spambot,必須加入視覺驗證碼。

在眾多視覺驗證碼的 solution 中,我第一個想到的就是 reCAPTCHA

不過,根據以前用過的經驗,reCAPTCHA 還沒有多國語言支援的能力。

我看了一下他們給的 PHP library 跟 使用說明頁
很遺憾... 目前還是沒有支援多國語言。
reCAPTCHA 的 Forum 則是找到 這個討論串

雖然會擔心收到抱怨,不過依照目前的情況看來,只能先硬著頭皮上,然後靜待佳音了。
回覆 那個討論串 的文章催促一下,進度會不會比較快呀? XD

Technorati Tags: , ,

Tags: , ,
(Visited 1551 times)
Jun 11

之前我在 這篇文章 說過某台機器還在使用 PHP 4.4.0 的原因.

當天 gaod 大長輩 聽到我的哭訴後, 很好心的找了台機器測 CPG 1.4.6 .
運作是正常的.

可是這台機器上面的 phpBB 規模不算小, 所以我也就先擱著. :oops:

幾天前跟小竹子問過他們的 PHP 版本, 也是停在 4.4.0 . XD
所以也還沒動.

直到今天凌晨, 我把 PHP 升上 4.4.2 ( 本來先想燒香的, 可是我這邊沒有... =_=||| ) .
目前看來運作也都正常.

晚點通知小竹子好了. 8)

Technorati Tags: , ,

Tags: , ,
(Visited 3845 times)
May 23

自從 上次的 PHP 地雷事件 後, 目前手上兩三台有裝 CPGphpBB 的機器一直停在 PHP 4.4.0 .

可是現在要用 ports 升級 phpMyAdmin 卻會失敗, 還噴這串出來 :

This port requires the Apache Module or the CGI version of PHP, but you have already installed a PHP port without them.
*** Error code 1

跑到 /usr/ports/lang/php4 底下用 make config 把 Apache module 加進去, 還是會噴上面這串... T_T

目前 ports 裡面, PHP4 最新的版本是 4.4.2 , PHP5 是 5.1.4 , phpBB 的版本是 2.0.20 , CPG 是 1.4.6 .
麻煩有裝以上這些系統的好心的前輩提燈籠來指個路啊. :oops:

Technorati Tags: , , ,

Tags: , , ,
(Visited 4203 times)
Dec 30

升級 2.0 以後, 我發現 Twilight AutoSave 沒辦法用了.
( ychsiao 前輩也有在 這篇 說他的也不能用. XD )

目前在 plugin 的網頁是貼出了這段:

Please note: I offer no support for this plugin with WP 2.0 as of yet. The software is still beta, and works completely differently. I will see how I can upgrade this to work with 2.0 when I can (if it is possible).

於是我自己 trace 了一下 code , 發現問題出在這幾行 :

add_action("save_post", "twAutoSaveDelete");
add_action("publish_post", "twAutoSaveDelete");

save_post 跟 publish_post 僅存在於 1.5 版的 wp-admin/post.php 中, 2.0 版被拿掉了.
所以必須把上面那兩行改成 :

add_action("simple_edit_form", "twAutoSaveDelete");
add_action("edit_form_advanced", "twAutoSaveDelete");
add_action("edit_page_form", "twAutoSaveDelete");

另外, 我還看到一個小瑕疵, 在 tw-autosave.php 裡面有這段:

                        if (cookietemp.length > 100){
                                var endstring = "[...]";
                        }

可是 endstring 這個變數也沒有事先被定義, 而且這段 code 並沒有做例外處理, 所以當文章內容小於 100 字時, 我們會在文章回復框看到 undefined 的字串.
解法很簡單, 在 if (cookietemp.length > 100){ 上面加入這行就搞定了 :

                        var endstring = "";

目前改完以後看來都正常.
晚點把這些回報給作者, 跟他討論看看好了. :cool:

Technorati Tags: ,

Tags: ,
(Visited 7717 times)
Dec 30

升級 2.0 以後, 我發現 Recent Comments 的選項頁面出不來. :???:

於是, 拜 估狗大神 所賜, 我找到了 這頁 .

我按照文章裡面的說明修改 wp-content/plugins/get-recent-comments.php , 在這行:

// WordPress 1.5 includes this file again on the options page. Avoid duplicate declaration:

下面有段:

if ( function_exists("is_plugin_page") && is_plugin_page() ) {
        kjgrc_options_page();
        return;
}

然後把整段整個換成 :

add_action("options_page_get-recent-comments", "kjgrc_options_page" );

就好了. :cool:

Technorati Tags: ,

Tags: ,
(Visited 7687 times)