Mantis1.1.2の作業履歴を一覧表示する
Mantisって作業履歴が残るって書いてありますけれど、個別のチケットを開いたときに一番下にだけでていますよね?
全体を取りまとめて見てみたかったので一覧ページを作成してみました。
<?php require_once( 'core.php' ); html_page_top1('作業履歴'); html_page_top2(); // プロジェクトフィルター $project_id = helper_get_current_project(); if( $project_id == 0 ){ // すべて $project_str = " 1 = 1 "; } else { $project_list = project_hierarchy_get_all_subprojects($project_id); $project_list[] = $project_id; $project_str = " bt.project_id in ( " . implode( ",", $project_list ) . " ) "; } $query = " SELECT ht.date_modified, ht.user_id, ut.username, ht.bug_id, bt.project_id, pt.name, bt.category, bt.summary, ht.field_name, ht.old_value, ht.new_value, ht.type FROM mantis_bug_history_table ht, mantis_bug_table bt, mantis_project_table pt, mantis_user_table ut WHERE ht.bug_id = bt.id AND bt.project_id = pt.id AND ht.user_id = ut.id AND $project_str ORDER BY ht.date_modified DESC LIMIT 100 "; $result = db_query( $query ); echo <<<__ECHO__ <br /> <table class="width100" cellspacing="1"> <tr class="row-category"> <th>変更日</th> <th>変更者</th> <th>カテゴリ</th> <th width="50%">要約</th> </tr> __ECHO__; while( $row = db_fetch_array( $result ) ){ $data = history_localize_item( $row['field_name'], $row['type'], $row['old_value'], $row['new_value'] ); if( $data['change'] ){ $history_str = $data['note'] . '(' . $data['change'] .')'; } else { $history_str = $data['note']; } if( $project_id != $row['project_id'] ){ // プロジェクト名を表示 $project_name = '<small>[<a href="set_project.php?project_id=' . $row['project_id'] . '">' . $row['name'] . "]</a></small><br />"; } else { $project_name = ""; } echo <<<__ECHO__ <tr bgcolor="#e8e8e8"> <td>{$row['date_modified']}</td> <td>{$row['username']}</td> <td>{$project_name}{$row['category']}</td> <td><a href="view.php?id={$row['bug_id']}">{$row['summary']}</a><br />{$history_str}</td> </tr> __ECHO__; } echo <<<__ECHO__ </table> __ECHO__; html_page_bottom1( __FILE__ );
上記を保存して、Mantisのトップディレクトリに設置することで動作します。
個別解説 - 基本
<?php require_once( 'core.php' ); html_page_top1('作業履歴'); html_page_top2();
coreを読み込めば必要なものが全て利用できるみたいです。top1の引数が画面のタイトルになるので指定しましょう。きれいに作る場合には日本語かかないで翻訳ファイル経由で作るべきです。
特定のプロジェクトのみ表示
<?php // プロジェクトフィルター $project_id = helper_get_current_project(); if( $project_id == 0 ){ // すべて $project_str = " 1 = 1 "; } else { $project_list = project_hierarchy_get_all_subprojects($project_id); $project_list[] = $project_id; $project_str = " bt.project_id in ( " . implode( ",", $project_list ) . " ) "; }
現在選択されているプロジェクトと、その下位のプロジェクトを列挙してWHERE句を作成します。
一覧の取得
<?php $query = " SELECT ht.date_modified, ht.user_id, ut.username, ht.bug_id, bt.project_id, pt.name, bt.category, bt.summary, ht.field_name, ht.old_value, ht.new_value, ht.type FROM mantis_bug_history_table ht, mantis_bug_table bt, mantis_project_table pt, mantis_user_table ut WHERE ht.bug_id = bt.id AND bt.project_id = pt.id AND ht.user_id = ut.id AND $project_str ORDER BY ht.date_modified DESC LIMIT 100 "; $result = db_query( $query );
データ取得の部分です。最新100件のみ取得しています。新しいバージョンはカテゴリーが別テーブルになっているので、次のバージョンでは修正が必要ですね。
テーブルのヘッダ出力
<?php echo <<<__ECHO__ <br /> <table class="width100" cellspacing="1"> <tr class="row-category"> <th>変更日</th> <th>変更者</th> <th>カテゴリ</th> <th width="50%">要約</th> </tr> __ECHO__;
要約の横幅を50%にしていますが、好みです!
テーブルの出力
<?php while( $row = db_fetch_array( $result ) ){ $data = history_localize_item( $row['field_name'], $row['type'], $row['old_value'], $row['new_value'] ); if( $data['change'] ){ $history_str = $data['note'] . '(' . $data['change'] .')'; } else { $history_str = $data['note']; } if( $project_id != $row['project_id'] ){ // プロジェクト名を表示 $project_name = '<small>[<a href="set_project.php?project_id=' . $row['project_id'] . '">' . $row['name'] . "]</a></small><br />"; } else { $project_name = ""; } echo <<<__ECHO__ <tr bgcolor="#e8e8e8"> <td>{$row['date_modified']}</td> <td>{$row['username']}</td> <td>{$project_name}{$row['category']}</td> <td><a href="view.php?id={$row['bug_id']}">{$row['summary']}</a><br />{$history_str}</td> </tr> __ECHO__; }
history_localize_itemが履歴を文字列に変換するMantis本体の関数です。プロジェクト名は選択している物以外の場合には表示する設定がMantisの標準動作でしたので、合わせました。
最終処理
<?php echo <<<__ECHO__ </table> __ECHO__; html_page_bottom1( __FILE__ );
テーブルを閉じてフッターを出力します。
メニューに追加(config_inc.php)
<?php $g_main_menu_custom_options = array( array( "Pukiwiki", MANAGER, '/pukiwiki' ), array( "作業履歴", MANAGER, 'history_page.php' ), );
TOPメニューに追加されます。