Mantis1.1.2の作業履歴を一覧表示する

Mantisって作業履歴が残るって書いてありますけれど、個別のチケットを開いたときに一番下にだけでていますよね?
全体を取りまとめて見てみたかったので一覧ページを作成してみました。

history_page.php

<?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メニューに追加されます。

感想

結構単純な処理でページは追加できます。今後プラグインとかで拡張できるようになりますが、今のバージョンだと新規ページを作って置いた方がお手軽かな?

DBの構造を見た限り今後カテゴリーと同じ様にテキストで埋め込まれている物がテーブルに分離しそうな予感がありますので、まだまだDBの構造は変わっていきそうですね。

Mantisにはロードマップとか変更履歴がありますが、チケット単位での履歴なのでTRACみたいな操作履歴が欲しいって要望はないのかな?