|
本館粉絲專頁 |
|
|
使用者:台灣阿成/我的工作日誌/2005/12
台灣棒球維基館
目次 |
[編輯] 12/5修改用戶列表程式
問題:原用戶列表程式依名稱排序,想要依用戶註冊順序(即ID)排序。
- 將 SpecialListuser.php 複製成 SpecialListuserbyid.php。
- 再修改 SpecialListuserbyid.php。
- 本來這樣:
class ListUsersPage extends QueryPage { ... function getName() { return "Listusers"; ... function getSQL() { return "SELECT ur_rights as type, $userspace as namespace, user_name as title, " . "user_name as value FROM $user LEFT JOIN $user_rights ON user_id = ur_user"; } ... function formatResult( $skin, $result ) { ... if( '' != $result->type) { $name .= ' (' . $skin->makeLink( wfMsgForContent( 'administrators' ), $result->type) . ')'; } ... /** * constructor */ function wfSpecialListusers() { ... $slu = new ListUsersPage(); ...
- 改成這樣:
class ListUsersbyidPage extends QueryPage { ... function getName() { return "Listusersbyid"; ... function getSQL() { return "SELECT ur_rights as type, $userspace as namespace, user_name as title, " . "user_id as value FROM $user LEFT JOIN $user_rights ON user_id = ur_user"; } ... function formatResult( $skin, $result ) { ... if( '' != $result->type) { $name .= ' (id=' . $result->value . '; ' . $skin->makeLink( wfMsgForContent( 'administrators' ), $result->type) . ')'; } else { $name .= ' (id=' . $result->value . ')' ; } ... /** * constructor */ function wfSpecialListusersbyid() { ... $slu = new ListUsersbyidPage(); ...
- 再修改 SpecialPage.php
$wgSpecialPages = array( //... //加這一行 'Listusersbyid' => new SpecialPage( 'Listusersbyid' ), //...
- 成功:
- 依名稱:Special:Listusers;
- 依ID:Special:Listusersbyid
- 未解決問題:在特殊頁面裡,有多出一個<listusersbyid>選項,點入可到Special:Listusersbyid頁面,但標題卻無法正常顯示成中文。
- 找到了!到Language.php中,加一個字串到$wgAllMessagesEn陣列中,就可以在系統介面的Allmessages清單中多一行出來了:
'listusers' => 'User list', 'listusersbyid' => 'User list, sorted by UserID', <-- 加這一行 'listadmins' => 'Admins list',
- 然後進特殊頁面/系統介面,把這行訊息改成中文即可。
[編輯] 12/6撰寫程式轉換Log檔格式
- 花了一整天時間,寫了幾支程式來將Log檔格式轉換成一致(見:檢索記錄檔)。這樣就可以很容易的匯入EXCEL進行檢索記錄的統計分析了。
- 心得:眼睛開始老花了,看程式碼看到有點頭昏眼花。
[編輯] 12/8 RecentchangesA程式
- Recentchanges程式可用來檢視「X天內」或「某時間點之後」的更改;
- 改寫成RecentchangesA:可以檢視「X天前」或「某個時間點之前」的更改。
- 目前能Work,但介面未完善。另發現Recentchanges最多只紀錄2千多筆。
[編輯] 12/9整理Log檔
把serchLog檔略做整理:
- logs/utf-8_old資料夾:
- 紀錄格式還未統一前的原始Log檔放在這裡面(searchLogxxxxxx.txt,以UTF-8編碼)。
- logs/big5_new_excel資料夾:
- 為了匯入Excel進行統計分析,先把UTF-8編碼的Log檔轉存成Big5編碼格式放進這裡面(searchLogxxxxxx.txt),再以PHP程式轉換成統一的記錄格式(searchLogxxxxxx_new.txt),然後匯入Excel準備作進一步分析(searchLog.xls)。
- logs資料夾:
- 轉換成統一紀錄格式後的Log檔(searchLogxxxxxx_new.txt),從Big5轉存成UTF-8編碼(searchLogxxxxxx.txt)取代原來的檔案,存放在這裡。另外,也改寫程式將記錄檔的路徑指到此處。
[編輯] 12/10使用者記錄檔
- 在index.php中加入記錄user actions的程式:
// to record the user actions global $wgIP; $fp = fopen("logs/actionLog" . date("Ymd") . ".txt","a"); $date = date("Y-m-d,H:i:s"); if ( isset( $_SESSION['wsUserName'] ) ) { $sUser = "User" . "," . $_SESSION['wsUserName']; } else { $sUser = "IP" . "," . $wgIP; } $outputstring = $date. "," . $title . "," . $action . "," . $sUser . "\n"; fwrite($fp, $outputstring); fclose($fp); //
- 因資料量很大,所以先採用一日一檔方式,如果還是很大,將來可考慮採用一小時一檔來儲存。
- 測試:約凌晨1點至早上11點半。
- 結果:檔案果然很大!!才測試半天就將近1.5MB,先把Link拿掉,以免被點選,誤認為當機。
- 問題:因程式放在index.php中,所以只要有人點閱就會紀錄。但從記錄下的資料來看,似乎有些使用者會被重複紀錄,需再Debug。
[編輯] 12/11 完成actionLog程式
- 修改程式使其能依日期、時間自動產生資料夾和檔案:每日一個資料夾,每小時一個檔,存在searchLogYYYYMMDDHH.txt檔案中,其中YYYYMMDDHH分別為年、月、日、時。
- 程式中加入判斷若$title為"-"或"",或$action為"raw"(暫時不知此action何用?),則不予紀錄。
- 修改完成的程式碼(在index.php中):
... // to record the user actions global $wgIP; $path = "logs/actionLogs/" . date("Ymd"); $filename = "/actionLog" . date("YmdH") . ".txt"; if(!is_dir ($path)) { mkdir($path); } $fp = fopen($path . $filename,"a"); $date = date("Y-m-d,H:i:s"); if ( isset( $_SESSION['wsUserName'] ) ) { $sUser = "User" . "," . $_SESSION['wsUserName']; } else { $sUser = "IP" . "," . $wgIP; } $outputstring = $date. "," . $sUser . "," . $action . "," . $title . "\n"; if ($title != "" and $title != "-" and $action != "raw") {fwrite($fp, $outputstring);} fclose($fp); ...
[編輯] 12/12 修改searchLog程式
- 在searchLog中記錄找到的資料數:
- -1:表示使用者找到百分之百符合的頁面,且直接進入閱讀;
- 0:表示使用者沒有找到任何符合的頁面;
- >0:表示使用者找到標題或內容符合的頁面,不過僅記錄顯示的第一頁清單數量。
待解決問題:
- 12月份的searchLog檔有兩種格式混雜,要人工調整一下。
- 這一兩天註冊的使用者,若用中文帳號會亂碼。(資料庫內另一個名稱欄位也亂碼了)
- 在寫梅花旗時發現NDAPNews有兩篇新聞未拆:12223、12255
- NDAPNews的新聞日期、新聞來源拿到上面。
[編輯] 12/23 紀錄頁面Counter完成
- 為使actionLog檔能紀錄「頁面瀏覽次數」,更改 index.php 中的紀錄程式如下。
- 結果:2005-12-23,00:57:12,User,台灣阿成,view,首頁,645762
// to record the user actions to actionLog files // begin global $wgIP; $path = "logs/actionLogs/" . date("Ymd"); $filename = "/actionLog" . date("YmdH") . ".txt"; if(!is_dir ($path)) { mkdir($path); } $fp = fopen($path . $filename,"a"); $date = date("Y-m-d,H:i:s"); if ( isset( $_SESSION['wsUserName'] ) ) { $sUser = "User" . "," . $_SESSION['wsUserName']; } else { $sUser = "IP" . "," . $wgIP; } // 加這兩行: $count = $wgArticle->getCount(); if ( !$count ) { $count = "Null"; } // 改這一行: $outputstring = $date. "," . $sUser . "," . $action . "," . $title . "," . $count . "\n"; if ($title != "" and $title != "-" and $action != "raw") {fwrite($fp, $outputstring);} fclose($fp); // end
[編輯] 12/28 顯示貢獻者
- 修改 Credits.php, DefaultSetting.php 和 Article.php 三支程式,使得每個頁面最下方,可以顯示出最近N位貢獻者(目前設定為3位)。此外,還改了系統介面訊息lastmodifiedby 和 othercontribs。
- DefaultSetting.php:
$wgMaxCredits = 3;
- Credits.php
function showCreditsPage($article) { ... $s = getCredits($article, $wgMaxCredits, $wgShowCreditsIfMax); ... function getCredits($article, $cnt, $showIfMax) { ... $s .= ' ' . getContributorCredits($article, $cnt - 1, $showIfMax); ... function getAuthorCredits($article) { ... // $author_credit = wfMsg('siteuser', creditLink($user_name)); $author_credit = creditLink($user_name); ... function getContributorCredits($article, $cnt, $showIfMax) { ... // $user = wfMsg('siteusers', $user); } ...
- Articles.php:
function getContributors($limit=0, $offset = 0) { ... /* $sql = "SELECT old_user, old_user_text, user_real_name, MAX(old_timestamp) as timestamp FROM $oldTable LEFT JOIN $userTable ON old_user = user_id WHERE old_namespace = $user AND old_title = $encDBkey AND old_user != $user GROUP BY old_user, old_user_text, user_real_name ORDER BY timestamp DESC"; */ $sql = "SELECT old_user, old_user_text, user_real_name, MAX(old_timestamp) as timestamp FROM old LEFT JOIN user ON old_user = user_id WHERE old_namespace = 0 AND old_title = " . $encDBkey . " AND old_user != " . $user . " GROUP BY old_user, old_user_text, user_real_name ORDER BY timestamp DESC"; ...
- lastmodifiedby 由「This page was last modified $1 by $2.」 --> 改成「近期作者:$2」
- othercontribs 由「Based on work by $1.」 --> 改成 「,$1 <br>」
- 結果:(以首頁為例)
- 修改前:This page was last modified 08:40 2005年12月29日by幻象兩千Based on work by yarachen, 台灣阿成 和 others
- 修改後:近期作者:幻象兩千, yarachen, 台灣阿成 和 others