「dotProject」カテゴリーアーカイブ

Task Log登録エラーの対処法

現時点での最新CVSを拾ってくると、2.0.1と違って、以下のエラーが発生する。

あるプロジェクトにタスクを登録して、そのタスクにログを登録しようと「update task」を押すとFatal error: Call to a member function getDay() on a non-object in /var/www/html/dotproject/classes/date.class.php on line 113と怒られる。

getDay()でエラーになっている関数はclasses/date.class.phpのdateDiff()関数なんだけど、この関数自体は最新CVSも2.0.1も変わらない。と言うことは、これを呼んでいる元が悪いのであろうと推測できる。そもそも、getDay()はメソッドのはずだけど、このエラーが主張しているのは、「オブジェクトではないものにメソッドを適用しようとしている!」というものと考えられる。

と言うことで呼び元を探してみると、それらしきmodule/tasks/do_updatetask.phpがあるからdateDiffで検索してみたら、確かにあったけど、$task_end_dateが渡されている。この変数は確かにどこにもオブジェクトとして定義されていないから単なる変数のようだ。これじゃ、エラーもでるわな。それにしても、このような重要なエラーが発生するとは、何かがおかしい。

dotProjectのCVSをwebでつらつらと眺めていたら、/module/tasks/do_updatetask.phpであることに気がついた。stable_2系の最新をとってきたけど、開発中の最新バージョンではない、ということ。head系は避けろと言われているけど、main系がどうやら現在開発中のモジュールのようで、モジュール間のバージョン不整合が起きているっぽい。要するに、CVS(stable_2系)の最新よりも、時にはCVS(main系 or head系)のほうが同期が取れている、のである。

試しに、do_updatetask.phpをCVSのwebアクセスからダウンロードして置き換えてみると、タスクログを登録してもエラーが表示されなくなった。そーかー、そーゆーわけだったのねー。

これからはCVSをウォッチして、不具合があったら最新版が出ていないか確認していこう。

通知メールの日本語化

dotProjectの通知メールはことあるごとに送られてくるから、よほど大きなプロジェクト・組織でなければ鬱陶しいけど、これが化け化けメールだったらさらに鬱陶しい。化け化けと言ってもsubjectだけだけど、気持ち悪いのには変わりがない。本文はちゃんと読めるから実害はないんだけど。

とりあえず解決方法はここに書いてあるとおり。

それでもちょこっと文字化けするので、完全日本語仕様のパッチ当てをしてしまった。ま、内輪で使う分にはこれで十分。classes/libmail.class.phpの if ( ( $AppUI->user_locale != 'en' || ( $this->charset && $this->charset != 'us-ascii' && $this->charset != 'utf-8') ) && function_exists('imap_8bit')) {
$subject = "=?".$this->charset."?Q?".
str_replace("=\r\n","",imap_8bit($subject))."?=";
}
$this->xheaders['Subject'] = $dPconfig['email_prefix'].' '.strtr( $subject, "\r\n" , " " );
}
を、以下のように// if ( ( $AppUI->user_locale != 'en' || ( $this->charset && $this->charset != 'us-ascii' && $this->charset != 'utf-8') ) && function_exists('imap_8bit')) {
// $subject = "=?".$this->charset."?Q?".
// str_replace("=\r\n","",imap_8bit($subject))."?=";
if ( function_exists ('JcodeConvert') ) {
$subject = "=?ISO-2022-JP?B?".base64_encode(JcodeConvert($title,0,3))."?=";
} else {
$subject = "=?ISO-2022-JP?B?".base64_encode(mb_convert_encoding($subject, "iso-2022-jp", "auto"))."?=";
}
$this->xheaders['Subject'] = $dPconfig['email_prefix'].' '.strtr( $subject, "\r\n" , " " );
}
書き換える。

これでようやく使えるレベルに日本語化されてきた。

Ganttチャートの日付

ここにガント図の日付表示で”日/月”なのを”月/日”に直すtipsがあったので、記事ではdotProject 1.0.2だったけど2.0.1(jpgraph 2.x)に適用してみた。

geditでlib/jpgraph/src/jpgraph_gantt.phpを開いて、「j/n」で検索してみる。すると、$txt = date("j/n",$week);がヒットすると思うので、これを$txt = date("n/j",$week);と書き換えるだけ。

バッチリ (^o^)v
ありがとう、Hisashiさん!

Reports-Task Logのエラー対応

こちらもMySQL5の仕様変更で、modules/projects/reports/tasklogs.phpの $sql = "SELECT t.*, CONCAT_WS(' ',contact_first_name,contact_last_name) AS creator"
."\nFROM task_log AS t, tasks"
."\nLEFT JOIN users AS u ON user_id = task_log_creator"
."\nLEFT JOIN contacts ON user_contact = contact_id"
."\nLEFT JOIN projects ON project_id = task_project"
."\nWHERE task_log_task = task_id";
において、FROM句の後ろのテーブル記述を括弧で括るといい。FROM (task_log AS t, tasks)
この手のエラーの直し方は分かってきたけど、MySQL5の仕様変更は被害甚大だなぁ。

