您在這裡

修改模組問題

hugh77417's 的頭像
hugh77417 在 2009-08-05 (三) 03:18 發表

各位前輩 ,小弟摸 drupal 有一陣子了
最近想要來嘗試修改模組就挑中了birthdays,卻是困難重重,XD 希望各位前輩指點

//****************要修改的地方*********************//
$output .= ''. theme('username', $account) .' '. $age .''. _birthdays_show_date($account->{$_birthdays_field->name}, $account) .'';

//*******************想修改的事情******************//
把 本來顯示 '使用者名稱' ( theme('username', $account) ) 改成暱稱

//*******************修改的程式碼******************//

1. $name=theme('username', $account);
2. $name=(string)$name;
3. $sql="SELECT uid FROM users WHERE `name`='".$name."'";
4. $query=mysql_query($sql);
5. $uid=mysql_fetch_row($query);
6. $uid=$uid[0];
7. $sql="SELECT value FROM profile_values WHERE uid=$uid AND fid=2";
8. $query=mysql_query($sql);
9. $o_name=mysql_fetch_row($query);
10. if($o_name[0]=='')$o_name[0]=theme('username', $account) ;
11.$output .= ''. $o_name[0] .' '. $age .''. _birthdays_show_date($account->{$_birthdays_field->name}, $account) .'';

//*******************碰到的問題******************//
在地3行的 $sql="SELECT uid FROM users WHERE `name`='".$name."'"; sql 語法 不論怎麼執行都沒有結果,
把他echo 出來看 得到
SELECT uid FROM users WHERE `name`='root'
drupal 也沒有顯示錯誤 但是 $uid 就是沒有值 (echo 出來空)

妙的是 我把第三行 變數$name 拿掉 改成 輸入 'root' 或著 'test' 或著其他 username ,$uid 就會有結果了,這到底是為什麼壓,希望各位前輩指點一下,非常感恩。

$name=theme('username', $account); 輸出套版過的使用者帳號,所以可能包含 html
把 $sql="SELECT uid FROM users WHERE `name`='".$name."'";
改成 $sql="SELECT uid FROM users WHERE `name`='".$account->name."'"; 試試

另外 在模組內使用 mysql_query 等相關函式還蠻怪的
應該使用 drupal 核心提供的 db layer 相關函式才對

還有 你是直接修改模組檔案內的程式碼嗎
除非是自行開發的模組
不然直接變更模組內的程式碼
在 drupal 來說是最不建議的作法

先感謝Hom大的回覆,解決我一個不眠凌晨的問題(P.S. 一直很想找機會認識您,可惜每次聚會都剛好無法參加)

想再請教您幾個問題

1.$sql="SELECT {profile_values}.value FROM {profile_values},{users} WHERE {profile_values}.uid={users}.uid AND {profile_values}.fid=%d AND {users}.name = %s";
$query=db_query($sql,2,$account->name);
$o_name=mysql_fetch_row($query)-------------------------------<<現在的做法
//$o_name=db_fetch_object($query); ---------------------------<<這一行該如何撰寫,才能拿到利用drupal db layer拿到想要的資料
2.如果我想利用thme()把我的結果像她一樣包起來該引如什麼樣的參數哩?
有了 hom大的提醒 發現 她本來是 username 那我該如何才能得到 暱稱
3. db layer 要到哪裡看相關文件
4. 建議的做法是?

1.
$sql="SELECT {profile_values}.value FROM {profile_values},{users} WHERE {profile_values}.uid={users}.uid AND {profile_values}.fid=%d AND {users}.name = %s";
$query=db_query($sql,2,$account->name);
$o_name=mysql_fetch_row($query)-------------------------------<<現在的做法
//$o_name=db_fetch_object($query); ---------------------------<<這一行該如何撰寫,才能拿到利用drupal db layer拿到想要的資料


$sql = 'SELECT p.value, FROM {profile_values} AS p INNER JOIN {users} AS u ON p.uid = u.uid WHERE p.fid = %d AND u.name = "%s" ';
$query = db_query($sql, 2, $account->name);
if(db_num_rows($query)){
$profile = db_fetch_array($query);
$nickname = $profile['value'];
}

2.
theme('my_birthday'); // 'my_birthday' 可以改成其他字串,只要不跟現有的一樣就可以了

theme('my_birthday', $arg1, $arg2, ......, $argN); 來傳入其他的參數

然後必須新增一個 function theme_my_birthday() 來接受 theme() 的呼叫
函式回傳字串的輸出即可
或是 function theme_my_birthday($arg1, $arg2, ......, $argN) 接受傳入的參數

3.
文件 http://api.drupal.org/api/group/database/5

4.
針對模組內有 theme function 的部份覆寫
像是 theme('username', $account);
可以在自製的模組 或 版型的 template.php 之內
加上 function phptemplate_username($account){} 的函式
會取代原始的 theme('username', $account); 的輸出
在 phptemplate_username 內將輸出改為 暱稱 即可
要注意的是凡是有透過 theme('username', $account); 輸出帳號的部份都會被影響到

如果不希望影響到其他部分的帳號顯示
只要修改 birthdays 輸出的部份的話
就往上找上一層的 theme function
像是
function theme_birthdays_page($accounts = array(), $filter_month, $filter_year){}
function theme_birthdays_block($birthdays, $amount, $delta) {}
如果你修改的部份是在這 function 裡面
將整個 function 包含裡面的程式碼
複製到 自製的模組 或版型裡的 template.php
含後把函式開頭的 theme_ 改成 phptemplate_
像是
function phptemplate_birthdays_page($accounts = array(), $filter_month, $filter_year){}
function phptemplate_birthdays_block($birthdays, $amount, $delta) {}
就會覆寫原始的函式
然後才在改為 phptemplate_ 開頭的函式內修改程式碼