⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 report.php

📁 很棒的在线教学系统
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?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 ? '&nbsp;' : "";		// 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.'&amp;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 + -