//twice.
}
- // Set of format options for teacher-created content, for example overall feedback.
- $nocleanformatoptions = new stdClass;
- $nocleanformatoptions->noclean = true;
-
// Work out some display options - whether there is feedback, and whether scores should be shown.
$hasfeedback = quiz_has_feedback($quiz->id) && $quiz->grade > 1.e-7 && $quiz->sumgrades > 1.e-7;
$fakeattempt = new stdClass();
$table->column_suppress('fullname');
$table->column_class('picture', 'picture');
+ $table->column_class('fullname', 'bold');
+ $table->column_class('sumgrades', 'bold');
$table->set_attribute('cellspacing', '0');
$table->set_attribute('id', 'attempts');
echo implode("\t", $headers)." \n";
}
- // Get users with quiz attempt capability 'students'.
- // don't need to do this expensive call if we are listing all attempts though.
- if ( $attemptsmode != QUIZ_REPORT_ATTEMPTS_ALL ) {
- if (empty($currentgroup)) {
- // all users who can attempt quizzes
- $allowed = join(',',array_keys(get_users_by_capability($context, 'mod/quiz:attempt','','','','','','',false)));
- } else {
-
- // all users who can attempt quizzes and who are in the currently selected group
- $allowed = join(',',array_keys(get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false)));
- }
+ $students = join(',',array_keys(get_users_by_capability($context, 'mod/quiz:attempt','','','','','','',false)));
+ if (empty($currentgroup)) {
+ // all users who can attempt quizzes
+ $groupstudents = '';
+ $allowed = $students;
+ } else {
+ // all users who can attempt quizzes and who are in the currently selected group
+ $groupstudents = join(',',array_keys(get_users_by_capability($context, 'mod/quiz:attempt','','','','',$currentgroup,'',false)));
+ $allowed = $groupstudents;
}
// Construct the SQL
$where = ' WHERE u.id IN (' .$allowed. ') AND (qa.preview = 0 OR qa.preview IS NULL)';
break;
}
+
$countsql = 'SELECT COUNT(DISTINCT('.sql_concat('u.id', '\'#\'', $db->IfNull('qa.attempt', '0')).')) '.$from.$where;
$table->pagesize($pagesize, $total);
}
- // If there is feedback, include it in the query.
- if ($hasfeedback) {
- $factor = $quiz->grade/$quiz->sumgrades;
- $select .= ', qf.feedbacktext ';
- $from .= " LEFT JOIN {$CFG->prefix}quiz_feedback qf ON " .
- "qf.quizid = $quiz->id AND qf.mingrade <= qa.sumgrades * $factor AND qa.sumgrades * $factor < qf.maxgrade";
- }
-
// Fetch the attempts
if (!$download) {
$attempts = get_records_sql($select.$from.$where.$sort,
// Feedback column.
if ($hasfeedback) {
if ($attempt->timefinish) {
- $row[] = format_text($attempt->feedbacktext, FORMAT_MOODLE, $nocleanformatoptions);
+ $row[] = quiz_report_feedback_for_grade(quiz_rescale_grade($attempt->sumgrades, $quiz), $quiz->id);
} else {
$row[] = '-';
}
echo $text." \n";
}
}
+ //end of adding data from attempts data to table / download
+ //now add averages :
+ if (!$download && $attempts){
+
+ $averagesql = "SELECT AVG(qg.grade) AS grade " .
+ "FROM {$CFG->prefix}quiz_grades qg " .
+ "WHERE quiz=".$quiz->id;
+
+ $table->add_separator();
+ if ($groupstudents){
+ $groupaveragesql = $averagesql." AND qg.userid IN ($groupstudents)";
+ $groupaverage = get_record_sql($groupaveragesql);
+ $groupaveragerow = array('fullname' => get_string('groupavg', 'grades'),
+ 'sumgrades' => round($groupaverage->grade, $quiz->decimalpoints),
+ 'feedbacktext'=> quiz_report_feedback_for_grade($groupaverage->grade, $quiz->id));
+ if($detailedmarks && $qmfilter) {
+ $avggradebyq = quiz_get_average_grade_for_questions($quiz, $groupstudents);
+ $groupaveragerow += quiz_format_average_grade_for_questions($avggradebyq, $questions, $quiz, $download);
+ }
+ $table->add_data_keyed($groupaveragerow);
+ }
+ $overallaverage = get_record_sql($averagesql." AND qg.userid IN ($students)");
+ $overallaveragerow = array('fullname' => get_string('overallaverage', 'grades'),
+ 'sumgrades' => round($overallaverage->grade, $quiz->decimalpoints),
+ 'feedbacktext'=> quiz_report_feedback_for_grade($overallaverage->grade, $quiz->id));
+ if($detailedmarks && $qmfilter) {
+ $avggradebyq = quiz_get_average_grade_for_questions($quiz, $students);
+ $overallaveragerow += quiz_format_average_grade_for_questions($avggradebyq, $questions, $quiz, $download);
+ }
+ $table->add_data_keyed($overallaveragerow);
+ }
if (!$download) {
// Start form
echo '<div id="tablecontainer">';
// Print display options
$mform->set_data($displayoptions +compact('detailedmarks', 'pagesize'));
$mform->display();
- $imageurl = $CFG->wwwroot.'/mod/quiz/report/overview/overviewgraph.php?id='.$quiz->id;
- print_heading(get_string('overviewreportgraph', 'quiz_overview'));
- echo '<div class="mdl-align"><img src="'.$imageurl.'" alt="'.get_string('overviewreportgraph', 'quiz_overview').'" /></div>';
+ if ($attempts){
+ $imageurl = $CFG->wwwroot.'/mod/quiz/report/overview/overviewgraph.php?id='.$quiz->id;
+ print_heading(get_string('overviewreportgraph', 'quiz_overview'));
+ echo '<div class="mdl-align"><img src="'.$imageurl.'" alt="'.get_string('overviewreportgraph', 'quiz_overview').'" /></div>';
+ }
}
return true;
}
return array();
}
}
+
+function quiz_get_average_grade_for_questions($quiz, $userids){
+ global $CFG;
+ $gradedevents = QUESTION_EVENTGRADE.','.
+ QUESTION_EVENTCLOSEANDGRADE.','.
+ QUESTION_EVENTMANUALGRADE;
+ $qmfilter = quiz_report_qm_filter_subselect($quiz, 'qa.userid');
+ $questionavgssql = "SELECT qs.question, AVG(qs.grade) FROM " .
+ "{$CFG->prefix}question_sessions qns, " .
+ "{$CFG->prefix}quiz_attempts qa, " .
+ "{$CFG->prefix}question_states qs " .
+ "WHERE qns.attemptid = qa.uniqueid AND " .
+ "qa.quiz = {$quiz->id} AND " .
+ ($qmfilter?$qmfilter.' AND ':'').
+ "qa.userid IN ({$userids}) AND " .
+ "qs.event IN ($gradedevents) AND ".
+ "qns.newgraded = qs.id GROUP BY qs.question";
+ return get_records_sql_menu($questionavgssql);
+}
+function quiz_format_average_grade_for_questions($avggradebyq, $questions, $quiz, $download){
+ $row = array();
+ if (!$avggradebyq){
+ $avggradebyq = array();
+ }
+ foreach(array_keys($questions) as $questionid) {
+ if (isset($avggradebyq[$questionid])){
+ $grade = $avggradebyq[$questionid];
+ $grade = quiz_rescale_grade($grade, $quiz);
+ } else {
+ $grade = '--';
+ }
+ if (!$download) {
+ $grade = $grade.'/'.quiz_rescale_grade($questions[$questionid]->grade, $quiz);
+ }
+ $row['$'.$questionid]= $grade;
+ }
+ return $row;
+}
/**
* Load the question data necessary in the reports.
* - Remove description questions.
* one attempt that will be graded for each user. Or return
* empty string if all attempts contribute to final grade.
*/
-function quiz_report_qm_filter_subselect($quiz){
+function quiz_report_qm_filter_subselect($quiz, $useridsql = 'u.id'){
global $CFG;
if ($quiz->attempts == 1) {//only one attempt allowed on this quiz
return '';
}
if ($qmfilterattempts){
$qmsubselect = "(SELECT id FROM {$CFG->prefix}quiz_attempts " .
- "WHERE quiz = {$quiz->id} AND u.id = userid " .
+ "WHERE quiz = {$quiz->id} AND $useridsql = userid " .
"ORDER BY $qmorderby LIMIT 1)=qa.id";
} else {
$qmsubselect = '';
('<span class="highlight">'.quiz_get_grading_option_name($quiz->grademethod).'</span>'))."</p>";
}
}
+
+
+/**
+ * Get the feedback text for a grade on this quiz. The feedback is
+ * processed ready for display.
+ *
+ * @param float $grade a grade on this quiz.
+ * @param integer $quizid the id of the quiz object.
+ * @return string the comment that corresponds to this grade (empty string if there is not one.
+ */
+function quiz_report_feedback_for_grade($grade, $quizid) {
+ static $feedbackcache = array();
+ if (!isset($feedbackcache[$quizid])){
+ $feedbackcache[$quizid] = get_records('quiz_feedback', 'quizid', $quizid);
+ }
+ $feedbacks = $feedbackcache[$quizid];
+ $feedbacktext = '';
+ foreach ($feedbacks as $feedback) {
+ if ($feedback->mingrade <= $grade && $grade < $feedback->maxgrade){
+ $feedbacktext = $feedback->feedbacktext;
+ break;
+ }
+ }
+
+ // Clean the text, ready for display.
+ $formatoptions = new stdClass;
+ $formatoptions->noclean = true;
+ $feedbacktext = format_text($feedbacktext, FORMAT_MOODLE, $formatoptions);
+
+ return $feedbacktext;
+}
?>