task per userのエラー対策

task per userのエラーはMySQL5の仕様変更が原因のようで、modules/tasks/tasks.class.phpのfunction getAssignedUsers(){
$sql = "select u.*, ut.perc_assignment, ut.user_task_priority, co.contact_last_name
from users as u, user_tasks as ut
LEFT JOIN contacts as co ON co.contact_id = u.user_contact
where ut.task_id = '$this->task_id'
and ut.user_id = u.user_id";
return db_loadHashList($sql, "user_id");
}
の3行目を from (users as u, user_tasks as ut)のように変更すればOK。
どうやら、user_tasks as ut LEFT JOIN contacts as co ON co.contact_id = u.user_contactを先に解釈するために、users as uが忘れられてしまうらしい。変なの。これはバグと言わないか、普通。

dotProjectのインストール

仕事でプロジェクト管理ソフトを探していたらdotProject.netにたどり着いて、試してみた。少し触った限りではなかなかオープンソースにしては完成度が高くて使えそう。PHP、MySQLベースで、LinuxでもWindowsでも動くらしいけど、やはりここは(少なくとも最初は)Linuxで挑戦したいところ。ただ、最近手がけているFC5はPHP5、MySQL5だけど、dotProjectはどちらも正式にはサポートしていないところがちょっと不安。しかも、dotProject最新版(2.0.1)では日本語もまだフルにサポートされていない。ま、とにかく使ってみましょう。

まあ、最初は当然ながら最新のstableを使うべきなのでしょうけど、リリースが2005年4月8日だから結構古い。それにCVSでは最近でも盛んにアップデートされていることを考えても、ここはやはりCVSから比較的安定したモジュールを取ってくる方が得策でしょう。実際、2.0.1 stableでは日本語関係とかPHP5、MySQL5関係でとっても多くの不具合がある。目玉のGantt chartもちゃんと表示されないし。

CVSから取ってくる方法はここに書かれているとおりで、FC5であれば、何も考えずに# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/dotproject co -r stable_2 dotproject
(この後パスワードを聞かれるけど黙ってEnter)
とやればわらわらとstable_2系のモジュールが落ちてくる。これでもいいんだけど、CVS関連のファイルも一緒に落ちてくる。開発者ならこれでいいんだけど、ただ最新コードだけ欲しい場合は# cvs -export -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/dotproject stable_2 dotprojectとやるといい。dotProjectディレクトリごとそのままwebで公開するディレクトリに移す。

次にMySQLの設定。FC5ではMySQL5がデフォルトであり、ここではrpmインストール済みとする。ドキュメントではdotProjectが設定の全てを行う見たいなことが書かれているけど、MySQLユーザは最初に作っておく必要がある。もっとも、その前にMySQLの初期設定を行っていない場合はそれが先。# mysql_install_db
# mysqld_safe --user=mysql &
これで準備OK。

dotProject用のMySQLユーザを作成する。# mysql
mysql> grant all privileges on *.* to dp_user@localhost(リターン)
-> identified by 'dp_pass' with grant option;(リターン)
で新しいユーザが作成される。dotProjectインストーラが提示するユーザ名とパスワードを見越しての設定なので、インストーラと同期がとれていれば好きな名前+パスワードでよい。

PHPに関しては、FC5のPHPにあるようなモジュールが既にインストールされていなければインストールしておく。

後は、ブラウザからhttp://xxx.yyy.zzz/dotproject/installにアクセスすればインストールが始まる。PHPの足りないモジュールなどは警告されるので、その都度インストールを行って確認していくのがいいであろう。残りの手作業はdotProjectフォルダのパーミッションを変更するだけ、後はインストーラが勝手にインストールしてくれる。

インストールプロセスの最後にログインを促されるので、ユーザ= administrator、パスワード= passwdでログインする。必要なユーザ(必ず一人はシステム管理者)を作成したらadministratorユーザは無効or削除しておいた方がいい。

さて、この時点ではまだ
・Gantt図の日本語が化ける
・通知メールのヘッダの日本語が化ける
・MySQL5関連のエラーが出る
・Reportの日本語が化ける
などの問題が残る。これは順を追って対処していこう。

Ganttチャートの日本語対応

dotProjectの売りのひとつがきれいなガントチャートなんだけど、残念ながらインストールしたてだと日本語が化けてしまう。これはひとえにグラフ化ライブラリであるjpgraphがそのままでは日本語に対応できていないからである。dotProject 2.0.1についてくるjpgraphはいくら格闘しても日本語対応できなかったけど、jpgraphだけ新しいのを入れたらすんなりうまくいったこともあるので、なるべく新しいものを入れた方がいいかも。でも、最新のものを入れてもそのままではやはり日本語には対応していない。ちなみに、jpgraphはここで配布されている。それでは、早速jpgraphの日本語対応に取り掛かろう。

