📄 continue.php
字号:
<?php // $Id: continue.php,v 1.39.2.9 2009/03/17 16:24:47 mark-nielsen Exp $/** * Action for processing page answers by users * * @version $Id: continue.php,v 1.39.2.9 2009/03/17 16:24:47 mark-nielsen Exp $ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License * @package lesson **/ confirm_sesskey(); require_once($CFG->dirroot.'/mod/lesson/pagelib.php'); require_once($CFG->libdir.'/blocklib.php'); // left menu code // check to see if the user can see the left menu if (!has_capability('mod/lesson:manage', $context)) { $lesson->displayleft = lesson_displayleftif($lesson); } // This is the code updates the lesson time for a timed test // get time information for this user $timer = new stdClass; if (!has_capability('mod/lesson:manage', $context)) { if (!$timer = get_records_select('lesson_timer', "lessonid = $lesson->id AND userid = $USER->id", 'starttime')) { error('Error: could not find records'); } else { $timer = array_pop($timer); // this will get the latest start time record } if ($lesson->timed) { $timeleft = ($timer->starttime + $lesson->maxtime * 60) - time(); if ($timeleft <= 0) { // Out of time lesson_set_message(get_string('eolstudentoutoftime', 'lesson')); redirect("$CFG->wwwroot/mod/lesson/view.php?id=$cm->id&pageid=".LESSON_EOL."&outoftime=normal"); die; // Shouldn't be reached, but make sure } else if ($timeleft < 60) { // One minute warning lesson_set_message(get_string("studentoneminwarning", "lesson")); } } $timer->lessontime = time(); if (!update_record("lesson_timer", $timer)) { error("Error: could not update lesson_timer table"); } } // record answer (if necessary) and show response (if none say if answer is correct or not) $pageid = required_param('pageid', PARAM_INT); if (!$page = get_record("lesson_pages", "id", $pageid)) { error("Continue: Page record not found"); } // set up some defaults $answerid = 0; $noanswer = false; $correctanswer = false; $isessayquestion = false; // use this to turn off review button on essay questions $newpageid = 0; // stay on the page $studentanswer = ''; // use this to store student's answer(s) in order to display it on feedback page switch ($page->qtype) { case LESSON_ESSAY : $isessayquestion = true; if (!$useranswer = $_POST['answer']) { $noanswer = true; break; } $useranswer = clean_param($useranswer, PARAM_RAW); if (!$answers = get_records("lesson_answers", "pageid", $pageid, "id")) { error("Continue: No answers found"); } $correctanswer = false; foreach ($answers as $answer) { $answerid = $answer->id; $newpageid = $answer->jumpto; } /// 6/29/04 // $userresponse->sent=0; $userresponse->graded = 0; $userresponse->score = 0; $userresponse->answer = $useranswer; $userresponse->response = ""; $userresponse = addslashes(serialize($userresponse)); $studentanswer = s(stripslashes_safe($useranswer)); break; case LESSON_SHORTANSWER : if (isset($_POST['answer'])) { $useranswer = $_POST['answer']; } else { $noanswer = true; break; } $useranswer = s(stripslashes(clean_param($useranswer, PARAM_RAW))); $userresponse = addslashes($useranswer); if (!$answers = get_records("lesson_answers", "pageid", $pageid, "id")) { error("Continue: No answers found"); } $i=0; foreach ($answers as $answer) { $i += 1; $expectedanswer = $answer->answer; // for easier handling of $answer->answer $ismatch = false; $markit = false; $useregexp = false; if ($page->qoption) { $useregexp = true; } if ($useregexp) { //we are using 'normal analysis', which ignores case $ignorecase = ''; if ( substr($expectedanswer,strlen($expectedanswer) - 2, 2) == '/i') { $expectedanswer = substr($expectedanswer,0,strlen($expectedanswer) - 2); $ignorecase = 'i'; } } else { $expectedanswer = str_replace('*', '#####', $expectedanswer); $expectedanswer = preg_quote($expectedanswer, '/'); $expectedanswer = str_replace('#####', '.*', $expectedanswer); } // see if user typed in any of the correct answers if ((!$lesson->custom && lesson_iscorrect($pageid, $answer->jumpto)) or ($lesson->custom && $answer->score > 0) ) { if (!$useregexp) { // we are using 'normal analysis', which ignores case if (preg_match('/^'.$expectedanswer.'$/i',$useranswer)) { $ismatch = true; } } else { if (preg_match('/^'.$expectedanswer.'$/'.$ignorecase,$useranswer)) { $ismatch = true; } } if ($ismatch == true) { $correctanswer = true; } } else { if (!$useregexp) { //we are using 'normal analysis' // see if user typed in any of the wrong answers; don't worry about case if (preg_match('/^'.$expectedanswer.'$/i',$useranswer)) { $ismatch = true; } } else { // we are using regular expressions analysis $startcode = substr($expectedanswer,0,2); switch ($startcode){ //1- check for absence of required string in $useranswer (coded by initial '--') case "--": $expectedanswer = substr($expectedanswer,2); if (!preg_match('/^'.$expectedanswer.'$/'.$ignorecase,$useranswer)) { $ismatch = true; } break; //2- check for code for marking wrong strings (coded by initial '++') case "++": $expectedanswer=substr($expectedanswer,2); $markit = true; //check for one or several matches if (preg_match_all('/'.$expectedanswer.'/'.$ignorecase,$useranswer, $matches)) { $ismatch = true; $nb = count($matches[0]); $original = array(); $marked = array(); $fontStart = '<span class="incorrect matches">'; $fontEnd = '</span>'; for ($i = 0; $i < $nb; $i++) { array_push($original,$matches[0][$i]); array_push($marked,$fontStart.$matches[0][$i].$fontEnd); } $useranswer = str_replace($original, $marked, $useranswer); } break; //3- check for wrong answers belonging neither to -- nor to ++ categories default: if (preg_match('/^'.$expectedanswer.'$/'.$ignorecase,$useranswer, $matches)) { $ismatch = true; } break; } $correctanswer = false; } } if ($ismatch) { $newpageid = $answer->jumpto; if (trim(strip_tags($answer->response))) { $response = $answer->response; } $answerid = $answer->id; break; // quit answer analysis immediately after a match has been found } } $studentanswer = $useranswer; break; case LESSON_TRUEFALSE : if (empty($_POST['answerid'])) { $noanswer = true; break; } $answerid = required_param('answerid', PARAM_INT); if (!$answer = get_record("lesson_answers", "id", $answerid)) { error("Continue: answer record not found"); } if (lesson_iscorrect($pageid, $answer->jumpto)) { $correctanswer = true; } if ($lesson->custom) { if ($answer->score > 0) { $correctanswer = true; } else { $correctanswer = false; } } $newpageid = $answer->jumpto; $response = trim($answer->response); $studentanswer = $answer->answer; break; case LESSON_MULTICHOICE : if ($page->qoption) { // MULTIANSWER allowed, user's answer is an array if (isset($_POST['answer'])) { $useranswers = $_POST['answer']; foreach ($useranswers as $key => $useranswer) { $useranswers[$key] = clean_param($useranswer, PARAM_INT); } } else { $noanswer = true; break; } // get what the user answered $userresponse = implode(",", $useranswers); // get the answers in a set order, the id order if (!$answers = get_records("lesson_answers", "pageid", $pageid, "id")) { error("Continue: No answers found"); } $ncorrect = 0; $nhits = 0; $correctresponse = ''; $wrongresponse = ''; $correctanswerid = 0; $wronganswerid = 0; // store student's answers for displaying on feedback page foreach ($answers as $answer) { foreach ($useranswers as $key => $answerid) { if ($answerid == $answer->id) { $studentanswer .= '<br />'.$answer->answer; } } } // this is for custom scores. If score on answer is positive, it is correct if ($lesson->custom) { $ncorrect = 0; $nhits = 0; foreach ($answers as $answer) { if ($answer->score > 0) { $ncorrect++; foreach ($useranswers as $key => $answerid) { if ($answerid == $answer->id) { $nhits++; } } // save the first jumpto page id, may be needed!... if (!isset($correctpageid)) { // leave in its "raw" state - will converted into a proper page id later $correctpageid = $answer->jumpto; } // save the answer id for scoring
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -