diff --git a/mod/quiz/report/analysis/report.php b/mod/quiz/report/analysis/report.php index b3a4a23ab9a..9128d236b1d 100644 --- a/mod/quiz/report/analysis/report.php +++ b/mod/quiz/report/analysis/report.php @@ -1,10 +1,8 @@ libdir.'/tablelib.php'); - -/// Item analysis displays a table of quiz questions and their performance +require_once($CFG->libdir.'/tablelib.php'); +/// Item analysis displays a table of quiz questions and their performance class quiz_report extends quiz_default_report { function display($quiz, $cm, $course) { /// This function just displays the report @@ -17,7 +15,7 @@ class quiz_report extends quiz_default_report { $this->print_header_and_tabs($cm, $course, $quiz, $reportmode="analysis"); } /// Construct the table for this particular report - + if (!$quiz->questions) { print_heading($strnoattempts); return true; @@ -34,7 +32,7 @@ class quiz_report extends quiz_default_report { $changegroup = -1; /// This means no group change was specified } - $currentgroup = get_and_set_current_group($course, $groupmode, $changegroup); + $currentgroup = get_and_set_current_group($course, $groupmode, $changegroup); } } else { $currentgroup = false; @@ -54,12 +52,12 @@ class quiz_report extends quiz_default_report { $$option = $SESSION->quiz_analysis_table[$option] = $urlparam; } } - + $scorelimit = $quiz->sumgrades * $lowmarklimit/ 100; - + // ULPGC ecastro DEBUG this is here to allow for different SQL to select attempts switch ($attemptselection) { - case QUIZ_ALLATTEMPTS : + case QUIZ_ALLATTEMPTS : $limit = ''; $group = ''; break; @@ -69,11 +67,11 @@ class quiz_report extends quiz_default_report { break; case QUIZ_FIRSTATTEMPT : $limit = ', min(qa.timemodified) '; - $group = ' GROUP BY qa.userid '; + $group = ' GROUP BY qa.userid '; break; - case QUIZ_LASTATTEMPT : + case QUIZ_LASTATTEMPT : $limit = ', max(qa.timemodified) '; - $group = ' GROUP BY qa.userid '; + $group = ' GROUP BY qa.userid '; break; } @@ -84,13 +82,14 @@ class quiz_report extends quiz_default_report { $sql = 'SELECT qa.* FROM '.$CFG->prefix.'user u '. 'JOIN '.$CFG->prefix.'quiz_attempts qa ON u.id = qa.userid '; - if (!empty($currentgroup)) { - $sql .= ' JOIN '.$CFG->prefix.'groups_members gm ON u.id = gm.userid AND gm.groupid = '.$currentgroup; - } - $sql .= ' WHERE qa.quiz = '.$quiz->id. // ULPGC ecastro - ' AND ( qa.sumgrades >= '.$scorelimit.' ) '; - // ^^^^^^ es posible seleccionar aqu� TODOS los quizzes, como quiere Jussi, - // pero habr�a que llevar la cuenta ed cada quiz para restaura las preguntas (quizquestions, states) + if (!empty($currentgroup)) { + $sql .= ' JOIN '.$CFG->prefix.'groups_members gm ON u.id = gm.userid AND gm.groupid = '.$currentgroup; + } + $sql .= ' WHERE qa.quiz = '.$quiz->id. // ULPGC ecastro + ' AND ( qa.sumgrades >= '.$scorelimit.' ) '; + // ^^^^^^ es posible seleccionar aqu� TODOS los quizzes, como quiere Jussi, + // pero habr�a que llevar la cuenta ed cada quiz para restaura las preguntas (quizquestions, states) + /// Fetch the attempts $attempts = get_records_sql($sql); @@ -103,7 +102,7 @@ class quiz_report extends quiz_default_report { /// Here we rewiew all attempts and record data to construct the table $questions = array(); $statstable = array(); - $questionarray = array(); + $questionarray = array(); foreach ($attempts as $attempt) { $questionarray[] = quiz_questions_in_quiz($attempt->layout); } @@ -114,7 +113,7 @@ class quiz_report extends quiz_default_report { foreach ($attempts as $attempt) { switch ($attemptselection) { - case QUIZ_ALLATTEMPTS : + case QUIZ_ALLATTEMPTS : $userscore = 0; // can be anything, not used break; case QUIZ_HIGHESTATTEMPT : @@ -123,7 +122,7 @@ class quiz_report extends quiz_default_report { case QUIZ_FIRSTATTEMPT : $userscore = $attempt->timemodified; break; - case QUIZ_LASTATTEMPT : + case QUIZ_LASTATTEMPT : $userscore = $attempt->timemodified; break; } @@ -139,7 +138,7 @@ class quiz_report extends quiz_default_report { if (!$quizquestions = get_records_sql($sql)) { error('No questions found'); } - + // Load the question type specific information if (!get_question_options($quizquestions)) { error('Could not load question options'); @@ -151,7 +150,7 @@ class quiz_report extends quiz_default_report { } $numbers = explode(',', $questionlist); $statsrow = array(); - foreach ($numbers as $i) { + foreach ($numbers as $i) { if (!isset($quizquestions[$i]) or !isset($states[$i])) { continue; } @@ -159,7 +158,7 @@ class quiz_report extends quiz_default_report { $q = get_question_responses($quizquestions[$i], $states[$i]); if (empty($q)){ continue; - } + } $qid = $q->id; if (!isset($questions[$qid])) { $questions[$qid]['id'] = $qid; @@ -170,14 +169,15 @@ class quiz_report extends quiz_default_report { $questions[$qid]['rcounts'][$answer] = 0; $questions[$qid]['credits'][$answer] = $r->credit; $statsrow[$qid] = 0; - } + } } $responses = get_question_actual_response($quizquestions[$i], $states[$i]); foreach ($responses as $resp){ if ($resp) { - if ($key = array_search($resp, $questions[$qid]['responses'])) { + if ($key = array_search($resp, $questions[$qid]['responses'])) { $questions[$qid]['rcounts'][$key]++; } else { + $test = new stdClass; $test->responses = $QTYPES[$quizquestions[$i]->qtype]->get_correct_responses($quizquestions[$i], $states[$i]); if ($key = $QTYPES[$quizquestions[$i]->qtype]->check_response($quizquestions[$i], $states[$i], $test)) { $questions[$qid]['rcounts'][$key]++; @@ -191,11 +191,11 @@ class quiz_report extends quiz_default_report { } $statsrow[$qid] = get_question_fraction_grade($quizquestions[$i], $states[$i]); } - $attemptscores[$attempt->id] = $attempt->sumgrades; + $attemptscores[$attempt->id] = $attempt->sumgrades; $statstable[$attempt->id] = $statsrow; } } // Statistics Data table built - + unset($attempts); unset($quizquestions); unset($states); @@ -211,7 +211,7 @@ class quiz_report extends quiz_default_report { } unset($attemptscores); unset($statstable); - + /// Now check if asked download of data if ($download = optional_param('download', NULL)) { $filename = clean_filename("$course->shortname ".format_string($quiz->name,true)); @@ -219,23 +219,23 @@ class quiz_report extends quiz_default_report { case "Excel" : $this->Export_Excel($questions, $filename); break; - case "OOo": + case "OOo": $this->Export_OOo($questions, $filename); break; - case "CSV": + case "CSV": $this->Export_CSV($questions, $filename); break; } } - + /// Construct the table for this particular report $tablecolumns = array('id', 'qname', 'responses', 'credits', 'rcounts', 'rpercent', 'facility', 'qsd','disc_index', 'disc_coeff'); - $tableheaders = array(get_string('qidtitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), - get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), - get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), - get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), - get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); + $tableheaders = array(get_string('qidtitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), + get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), + get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), + get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), + get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); $table = new flexible_table('mod-quiz-report-itemanalysis'); @@ -246,16 +246,16 @@ class quiz_report extends quiz_default_report { $table->sortable(true); $table->collapsible(true); $table->initialbars(false); - + $table->column_class('id', 'numcol'); $table->column_class('credits', 'numcol'); $table->column_class('rcounts', 'numcol'); $table->column_class('rpercent', 'numcol'); $table->column_class('facility', 'numcol'); - $table->column_class('qsd', 'numcol'); + $table->column_class('qsd', 'numcol'); $table->column_class('disc_index', 'numcol'); $table->column_class('disc_coeff', 'numcol'); - + $table->column_suppress('id'); $table->column_suppress('qname'); $table->column_suppress('facility'); @@ -266,19 +266,19 @@ class quiz_report extends quiz_default_report { $table->set_attribute('cellspacing', '0'); $table->set_attribute('id', 'itemanalysis'); $table->set_attribute('class', 'generaltable generalbox'); - + // Start working -- this is necessary as soon as the niceties are over $table->setup(); $tablesort = $table->get_sql_sort(); - $sorts = explode(",",trim($tablesort)); + $sorts = explode(",",trim($tablesort)); if ($tablesort and is_array($sorts)) { $sortindex = array(); $sortorder = array (); foreach ($sorts as $sort) { $data = explode(" ",trim($sort)); $sortindex[] = trim($data[0]); - $s = trim($data[1]); + $s = trim($data[1]); if ($s=="ASC") { $sortorder[] = SORT_ASC; } else { @@ -296,57 +296,58 @@ class quiz_report extends quiz_default_report { } } - // Now it is time to page the data, simply slice the keys in the array + // Now it is time to page the data, simply slice the keys in the array if (!isset($pagesize) || ((int)$pagesize < 1) ){ $pagesize = 10; } $table->pagesize($pagesize, count($questions)); $start = $table->get_page_start(); $pagequestions = array_slice(array_keys($questions), $start, $pagesize); - + foreach($pagequestions as $qnum) { $q = $questions[$qnum]; $qid = $q['id']; - $question = get_record('question', 'id', $qid); + $question = get_record('question', 'id', $qid); $qnumber = " (".link_to_popup_window('/question/question.php?id='.$qid,'editquestion', $qid, 450, 550, get_string('edit'), 'none', true ).") "; $qname = '
| '; + echo ' | '; $options["download"] = "Excel"; print_single_button("report.php", $options, get_string("downloadexcel")); - echo " | \n"; - + echo "\n"; + if (file_exists("$CFG->libdir/phpdocwriter/lib/include.php")) { - echo ''; + echo ' | '; $options["download"] = "OOo"; print_single_button("report.php", $options, get_string("downloadooo", "quiz_analysis")); echo " | \n"; @@ -433,7 +434,7 @@ class quiz_report extends quiz_default_report { if ($attemptscores[$aid]<=$bottom){ $bottom_scores +=$qrow[$qid]; $bottom_count++; - } + } } } $n = count($qstats); @@ -445,7 +446,7 @@ class quiz_report extends quiz_default_report { $sumq2 = $sumx2[1]; $sumxy = stats_sumxy($qstats, array(0,0)); $sumgq = $sumxy[0]; - + $q['count'] = $n; $q['facility'] = $sumq/$n; if ($n<2) { @@ -511,22 +512,22 @@ class quiz_report extends quiz_default_report { /// Here starts workshhet headers $myxls->write_string(0,0,$sheettitle,$formatb); - $headers = array(get_string('qidtitle','quiz_analysis'), get_string('qtypetitle','quiz_analysis'), - get_string('qnametitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), - get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), - get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), - get_string('qcounttitle','quiz_analysis'), - get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), - get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); + $headers = array(get_string('qidtitle','quiz_analysis'), get_string('qtypetitle','quiz_analysis'), + get_string('qnametitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), + get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), + get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), + get_string('qcounttitle','quiz_analysis'), + get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), + get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); $col = 0; foreach ($headers as $item) { $myxls->write(2,$col,$item,$formatbc); $col++; } - + $row = 3; - foreach($questions as $q) { + foreach($questions as $q) { $rows = $this->print_row_stats_data(&$q); foreach($rows as $rowdata){ $col = 0; @@ -548,7 +549,7 @@ class quiz_report extends quiz_default_report { global $CFG; require_once("$CFG->libdir/phpdocwriter/lib/include.php"); import('phpdocwriter.pdw_document'); - header("Content-Type: application/download\n"); + header("Content-Type: application/download\n"); header("Content-Disposition: attachment; filename=\"$filename.sxw\""); header("Expires: 0"); header("Cache-Control: must-revalidate,post-check=0,pre-check=0"); @@ -566,20 +567,20 @@ class quiz_report extends quiz_default_report { $sxw->Write(get_string('analysistitle','quiz_analysis')); $sxw->Ln(3); - $headers = array(get_string('qidtitle','quiz_analysis'), get_string('qtypetitle','quiz_analysis'), - get_string('qnametitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), - get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), - get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), - get_string('qcounttitle','quiz_analysis'), - get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), - get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); + $headers = array(get_string('qidtitle','quiz_analysis'), get_string('qtypetitle','quiz_analysis'), + get_string('qnametitle','quiz_analysis'), get_string('qtexttitle','quiz_analysis'), + get_string('responsestitle','quiz_analysis'), get_string('rfractiontitle','quiz_analysis'), + get_string('rcounttitle','quiz_analysis'), get_string('rpercenttitle','quiz_analysis'), + get_string('qcounttitle','quiz_analysis'), + get_string('facilitytitle','quiz_analysis'), get_string('stddevtitle','quiz_analysis'), + get_string('dicsindextitle','quiz_analysis'), get_string('disccoefftitle','quiz_analysis')); foreach($headers as $key=>$header){ $headers[$key] = eregi_replace ("