まずはjpgraphで日本語フォントを扱えるようにしよう。現時点の最新CVSでとってきたjpgraphは1.9.10.2だったけど、最近のものであれば設定ファイルjpg-config.incからフォントなどの設定を読み込むようになっているはず。jpg-config.incの日本語設定は、まず//DEFINE("MBTTF_DIR","/usr/share/fonts/ja/TrueType/");
とコメントアウトされている行を有効にして、日本語TrueTypeフォントが格納されている正しいpathに修正する。DEFINE("MBTTF_DIR","/usr/share/fonts/japanese/TrueType/");
あくまでもこれはFC5での話なので、他のディストリビューションではディレクトリが違うかも。

次に、日本語フォントを指定しよう。DEFINE('MINCHO_TTF_FONT','ipam.ttf');
DEFINE('PMINCHO_TTF_FONT','ipamp.ttf');
DEFINE('GOTHIC_TTF_FONT','ipag.ttf');
DEFINE('PGOTHIC_TTF_FONT','ipagp.ttf');
の行に対して、FC5に標準でついてくるサザナミフォントに変更する。DEFINE('MINCHO_TTF_FONT','sazanami-mincho.ttf');
DEFINE('PMINCHO_TTF_FONT','sazanami-mincho.ttf');
DEFINE('GOTHIC_TTF_FONT','sazanami-gothic.ttf');
DEFINE('PGOTHIC_TTF_FONT','sazanami-gothic.ttf');
これもFC5以外では違うかもしれないので要確認。

あとはdotProject側の修正で、modules/projects/のgantt.phpとgantt2.php、modules/tasks/のgantt.phpが対象となる。

modules/projects/gantt.phpでは、foreach($projects as $p) {

if ( $locale_char_set=='utf-8' && function_exists("utf8_decode") ) {
$name = strlen( utf8_decode($p["project_name"]) ) > 25 ? substr( utf8_decode($p["project_name"]), 0, 22 ).'...' : utf8_decode($p["project_name"]) ;
} else {
//while using charset different than UTF-8 we need not to use utf8_deocde
$name = strlen( $p["project_name"] ) > 25 ? substr( $p["project_name"], 0, 22 ).'...' : $p["project_name"] ;
}
をすべてコメントアウトして、その直後に次の1行を追加する。 $name = mb_convert_encoding($p["project_name"],"UTF-8","auto");結果として、次の様になる。foreach($projects as $p) {

// if ( $locale_char_set=='utf-8' && function_exists("utf8_decode") ) {
// $name = strlen( utf8_decode($p["project_name"]) ) > 25 ? substr( utf8_decode($p["project_name"]), 0, 22 ).'...' : utf8_decode($p["project_name"]) ;
// } else {
//while using charset different than UTF-8 we need not to use utf8_deocde
// $name = strlen( $p["project_name"] ) > 25 ? substr( $p["project_name"], 0, 22 ).'...' : $p["project_name"] ;
// }

$name = mb_convert_encoding($p["project_name"],"UTF-8","auto");
jpgraphはUTF-8で日本語を渡すことになっているための対応で、これをしないと違う意味で文字化けする。ただ、この対応も中途半端で、コメントアウトしている部分に長いプロジェクト名を省略する処理が入っているので、ガントチャートの枠をはみ出すプロジェクト名がでてくることがある。これはもう少し落ち着いたら対処することにしよう。

次にプロジェクト名を日本語化しよう。 $bar = new GanttBar($row++, array($name, $startdate->format($df), $enddate->format($df), $actual_enddate->format($df)), $start, $actual_end, $cap, 0.6);
$bar->progress->Set($progress/100);

// $bar->title->SetFont(FF_FONT1,FS_NORMAL,10);
(↑コメントアウトして、↓下の行を追加する)
$bar->title->SetFont(FF_GOTHIC,FS_NORMAL,10);
$bar->SetFillColor("#".$p['project_color_identifier']);
$bar->SetPattern(BAND_SOLID,"#".$p['project_color_identifier']);

次にmodule/tasks/gantt.phpの修正。こちらも同様に、// Use TTF font if it exists
// try commenting out the following two lines if gantt charts do not display
if (is_file( TTF_DIR."arialbd.ttf" ))
$graph->scale->tableTitle->SetFont(FF_ARIAL,FS_BOLD,12);
$graph->scale->SetTableTitleBackground("#".$projects[$project_id]["project_color_identifier"]);
$graph->scale->tableTitle->SetFont(FF_GOTHIC);
(↑この行を追加する)
$graph->scale->tableTitle->Show(true);
これはチャートの表題部分の日本語化。続いてタスク名の日本語化。 $name = $a["task_name"];
(↓5行をコメントアウト)
// if ( $locale_char_set=='utf-8' && function_exists("utf8_decode") ) {
// $name = utf8_decode($name);
// }
// $name = strlen( $name ) > 34 ? substr( $name, 0, 33 ).'.' : $name ;
// $name = str_repeat(" ", $level).$name;
(↓この行を追加)
$name = mb_convert_encoding($name,"UTF-8","auto");
UTF-8化を行って、ほとんど一番最後のほうで $q->clear();
(↓この行を追加)
$bar->title->SetFont(FF_GOTHIC);
$graph->Add($bar);
とする。

これでガントチャートは日本語化されるはず。