<?php // $Id$
-class quiz_report_statistics_table extends table_sql {
+class quiz_report_statistics_table extends flexible_table {
- var $useridfield = 'userid';
+ var $quiz;
- var $candelete;
- var $reporturl;
- var $displayoptions;
-
- function quiz_report_statistics_table($quiz , $questions, $reporturl){
- parent::table_sql('mod-quiz-report-statistics-report');
- $this->quiz = $quiz;
- $this->questions = $questions;
- $this->reporturl = $reporturl;
+ function quiz_report_statistics_table(){
+ parent::flexible_table('mod-quiz-report-statistics-report');
}
- function build_table(){
- global $CFG, $DB;
- if ($this->rawdata) {
- // Define some things we need later to process raw data from db.
- $this->strtimeformat = get_string('strftimedatetime');
- parent::build_table();
- //end of adding data from attempts data to table / download
- //now add averages at bottom of table :
- $averagesql = "SELECT AVG(qg.grade) AS grade " .
- "FROM {quiz_grades} qg " .
- "WHERE quiz=".$this->quiz->id;
-
- $this->add_separator();
- if ($this->is_downloading()){
- $namekey = 'lastname';
- } else {
- $namekey = 'fullname';
- }
- if ($this->groupstudents){
- $groupaveragesql = $averagesql." AND qg.userid IN ($this->groupstudents)";
- $groupaverage = $DB->get_record_sql($groupaveragesql);
- $groupaveragerow = array($namekey => get_string('groupavg', 'grades'),
- 'sumgrades' => round($groupaverage->grade, $this->quiz->decimalpoints),
- 'feedbacktext'=> strip_tags(quiz_report_feedback_for_grade($groupaverage->grade, $this->quiz->id)));
- if($this->detailedmarks && $this->qmsubselect) {
- $avggradebyq = quiz_get_average_grade_for_questions($this->quiz, $this->groupstudents);
- $groupaveragerow += quiz_format_average_grade_for_questions($avggradebyq, $this->questions, $this->quiz, $this->is_downloading());
- }
- $this->add_data_keyed($groupaveragerow);
- }
- $overallaverage = $DB->get_record_sql($averagesql." AND qg.userid IN ($this->students)");
- $overallaveragerow = array($namekey => get_string('overallaverage', 'grades'),
- 'sumgrades' => round($overallaverage->grade, $this->quiz->decimalpoints),
- 'feedbacktext'=> strip_tags(quiz_report_feedback_for_grade($overallaverage->grade, $this->quiz->id)));
- if($this->detailedmarks && $this->qmsubselect) {
- $avggradebyq = quiz_get_average_grade_for_questions($this->quiz, $this->students);
- $overallaveragerow += quiz_format_average_grade_for_questions($avggradebyq, $this->questions, $this->quiz, $this->is_downloading());
- }
- $this->add_data_keyed($overallaveragerow);
- }
- }
-
- function wrap_html_start(){
- if (!$this->is_downloading()) {
- if ($this->candelete) {
- // Start form
- $strreallydel = addslashes_js(get_string('deleteattemptcheck','quiz'));
- echo '<div id="tablecontainer">';
- echo '<form id="attemptsform" method="post" action="' . $this->reporturl->out(true) .
- '" onsubmit="confirm(\''.$strreallydel.'\');">';
- echo $this->reporturl->hidden_params_out(array(), 0, $this->displayoptions);
- echo '<div>';
- }
- }
- }
- function wrap_html_finish(){
- if (!$this->is_downloading()) {
- // Print "Select all" etc.
- if ($this->candelete) {
- echo '<table id="commands">';
- echo '<tr><td>';
- echo '<a href="javascript:select_all_in(\'DIV\',null,\'tablecontainer\');">'.
- get_string('selectall', 'quiz').'</a> / ';
- echo '<a href="javascript:deselect_all_in(\'DIV\',null,\'tablecontainer\');">'.
- get_string('selectnone', 'quiz').'</a> ';
- echo ' ';
- echo '<input type="submit" value="'.get_string('deleteselected', 'quiz_overview').'"/>';
- echo '</td></tr></table>';
- // Close form
- echo '</div>';
- echo '</form></div>';
- }
- }
- }
-
-
- function col_checkbox($attempt){
- if ($attempt->attempt){
- return '<input type="checkbox" name="attemptid[]" value="'.$attempt->attempt.'" />';
+ /**
+ * Setup the columns and headers and other properties of the table and then
+ * call flexible_table::setup() method.
+ */
+ function setup($quiz, $cmid, $reporturl){
+ $this->quiz = $quiz;
+ $this->cmid = $cmid;
+ // Define table columns
+ $columns = array();
+ $headers = array();
+
+ $columns[]= 'number';
+ $headers[]= get_string('questionnumber', 'quiz_statistics');
+
+ if (!$this->is_downloading()){
+ $columns[]= 'icon';
+ $headers[]= '';
+ $columns[]= 'actions';
+ $headers[]= '';
} else {
- return '';
+ $columns[]= 'qtype';
+ $headers[]= get_string('questiontype', 'quiz_statistics');
}
- }
-
- function col_picture($attempt){
- global $COURSE;
- return print_user_picture($attempt->userid, $COURSE->id, $attempt->picture, false, true);
+ $columns[]= 'name';
+ $headers[]= get_string('questionname', 'quiz');
+
+ $columns[]= 'intended_weight';
+ $headers[]= get_string('intended_weight', 'quiz_statistics');
+
+ $this->define_columns($columns);
+ $this->define_headers($headers);
+ $this->sortable(false);
+
+ // Set up the table
+ $this->define_baseurl($reporturl->out());
+
+ $this->collapsible(true);
+
+/* $this->column_suppress('picture');
+ $this->column_suppress('fullname');
+ $this->column_suppress('idnumber');
+
+ $this->no_sorting('feedbacktext');
+
+ $this->column_class('picture', 'picture');
+ $this->column_class('lastname', 'bold');
+ $this->column_class('firstname', 'bold');
+ $this->column_class('fullname', 'bold');
+ $this->column_class('sumgrades', 'bold');*/
+
+ $this->column_class('intended_weight', 'numcol');
+
+ $this->set_attribute('id', 'questionstatistics');
+ $this->set_attribute('class', 'generaltable generalbox boxaligncenter');
+
+ parent::setup();
}
-
- function col_timestart($attempt){
- if ($attempt->attempt) {
- $startdate = userdate($attempt->timestart, $this->strtimeformat);
- if (!$this->is_downloading()) {
- return '<a href="review.php?q='.$this->quiz->id.'&attempt='.$attempt->attempt.'">'.$startdate.'</a>';
- } else {
- return $startdate;
- }
- } else {
- return '-';
- }
+
+ function col_name($question){
+ return $question->name;
+
}
- function col_timefinish($attempt){
- if ($attempt->attempt) {
- if ($attempt->timefinish) {
- $timefinish = userdate($attempt->timefinish, $this->strtimeformat);
- if (!$this->is_downloading()) {
- return '<a href="review.php?q='.$this->quiz->id.'&attempt='.$attempt->attempt.'">'.$timefinish.'</a>';
- } else {
- return $timefinish;
- }
- } else {
- return '-';
- }
- } else {
- return '-';
- }
+
+ function col_icon($question){
+ return print_question_icon($question, true);
}
- function col_duration($attempt){
- if ($attempt->timefinish) {
- return format_time($attempt->duration);
- } elseif ($attempt->timestart) {
- return get_string('unfinished', 'quiz');
- } else {
- return '-';
- }
+ function col_number($question){
+ return $question->number;
}
- function col_sumgrades($attempt){
- if ($attempt->timefinish) {
- $grade = quiz_rescale_grade($attempt->sumgrades, $this->quiz);
- if (!$this->is_downloading()) {
- $gradehtml = '<a href="review.php?q='.$this->quiz->id.'&attempt='.$attempt->attempt.'">'.$grade.'</a>';
- if ($this->qmsubselect && $attempt->gradedattempt){
- $gradehtml = '<div class="highlight">'.$gradehtml.'</div>';
- }
- return $gradehtml;
- } else {
- return $grade;
- }
- } else {
- return '-';
- }
+ function col_actions($question){
+ return quiz_question_action_icons($this->quiz, $this->cmid, $question, $this->baseurl);
}
- function other_cols($colname, $attempt){
- static $gradedstatesbyattempt = null;
- if ($gradedstatesbyattempt === null){
- //get all the attempt ids we want to display on this page
- //or to export for download.
- $attemptids = array();
- foreach ($this->rawdata as $attempt){
- if ($attempt->attemptuniqueid > 0){
- $attemptids[] = $attempt->attemptuniqueid;
- }
- }
- $gradedstatesbyattempt = quiz_get_newgraded_states($attemptids, true, 'qs.id, qs.grade, qs.event, qs.question, qs.attempt');
- }
- if (preg_match('/^qsgrade([0-9]+)$/', $colname, $matches)){
- $questionid = $matches[1];
- $question = $this->questions[$questionid];
- $stateforqinattempt = $gradedstatesbyattempt[$attempt->attemptuniqueid][$questionid];
- if (question_state_is_graded($stateforqinattempt)) {
- $grade = quiz_rescale_grade($stateforqinattempt->grade, $this->quiz);
- } else {
- $grade = '--';
- }
- if (!$this->is_downloading()) {
- $grade = $grade.'/'.quiz_rescale_grade($question->grade, $this->quiz);
- return link_to_popup_window('/mod/quiz/reviewquestion.php?state='.
- $stateforqinattempt->id.'&number='.$question->number,
- 'reviewquestion', $grade, 450, 650, get_string('reviewresponse', 'quiz'),
- 'none', true);
- } else {
- return $grade;
- }
- } else {
- return NULL;
- }
+ function col_qtype($question){
+ return $question->qtype;
}
-
- function col_feedbacktext($attempt){
- if ($attempt->timefinish) {
- if (!$this->is_downloading()) {
- return quiz_report_feedback_for_grade(quiz_rescale_grade($attempt->sumgrades, $this->quiz), $this->quiz->id);
- } else {
- return strip_tags(quiz_report_feedback_for_grade(quiz_rescale_grade($attempt->sumgrades, $this->quiz), $this->quiz->id));
- }
- } else {
- return '-';
- }
-
+ function col_intended_weight($question){
+ return quiz_report_scale_sumgrades_as_percentage($question->grade, $this->quiz);
}
+
+
}
?>