]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-14203 "split report into two seperate reports - Quiz Statistics report and Indivi...
authorjamiesensei <jamiesensei>
Thu, 12 Jun 2008 14:36:19 +0000 (14:36 +0000)
committerjamiesensei <jamiesensei>
Thu, 12 Jun 2008 14:36:19 +0000 (14:36 +0000)
mod/quiz/report/statistics/statistics_table.php [new file with mode: 0644]

diff --git a/mod/quiz/report/statistics/statistics_table.php b/mod/quiz/report/statistics/statistics_table.php
new file mode 100644 (file)
index 0000000..29150ef
--- /dev/null
@@ -0,0 +1,210 @@
+<?php  // $Id$
+
+class quiz_report_statistics_table extends table_sql {
+    
+    var $useridfield = 'userid';
+    
+    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 build_table(){
+        global $CFG;
+        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 {$CFG->prefix}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 = 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 = 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 '&nbsp;&nbsp;';
+                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.'" />';
+        } else {
+            return '';
+        }
+    }
+    
+    function col_picture($attempt){
+        global $COURSE;
+        return print_user_picture($attempt->userid, $COURSE->id, $attempt->picture, false, true);
+    }
+
+    
+    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.'&amp;attempt='.$attempt->attempt.'">'.$startdate.'</a>';
+            } else {
+                return  $startdate;
+            }
+        } else {
+            return  '-';
+        }
+    }
+    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.'&amp;attempt='.$attempt->attempt.'">'.$timefinish.'</a>';
+                } else {
+                    return $timefinish;
+                }
+            } else {
+                return  '-';
+            }
+        } else {
+            return  '-';
+        }
+    }
+    
+    function col_duration($attempt){
+        if ($attempt->timefinish) {
+            return format_time($attempt->duration);
+        } elseif ($attempt->timestart) {
+            return get_string('unfinished', 'quiz');
+        } else {
+            return '-';
+        }
+    }
+    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.'&amp;attempt='.$attempt->attempt.'">'.$grade.'</a>';
+                if ($this->qmsubselect && $attempt->gradedattempt){
+                    $gradehtml = '<div class="highlight">'.$gradehtml.'</div>';
+                }
+                return $gradehtml;
+            } else {
+                return $grade;
+            }
+        } else {
+            return '-';
+        }
+    }
+    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.'&amp;number='.$question->number,
+                        'reviewquestion', $grade, 450, 650, get_string('reviewresponse', 'quiz'),
+                        'none', true);
+            } else {
+                return $grade;
+            }     
+        } else {
+            return NULL;
+        }
+    }
+    
+    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 '-';
+        }
+    
+    }
+}
+?>