

Потратил немного времени на поиск аддона к Mantis по визуализации- ничего не нашел( а есть ли такой? ). По этой причине не стал продолжать поиски, а предпочел «взять быка за рога» и подправить код Mantis, добавив свою функцию.
Зашел на code.google.com/apis/visualization и выбрал одно из представлений.
Bar Chart (http://code.google.com/apis/visualization/documentation/gallery/barchart.html)
Что я получил за свои труды: в Mantis -е в разделе «Статистика» приятный визуальный график, который отображает картину по имеющимся багам. Принципиально нового он Вам ничего не покажет… он просто отобразит в приятной форме то, что так упускается из виду при просмотре табличных данных с сухими цифрами.
Итак поправки в Mantis:
- /core/html_api.php
- /core/summary_api.php
Открываем /core/html_api.php и добавляем в функцию function html_head_javascript() {… }
следующий код:
echo "\t". '<script type=«text/javascript» src=«www.google.com/jsapi»></script>'. "\n";
Затем правим /core/summary_api.php
Во-первых нужно добавить свою функцию
function built_Visualizations( $data_of_projects ) {:
//die ( print_r($data_of_projects ));
?>
<tr>
<td colspan=«5»>
<div id=«chart_div» style=«border: 1px solid #c00»></div>
</td>
</tr>
<script type=«text/javascript»>
google.load(«visualization», «1», {packages:[«barchart»]});
google.setOnLoadCallback(drawChart); // Set callback to run when API is loaded
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Project');
data.addColumn('number', 'resolved');
data.addColumn('number', 'closed');
data.addColumn('number', 'open');
data.addRows(<?=count($data_of_projects)?>);
<?
$a = 0;
foreach($data_of_projects as $project => $data){
?>
data.setValue(<?=(int)$a?>, 0, '<?=$project?>');
data.setValue(<?=(int)$a?>, 1, <?=(int)$data_of_projects[$project]['t_pdata']['resolved']?>);
data.setValue(<?=(int)$a?>, 2, <?=(int)$data_of_projects[$project]['t_pdata']['closed']?>);
data.setValue(<?=(int)$a?>, 3, <?=(int)$data_of_projects[$project]['t_pdata']['open']?>);
<?
$a++;
}
?>
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
chart.draw(data, {width: 700, height: 500, is3D: false, title: 'Report of bugs', isStacked: true, legend: 'top',legendBackgroundColor: '#ccc'});
}
</script>
<?
}
Во-вторых нужно заменить
function summary_print_by_project( $p_projects = null, $p_level = 0, $p_cache = null ) {… }
на
function summary_print_by_project( $p_projects = null, $p_level = 0, $p_cache = null ) {
$t_mantis_bug_table = config_get( 'mantis_bug_table' );
$t_mantis_project_table = config_get( 'mantis_project_table' );
$t_project_id = helper_get_current_project();
if ( null == $p_projects ) {
if ( ALL_PROJECTS == $t_project_id ) {
$p_projects = current_user_get_accessible_projects();
} else {
$p_projects = Array( $t_project_id );
}
}
# Retrieve statistics one time to improve performance.
if ( null === $p_cache ) {
$query = «SELECT project_id, status, COUNT( status ) AS bugcount
FROM $t_mantis_bug_table
GROUP BY project_id, status»;
$result = db_query( $query );
$p_cache = Array();
$t_resolved_val = RESOLVED;
$t_closed_val = CLOSED;
while ( $row = db_fetch_array( $result ) ) {
extract( $row, EXTR_PREFIX_ALL, 'v' );
if ( $t_closed_val <= $v_status ) {
if ( isset( $p_cache[ $v_project_id ][ 'closed' ] ) ) {
$p_cache[ $v_project_id ][ 'closed' ] += $v_bugcount;
} else {
$p_cache[ $v_project_id ][ 'closed' ] = $v_bugcount;
}
} else if ( $t_resolved_val <= $v_status ) {
if ( isset( $p_cache[ $v_project_id ][ 'resolved' ] ) ) {
$p_cache[ $v_project_id ][ 'resolved' ] += $v_bugcount;
} else {
$p_cache[ $v_project_id ][ 'resolved' ] = $v_bugcount;
}
} else {
if ( isset( $p_cache[ $v_project_id ][ 'open' ] ) ) {
$p_cache[ $v_project_id ][ 'open' ] += $v_bugcount;
} else {
$p_cache[ $v_project_id ][ 'open' ] = $v_bugcount;
}
}
}
}
$data_of_projects = array();
foreach ( $p_projects as $t_project ) {
$t_name = str_repeat( "» ", $p_level ). project_get_name( $t_project );
$t_pdata = isset( $p_cache[ $t_project ] )? $p_cache[ $t_project ]
: array( 'open' => 0, 'resolved' => 0, 'closed' => 0 );
$t_bugs_open = isset( $t_pdata['open'] )? $t_pdata['open']: 0;
$t_bugs_resolved = isset( $t_pdata['resolved'] )? $t_pdata['resolved']: 0;
$t_bugs_closed = isset( $t_pdata['closed'] )? $t_pdata['closed']: 0;
$t_bugs_total = $t_bugs_open + $t_bugs_resolved + $t_bugs_closed;
//added Abbasov Alexander
$data_of_projects[$t_name]['t_pdata'] = $t_pdata;
$data_of_projects[$t_name]['t_bugs_resolved'] = $t_bugs_resolved;
$data_of_projects[$t_name]['t_bugs_closed'] = $t_bugs_closed;
$data_of_projects[$t_name]['t_bugs_total'] = $t_bugs_total;
summary_helper_print_row( $t_name, $t_bugs_open, $t_bugs_resolved, $t_bugs_closed, $t_bugs_total );
$t_subprojects = current_user_get_accessible_subprojects( $t_project );
if ( count( $t_subprojects ) > 0 ) {
summary_print_by_project( $t_subprojects, $p_level + 1, $p_cache );
}
}
//added Abbasov Alexander
built_Visualizations( $data_of_projects );
}