create_scores_table($hotpot, $course, $users, $attempts, $questions, $options, $tables);
$this->print_report($course, $hotpot, $tables, $options);
return true;
}
function create_scores_table(&$hotpot, &$course, &$users, &$attempts, &$questions, &$options, &$tables) {
global $CFG;
$download = ($options['reportformat']=='htm') ? false : true;
$is_html = ($options['reportformat']=='htm');
$blank = ($download ? '' : ' ');
$no_value = ($download ? '' : '-');
$allow_review = true;
// start the table
unset($table);
$table->border = 1;
$table->head = array();
$table->align = array();
$table->size = array();
// picture column, if required
if ($is_html) {
$table->head[] = ' ';
$table->align[] = 'center';
$table->size[] = 10;
}
// name, grade and attempt number
array_push($table->head,
get_string("name"),
hotpot_grade_heading($hotpot, $options),
get_string("attempt", "quiz")
);
array_push($table->align, "left", "center", "center");
array_push($table->size, '', '', '');
// question headings
$this->add_question_headings($questions, $table);
// penalties and raw score
array_push($table->head,
get_string('penalties', 'hotpot'),
get_string('score', 'quiz')
);
array_push($table->align, "center", "center");
array_push($table->size, '', '');
$table->data = array();
$q = array(
'grade' => array('count'=>0, 'total'=>0),
'penalties' => array('count'=>0, 'total'=>0),
'score' => array('count'=>0, 'total'=>0),
);
foreach ($users as $user) {
// shortcut to user info held in first attempt record
$u = &$user->attempts[0];
$picture = '';
$name = fullname($u);
if ($is_html) {
$picture = print_user_picture($u->userid, $course->id, $u->picture, false, true);
$name = ''.$name.'';
}
if (isset($user->grade)) {
$grade = $user->grade;
$q['grade']['count'] ++;
if (is_numeric($grade)) {
$q['grade']['total'] += $grade;
}
} else {
$grade = $no_value;
}
$attemptcount = count($user->attempts);
if ($attemptcount>1) {
$text = $name;
$name = NULL;
$name->text = $text;
$name->rowspan = $attemptcount;
$text = $grade;
$grade = NULL;
$grade->text = $text;
$grade->rowspan = $attemptcount;
}
$data = array();
if ($is_html) {
if ($attemptcount>1) {
$text = $picture;
$picture = NULL;
$picture->text = $text;
$picture->rowspan = $attemptcount;
}
$data[] = $picture;
}
array_push($data, $name, $grade);
foreach ($user->attempts as $attempt) {
// set flag if this is best grade
$is_best_grade = ($is_html && $attempt->score==$user->grade);
// get attempt number
$attemptnumber= $attempt->attempt;
if ($is_html && $allow_review) {
$attemptnumber = ''.$attemptnumber.'';
}
if ($is_best_grade) {
$score = ''.$attemptnumber.'';
}
$data[] = $attemptnumber;
// get responses to questions in this attempt by this user
foreach ($questions as $id=>$question) {
if (!isset($q[$id])) {
$q[$id] = array('count'=>0, 'total'=>0);
}
if (isset($attempt->responses[$id])) {
$score = $attempt->responses[$id]->score;
if (is_numeric($score)) {
$q[$id]['count'] ++;
$q[$id]['total'] += $score;
if ($is_best_grade) {
$score = ''.$score.'';
}
} else if (empty($score)) {
$score = $no_value;
}
} else {
$score = $no_value;
}
$data[] = $score;
} // foreach $questions
if (isset($attempt->penalties)) {
$penalties = $attempt->penalties;
if (is_numeric($penalties)) {
$q['penalties']['count'] ++;
$q['penalties']['total'] += $penalties;
}
if ($is_best_grade) {
$penalties = ''.$penalties.'';
}
} else {
$penalties = $no_value;
}
$data[] = $penalties;
if (isset($attempt->score)) {
$score = $attempt->score;
if (is_numeric($score)) {
$q['score']['total'] += $score;
$q['score']['count'] ++;
}
if ($is_best_grade) {
$score = ''.$score.'';
}
} else {
$score = $no_value;
}
$data[] = $score;
// append data for this attempt
$table->data[] = $data;
// reset data array for next attempt, if any
$data = array();
} // end foreach $attempt
$table->data[] = 'hr';
} // end foreach $user
// remove final 'hr' from data rows
array_pop($table->data);
// add averages to foot of table
$averages = array();
if ($is_html) {
$averages[] = $blank;
}
array_push($averages, get_string('average', 'hotpot'));
$col = count($averages);
if (empty($q['grade']['count'])) {
// remove score $col from $table
$this->remove_column($table, $col);
} else {
$precision = ($hotpot->grademethod==HOTPOT_GRADEMETHOD_AVERAGE || $hotpot->grade<100) ? 1 : 0;
$averages[] = round($q['grade']['total'] / $q['grade']['count'], $precision);
$col++;
}
// skip the attempt number column
$averages[$col++] = $blank;
foreach ($questions as $id=>$question) {
if (empty($q[$id]['count'])) {
// remove this question $col from $table
$this->remove_column($table, $col);
} else {
$averages[$col++] = round($q[$id]['total'] / $q[$id]['count']);
}
}
if (empty($q['penalties']['count'])) {
// remove penalties $col from $table
$this->remove_column($table, $col);
} else {
$averages[$col++] = round($q['penalties']['total'] / $q['penalties']['count']);
}
if (empty($q['score']['count'])) {
// remove score $col from $table
$this->remove_column($table, $col);
} else {
$averages[$col++] = round($q['score']['total'] / $q['score']['count']);
}
$table->foot = array($averages);
$tables[] = &$table;
}
} // end class
?>