📄 report.php
字号:
<?php // $Id: report.php,v 1.8.8.2 2008/03/06 07:34:04 gbateson Exp $/// Overview report just displays a big table of all the attemptsclass hotpot_report extends hotpot_default_report { function display(&$hotpot, &$cm, &$course, &$users, &$attempts, &$questions, &$options) { global $CFG; // create the tables $tables = array(); $this->create_clickreport_table($hotpot, $cm, $course, $users, $attempts, $questions, $options, $tables); // print the tables $this->print_report($course, $hotpot, $tables, $options); return true; } function create_clickreport_table(&$hotpot, &$cm, &$course, &$users, &$attempts, &$questions, &$options, &$tables) { global $CFG; $is_html = ($options['reportformat']=='htm'); // time and date format strings // date format strings $strftimetime = '%H:%M:%S'; $strftimedate = get_string('strftimedate'); // get the current time and max execution time $start_report_time = microtime(); $max_execution_time = ini_get('max_execution_time'); $correct = get_string('reportcorrectsymbol', 'hotpot'); $wrong = get_string('reportwrongsymbol', 'hotpot'); $nottried = get_string('reportnottriedsymbol', 'hotpot'); // shortcuts for font tags $blank = $is_html ? ' ' : ""; // store question count $questioncount = count($questions); // array to map columns onto question ids ($col => $id) $questionids = array_keys($questions); // store exercise type $exercisetype = $this->get_exercisetype($questions, $questionids, $blank); // initialize details ('events' must go last) $details = array('checks', 'status', 'answers', 'changes', 'hints', 'clues', 'events'); // initialize $table unset($table); $table->border = 1; $table->width = '100%'; // initialize legend, if necessary if (!empty($options['reportshowlegend'])) { $table->legend = array(); } // start $table headings $this->set_head($options, $table, 'exercise'); $this->set_head($options, $table, 'user'); $this->set_head($options, $table, 'attempt'); $this->set_head($options, $table, 'click'); // store clicktype column number $clicktype_col = count($table->head)-1; // finish $table headings $this->set_head($options, $table, 'details', $exercisetype, $details, $questioncount); $this->set_head($options, $table, 'totals', $exercisetype); // set align and wrap $this->set_align_and_wrap($table); // is link to review allowed? $allow_review = ($is_html && (has_capability('mod/hotpot:viewreport',get_context_instance(CONTEXT_COURSE, $course->id)) || $hotpot->review)); // initialize array of data values $this->data = array(); // set exercise data values $this->set_data_exercise($cm, $course, $hotpot, $questions, $questionids, $questioncount, $blank); // add details of users' responses foreach ($users as $user) { $this->set_data_user($options, $course, $user); unset($clickreportid); foreach ($user->attempts as $attempt) { // initialize totals for $click = array( 'qnumber' => array(), 'correct' => array(), 'wrong' => array(), 'answers' => array(), 'hints' => array(), 'clues' => array(), 'changes' => array(), 'checks' => array(), 'events' => array(), 'score' => array(), 'weighting' => array() ); $clicktypes = array(); // is the start of a new attempt? // (clicks in the same attempt have the same clickreportid) if (!isset($clickreportid) || $clickreportid != $attempt->clickreportid) { $clickcount = 1; $clickreportid = $attempt->clickreportid; // initialize totals for all clicks in this attempt $clicks = $click; // $click has just been initialized $this->set_data_attempt($attempt, $strftimedate, $strftimetime, $blank); } $cells = array(); $this->set_data($cells, 'exercise'); $this->set_data($cells, 'user'); $this->set_data($cells, 'attempt'); // get responses to questions in this attempt foreach ($attempt->responses as $response) { // set $q(uestion number) $q = array_search($response->question, $questionids); $click['qnumber'][$q] = true; // was this question answered correctly? if ($answer = hotpot_strings($response->correct)) { // mark the question as correctly answered if (empty($clicks['correct'][$q])) { $click['correct'][$q] = true; $clicks['correct'][$q] = true; } // unset 'wrong' flags, if necessary if (isset($click['wrong'][$q])) { unset($click['wrong'][$q]); } if (isset($clicks['wrong'][$q])) { unset($clicks['wrong'][$q]); } // otherwise, was the question answered wrongly? } else if ($answer = hotpot_strings($response->wrong)) { // mark the question as wrongly answered $click['wrong'][$q] = true; $clicks['wrong'][$q] = true; } else { // not correct or wrong (curious?!) unset($answer); } if (!empty($click['correct'][$q]) || !empty($click['wrong'][$q])) { $click['score'][$q] = $response->score; $clicks['score'][$q] = $response->score; $weighting = isset($response->weighting) ? $response->weighting : 100; $click['weighting'][$q] = $weighting; $clicks['weighting'][$q] =$weighting; } foreach($details as $detail) { switch ($detail) { case 'answers': if (isset($answer) && is_string($answer) && !empty($answer)) { $click[$detail][$q] = $answer; } break; case 'hints': case 'clues': case 'checks': if (isset($response->$detail) && is_numeric($response->$detail) && $response->$detail>0) { if (!isset($click[$detail][$q]) || $click[$detail][$q] < $response->$detail) { $click[$detail][$q] = $response->$detail; } } break; } } // end foreach $detail } // end foreach $response $click['types'] = array(); $this->data['details'] = array(); foreach($details as $detail) { for ($q=0; $q<$questioncount; $q++) { switch ($detail) { case 'status': if (isset($clicks['correct'][$q])) { $this->data['details'][] = $correct; } else if (isset($clicks['wrong'][$q])) { $this->data['details'][] = $wrong; } else if (isset($click['qnumber'][$q])) { $this->data['details'][] = $nottried; } else { // this question did not appear in this attempt $this->data['details'][] = $blank; } break; case 'answers': case 'hints': case 'clues': case 'checks': if (!isset($clicks[$detail][$q])) { if (!isset($click[$detail][$q])) { $this->data['details'][] = $blank; } else { $clicks[$detail][$q] = $click[$detail][$q]; if ($detail=='answers') { $this->set_legend($table, $q, $click[$detail][$q], $questions[$questionids[$q]]); } $this->data['details'][] = $click[$detail][$q]; $this->update_event_count($click, $detail, $q); } } else { if (!isset($click[$detail][$q])) { $this->data['details'][] = $blank; } else { $difference = ''; if ($detail=='answers') { if ($click[$detail][$q] != $clicks[$detail][$q]) { $pattern = '/^'.preg_quote($clicks[$detail][$q], '/').',/'; $difference = preg_replace($pattern, '', $click[$detail][$q], 1); } } else { // hints, clues, checks if ($click[$detail][$q] > $clicks[$detail][$q]) { $difference = $click[$detail][$q] - $clicks[$detail][$q]; } } if ($difference) { $clicks[$detail][$q] = $click[$detail][$q]; $click[$detail][$q] = $difference; if ($detail=='answers') { $this->set_legend($table, $q, $difference, $questions[$questionids[$q]]); } $this->data['details'][] = $difference; $this->update_event_count($click, $detail, $q); } else { unset($click[$detail][$q]); $this->data['details'][] = $blank; } } } break; case 'changes': case 'events': if (empty($click[$detail][$q])) { $this->data['details'][] = $blank; } else { $this->data['details'][] = $click[$detail][$q]; } break; default: // do nothing break; } // end switch } // for $q } // foreach $detail // set data cell values for $this->set_data_click( $allow_review ? '<a href="review.php?hp='.$hotpot->id.'&attempt='.$attempt->id.'">'.$clickcount.'</a>' : $clickcount, trim(userdate($attempt->timefinish, $strftimetime)), $exercisetype, $click ); $this->set_data($cells, 'click'); $this->set_data($cells, 'details'); $this->set_data_totals($click, $clicks, $questioncount, $blank, $attempt); $this->set_data($cells, 'totals'); $table->data[] = $cells; $clickcount++; } // end foreach $attempt // insert 'tabledivider' between users $table->data[] = 'hr'; } // end foreach $user // remove final 'hr' from data rows array_pop($table->data); if ($is_html && $CFG->hotpot_showtimes) { $count = count($users); $duration = sprintf("%0.3f", microtime_diff($start_report_time, microtime())); print "$count users processed in $duration seconds (".sprintf("%0.3f", $duration/$count).' secs/user)<hr size="1" noshade="noshade" />'."\n"; } $tables[] = &$table; $this->create_legend_table($tables, $table); } // end function function get_exercisetype(&$questions, &$questionids, &$blank) { if (empty($questions)) { $type = $blank; } else { switch ($questions[$questionids[0]]->type) { case HOTPOT_JCB: $type = "JCB"; break; case HOTPOT_JCLOZE : $type = "JCloze"; break; case HOTPOT_JCROSS : $type = "JCross"; break; case HOTPOT_JMATCH : $type = "JMatch"; break; case HOTPOT_JMIX : $type = "JMix"; break; case HOTPOT_JQUIZ : $type = "JQuiz"; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -