dirroot.'/mod/lesson/locallib.php'); require_once($CFG->dirroot.'/mod/lesson/lib.php'); require_once($CFG->dirroot.'/mod/lesson/pagelib.php'); require_once($CFG->libdir.'/blocklib.php'); $id = required_param('id', PARAM_INT); // Course Module ID $pageid = optional_param('pageid', NULL, PARAM_INT); // Lesson Page ID $edit = optional_param('edit', -1, PARAM_BOOL); list($cm, $course, $lesson) = lesson_get_basics($id); require_login($course->id, false, $cm); $context = get_context_instance(CONTEXT_MODULE, $cm->id); /// Check these for students only TODO: Find a better method for doing this! /// Check lesson availability /// Check for password /// Check dependencies /// Check for high scores if (!has_capability('mod/lesson:manage', $context)) { if (($lesson->available != 0 and time() < $lesson->available) or ($lesson->deadline != 0 and time() > $lesson->deadline)) { // Deadline restrictions if ($lesson->deadline != 0 and time() > $lesson->deadline) { $message = get_string('lessonclosed', 'lesson', userdate($lesson->deadline)); } else { $message = get_string('lessonopen', 'lesson', userdate($lesson->available)); } lesson_print_header($cm, $course, $lesson); print_simple_box_start('center'); echo '
'; echo '

'.$message.'

'; echo '
'. get_string('returnto', 'lesson', format_string($course->fullname, true)) .'
'; echo '
'; print_simple_box_end(); print_footer($course); exit(); } else if ($lesson->usepassword and empty($USER->lessonloggedin[$lesson->id])) { // Password protected lesson code $correctpass = false; if ($password = optional_param('userpassword', '', PARAM_CLEAN)) { if ($lesson->password == md5(trim($password))) { $USER->lessonloggedin[$lesson->id] = true; $correctpass = true; if ($lesson->highscores) { // Logged in - redirect so we go through all of these checks before starting the lesson. redirect("$CFG->wwwroot/mod/lesson/view.php?id=$cm->id"); } } } if (!$correctpass) { lesson_print_header($cm, $course, $lesson); echo "
\n"; print_simple_box_start('center'); echo '
' . "\n"; echo '
'; echo '' . "\n"; if (optional_param('userpassword', 0, PARAM_CLEAN)) { notify(get_string('loginfail', 'lesson')); } echo get_string('passwordprotectedlesson', 'lesson', format_string($lesson->name))."

\n". get_string('enterpassword', 'lesson')."

\n
". ''. get_string('cancel', 'lesson') .' '; lesson_print_submit_link(get_string('continue', 'lesson'), 'password', 'center', 'standardbutton submitbutton'); echo '
'; print_simple_box_end(); echo "
\n"; print_footer($course); exit(); } } else if ($lesson->dependency) { // check for dependencies if ($dependentlesson = $DB->get_record('lesson', array('id' => $lesson->dependency))) { // lesson exists, so we can proceed $conditions = unserialize($lesson->conditions); // assume false for all $timespent = false; $completed = false; $gradebetterthan = false; // check for the timespent condition if ($conditions->timespent) { $params = array ("userid" => $USER->id, "lessonid" => $dependentlesson->id); if ($attempttimes = $DB->get_records_select('lesson_timer', "userid = :userid AND lessonid = :lessonid", $params)) { // go through all the times and test to see if any of them satisfy the condition foreach($attempttimes as $attempttime) { $duration = $attempttime->lessontime - $attempttime->starttime; if ($conditions->timespent < $duration/60) { $timespent = true; } } } } else { $timespent = true; // there isn't one set } // check for the gradebetterthan condition if($conditions->gradebetterthan) { $params = array ("userid" => $USER->id, "lessonid" => $dependentlesson->id); if ($studentgrades = $DB->get_records_select('lesson_grades', "userid = :userid AND lessonid = :lessonid", $params)) { // go through all the grades and test to see if any of them satisfy the condition foreach($studentgrades as $studentgrade) { if ($studentgrade->grade >= $conditions->gradebetterthan) { $gradebetterthan = true; } } } } else { $gradebetterthan = true; // there isn't one set } // check for the completed condition if ($conditions->completed) { if ($DB->count_records('lesson_grades', array('userid'=>$USER->id, 'lessonid'=>$dependentlesson->id))) { $completed = true; } } else { $completed = true; // not set } $errors = array(); // collect all of our error statements if (!$timespent) { $errors[] = get_string('timespenterror', 'lesson', $conditions->timespent); } if (!$completed) { $errors[] = get_string('completederror', 'lesson'); } if (!$gradebetterthan) { $errors[] = get_string('gradebetterthanerror', 'lesson', $conditions->gradebetterthan); } if (!empty($errors)) { // print out the errors if any lesson_print_header($cm, $course, $lesson); echo '

'; print_simple_box_start('center'); print_string('completethefollowingconditions', 'lesson', $dependentlesson->name); echo '

'.implode('
'.get_string('and', 'lesson').'
', $errors).'

'; print_simple_box_end(); echo '

'; print_footer($course); exit(); } } } else if ($lesson->highscores and !$lesson->practice and !optional_param('viewed', 0) and empty($pageid)) { // Display high scores before starting lesson redirect("$CFG->wwwroot/mod/lesson/highscores.php?id=$cm->id"); } } // set up some general variables $path = $CFG->wwwroot .'/course'; // this is called if a student leaves during a lesson if($pageid == LESSON_UNSEENBRANCHPAGE) { $pageid = lesson_unseen_question_jump($lesson->id, $USER->id, $pageid); } // display individual pages and their sets of answers // if pageid is EOL then the end of the lesson has been reached // for flow, changed to simple echo for flow styles, michaelp, moved lesson name and page title down $attemptflag = false; if (empty($pageid)) { // make sure there are pages to view if (!$DB->get_field('lesson_pages', 'id', array('lessonid' => $lesson->id, 'prevpageid' => 0))) { if (!has_capability('mod/lesson:manage', $context)) { lesson_set_message(get_string('lessonnotready', 'lesson', $course->teacher)); // a nice message to the student } else { if (!$DB->count_records('lesson_pages', array('lessonid'=>$lesson->id))) { redirect("$CFG->wwwroot/mod/lesson/edit.php?id=$cm->id"); // no pages - redirect to add pages } else { lesson_set_message(get_string('lessonpagelinkingbroken', 'lesson')); // ok, bad mojo } } } add_to_log($course->id, 'lesson', 'start', 'view.php?id='. $cm->id, $lesson->id, $cm->id); // if no pageid given see if the lesson has been started $params = array ("lessonid" => $lesson->id, "userid" => $USER->id); if ($grades = $DB->get_records_select('lesson_grades', 'lessonid = :lessonid AND userid = :userid', $params, 'grade DESC')) { $retries = count($grades); } else { $retries = 0; } if ($retries) { $attemptflag = true; } if (isset($USER->modattempts[$lesson->id])) { unset($USER->modattempts[$lesson->id]); // if no pageid, then student is NOT reviewing } // if there are any questions have been answered correctly in this attempt $params = array ("lessonid" => $lesson->id, "userid" => $USER->id, "retry" => $retries); if ($attempts = $DB->get_records_select('lesson_attempts', "lessonid = :lessonid AND userid = :userid AND retry = :retry AND correct = 1", $params, 'timeseen DESC')) { foreach ($attempts as $attempt) { $jumpto = $DB->get_field('lesson_answers', 'jumpto', array('id' => $attempt->answerid)); // convert the jumpto to a proper page id if ($jumpto == 0) { // unlikely value! $lastpageseen = $attempt->pageid; } elseif ($jumpto == LESSON_NEXTPAGE) { if (!$lastpageseen = $DB->get_field('lesson_pages', 'nextpageid', array('id' => $attempt->pageid))) { // no nextpage go to end of lesson $lastpageseen = LESSON_EOL; } } else { $lastpageseen = $jumpto; } break; // only look at the latest correct attempt } } else { $attempts = NULL; } $params = array ("lessonid" => $lesson->id, "userid" => $USER->id, "retry" => $retries); if ($branchtables = $DB->get_records_select('lesson_branch', "lessonid = :lessonid AND userid = :userid AND retry = :retry", $params, 'timeseen DESC')) { // in here, user has viewed a branch table $lastbranchtable = current($branchtables); if ($attempts != NULL) { foreach($attempts as $attempt) { if ($lastbranchtable->timeseen > $attempt->timeseen) { // branch table was viewed later than the last attempt $lastpageseen = $lastbranchtable->pageid; } break; } } else { // hasnt answered any questions but has viewed a branch table $lastpageseen = $lastbranchtable->pageid; } } //if ($lastpageseen != $firstpageid) { if (isset($lastpageseen) and $DB->count_records('lesson_attempts', array('lessonid'=>$lesson->id, 'userid'=>$USER->id, 'retry'=>$retries)) > 0) { // get the first page if (!$firstpageid = $DB->get_field('lesson_pages', 'id', array('lessonid' => $lesson->id, 'prevpageid' => 0))) { print_error('cannotfindfirstpage', 'lesson'); } lesson_print_header($cm, $course, $lesson); if ($lesson->timed) { if ($lesson->retake) { print_simple_box('

'. get_string('leftduringtimed', 'lesson') .'

', 'center'); echo '
'. ''. get_string('continue', 'lesson').'
'; } else { print_simple_box_start('center'); echo '
'; echo get_string('leftduringtimednoretake', 'lesson'); echo '

'. get_string('returntocourse', 'lesson') .'
'; echo '
'; print_simple_box_end(); } } else { print_simple_box("

".get_string('youhaveseen','lesson').'

', "center"); echo '
'; echo ''. ''. get_string('yes').'   '; echo ''. ''. get_string('no').'
'; echo ''; } print_footer($course); exit(); } if ($grades) { foreach ($grades as $grade) { $bestgrade = $grade->grade; break; } if (!$lesson->retake) { lesson_print_header($cm, $course, $lesson, 'view'); print_simple_box_start('center'); echo "
"; echo get_string("noretake", "lesson"); echo "

id\">".get_string('returntocourse', 'lesson').'
'; echo "
"; print_simple_box_end(); print_footer($course); exit(); //redirect("../../course/view.php?id=$course->id", get_string("alreadytaken", "lesson")); // allow student to retake course even if they have the maximum grade // } elseif ($bestgrade == 100) { // redirect("../../course/view.php?id=$course->id", get_string("maximumgradeachieved", // "lesson")); } } // start at the first page if (!$pageid = $DB->get_field('lesson_pages', 'id', array('lessonid' => $lesson->id, 'prevpageid' => 0))) { print_error('cannotfindfirstpage', 'lesson'); } /// This is the code for starting a timed test if(!isset($USER->startlesson[$lesson->id]) && !has_capability('mod/lesson:manage', $context)) { $USER->startlesson[$lesson->id] = true; $startlesson = new stdClass; $startlesson->lessonid = $lesson->id; $startlesson->userid = $USER->id; $startlesson->starttime = time(); $startlesson->lessontime = time(); if (!$DB->insert_record('lesson_timer', $startlesson)) { print_error('cannotinserttimer', 'lesson'); } if ($lesson->timed) { lesson_set_message(get_string('maxtimewarning', 'lesson', $lesson->maxtime), 'center'); } } } if ($pageid != LESSON_EOL) { /// This is the code updates the lessontime for a timed test if ($startlastseen = optional_param('startlastseen', '', PARAM_ALPHA)) { /// this deletes old records not totally sure if this is necessary anymore if ($startlastseen == 'no') { $params = array ("lessonid" => $lesson->id, "userid" => $USER->id); if ($grades = $DB->get_records_select('lesson_grades', "lessonid = :lessonid AND userid = :userid", $params, 'grade DESC')) { $retries = count($grades); } else { $retries = 0; } if (!$DB->delete_records('lesson_attempts', array('userid' => $USER->id, 'lessonid' => $lesson->id, 'retry' => $retries))) { print_error('cannotdeleteattempt', 'lesson'); } if (!$DB->delete_records('lesson_branch', array('userid' => $USER->id, 'lessonid' => $lesson->id, 'retry' => $retries))) { print_error('cannotdeletebranch', 'lesson'); } } } add_to_log($course->id, 'lesson', 'view', 'view.php?id='. $cm->id, $pageid, $cm->id); if (!$page = $DB->get_record('lesson_pages', array('id' => $pageid))) { print_error('cannotfindpages', 'lesson'); } if ($page->qtype == LESSON_CLUSTER) { //this only gets called when a user starts up a new lesson and the first page is a cluster page if (!has_capability('mod/lesson:manage', $context)) { // get new id $pageid = lesson_cluster_jump($lesson->id, $USER->id, $pageid); // get new page info if (!$page = $DB->get_record('lesson_pages', array('id' => $pageid))) { print_error('cannotfindpages', 'lesson'); } add_to_log($course->id, 'lesson', 'view', 'view.php?id='. $cm->id, $pageid, $cm->id); } else { // get the next page $pageid = $page->nextpageid; if (!$page = $DB->get_record('lesson_pages', array('id' => $pageid))) { print_error('cannotfindpages', 'lesson'); } } } elseif ($page->qtype == LESSON_ENDOFCLUSTER) { // Check for endofclusters if ($page->nextpageid == 0) { $nextpageid = LESSON_EOL; } else { $nextpageid = $page->nextpageid; } redirect("$CFG->wwwroot/mod/lesson/view.php?id=$cm->id&pageid=$nextpageid"); } else if ($page->qtype == LESSON_ENDOFBRANCH) { // Check for endofbranches if ($answers = $DB->get_records('lesson_answers', array('pageid' => $page->id), 'id')) { // print_heading(get_string('endofbranch', 'lesson')); foreach ($answers as $answer) { // just need the first answer if ($answer->jumpto == LESSON_RANDOMBRANCH) { $answer->jumpto = lesson_unseen_branch_jump($lesson->id, $USER->id); } elseif ($answer->jumpto == LESSON_CLUSTERJUMP) { if (!has_capability('mod/lesson:manage', $context)) { $answer->jumpto = lesson_cluster_jump($lesson->id, $USER->id, $pageid); } else { if ($page->nextpageid == 0) { $answer->jumpto = LESSON_EOL; } else { $answer->jumpto = $page->nextpageid; } } } else if ($answer->jumpto == LESSON_NEXTPAGE) { if ($page->nextpageid == 0) { $answer->jumpto = LESSON_EOL; } else { $answer->jumpto = $page->nextpageid; } } else if ($answer->jumpto == 0) { $answer->jumpto = $page->id; } else if ($answer->jumpto == LESSON_PREVIOUSPAGE) { $answer->jumpto = $page->prevpageid; } redirect("$CFG->wwwroot/mod/lesson/view.php?id=$cm->id&pageid=$answer->jumpto"); break; } } else { print_error('cannotfindanswer', 'lesson'); } } // 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 where several messages (usually warnings) are displayed // all of this is displayed above the actual page // clock code // get time information for this user $timer = new stdClass; if(!has_capability('mod/lesson:manage', $context)) { $params = array ("lessonid" => $lesson->id, "userid" => $USER->id); if (!$timer = $DB->get_records_select('lesson_timer', "lessonid = :lessonid AND userid = :userid", $params, 'starttime')) { print_error('cannotfindtimer', 'lesson'); } else { $timer = array_pop($timer); // this will get the latest start time record } } $startlastseen = optional_param('startlastseen', '', PARAM_ALPHA); if ($startlastseen == 'yes') { // continue a previous test, need to update the clock (think this option is disabled atm) $timer->starttime = time() - ($timer->lessontime - $timer->starttime); $timer->lessontime = time(); } else if ($startlastseen == 'no') { // starting over // starting over, so reset the clock $timer->starttime = time(); $timer->lessontime = time(); } // for timed lessons, display clock if ($lesson->timed) { if(has_capability('mod/lesson:manage', $context)) { lesson_set_message(get_string('teachertimerwarning', 'lesson')); } else { $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')); } } } // update the clock if (!has_capability('mod/lesson:manage', $context)) { $timer->lessontime = time(); if (!$DB->update_record('lesson_timer', $timer)) { print_error('cannotupdatetimer', 'lesson'); } } /// This is the warning msg for teachers to inform them that cluster and unseen does not work while logged in as a teacher if(has_capability('mod/lesson:manage', $context)) { if (lesson_display_teacher_warning($lesson->id)) { $warningvars->cluster = get_string('clusterjump', 'lesson'); $warningvars->unseen = get_string('unseenpageinbranch', 'lesson'); lesson_set_message(get_string('teacherjumpwarning', 'lesson', $warningvars)); } } if ($page->qtype == LESSON_BRANCHTABLE) { if ($lesson->minquestions and !has_capability('mod/lesson:manage', $context)) { // tell student how many questions they have seen, how many are required and their grade $ntries = $DB->count_records("lesson_grades", array("lessonid"=>$lesson->id, "userid"=>$USER->id)); $gradeinfo = lesson_grade($lesson, $ntries); if ($gradeinfo->attempts) { if ($gradeinfo->nquestions < $lesson->minquestions) { $a = new stdClass; $a->nquestions = $gradeinfo->nquestions; $a->minquestions = $lesson->minquestions; lesson_set_message(get_string('numberofpagesviewednotice', 'lesson', $a)); } lesson_set_message(get_string("numberofcorrectanswers", "lesson", $gradeinfo->earned), 'notify'); $a = new stdClass; $a->grade = number_format($gradeinfo->grade * $lesson->grade / 100, 1); $a->total = $lesson->grade; lesson_set_message(get_string('yourcurrentgradeisoutof', 'lesson', $a), 'notify'); } } } $PAGE = page_create_instance($lesson->id); $PAGE->set_lessonpageid($page->id); $pageblocks = blocks_setup($PAGE); $leftcolumnwidth = bounded_number(180, blocks_preferred_width($pageblocks[BLOCK_POS_LEFT]), 210); $rightcolumnwidth = bounded_number(180, blocks_preferred_width($pageblocks[BLOCK_POS_RIGHT]), 210); if (($edit != -1) and $PAGE->user_allowed_editing()) { $USER->editing = $edit; } /// Print the page header, heading and tabs $PAGE->print_header(); if ($attemptflag) { print_heading(get_string('attempt', 'lesson', $retries + 1)); } /// This calculates and prints the ongoing score if ($lesson->ongoing and !empty($pageid)) { lesson_print_ongoing_score($lesson); } require($CFG->dirroot.'/mod/lesson/viewstart.html'); // now starting to print the page's contents if ($page->qtype == LESSON_BRANCHTABLE) { print_heading(format_string($page->title)); } else { $lesson->slideshow = false; // turn off slide show for all pages other than LESSON_BRANTCHTABLE } if (!$lesson->slideshow) { $options = new stdClass; $options->noclean = true; print_simple_box('
'. format_text($page->contents, FORMAT_MOODLE, $options). '
', 'center'); } // this is for modattempts option. Find the users previous answer to this page, // and then display it below in answer processing if (isset($USER->modattempts[$lesson->id])) { $retries = $DB->count_records('lesson_grades', array("lessonid"=>$lesson->id, "userid"=>$USER->id)); $retries--; $params = array ("lessonid" => $lesson->id, "userid" => $USER->id, "pageid" => $page->id, "retry" => $retries); if (! $attempts = $DB->get_records_select("lesson_attempts", "lessonid = :lessonid AND userid = :userid AND pageid = :pageid AND retry = :retry", $params, "timeseen")) { print_error('cannotfindpreattempt', 'lesson'); } $attempt = end($attempts); } // get the answers in a set order, the id order if ($answers = $DB->get_records("lesson_answers", array("pageid" => $page->id), "id")) { if ($page->qtype != LESSON_BRANCHTABLE) { // To fix XHTML problem (BT have their own forms) echo "
"; echo '
'; echo "id\" />"; echo ""; echo ""; echo ""; print_simple_box_start("center"); echo ''; } // default format text options $options = new stdClass; $options->para = false; // no

$options->noclean = true; // echo "qtype is $page->qtype"; // debug switch ($page->qtype) { case LESSON_SHORTANSWER : case LESSON_NUMERICAL : if (isset($USER->modattempts[$lesson->id])) { $value = 'value="'.s($attempt->useranswer).'"'; } else { $value = ""; } echo '
'. ": \n"; echo '
'; print_simple_box_end(); lesson_print_submit_link(get_string('pleaseenteryouranswerinthebox', 'lesson'), 'answerform'); break; case LESSON_TRUEFALSE : shuffle($answers); $i = 0; foreach ($answers as $answer) { echo ''; if (isset($USER->modattempts[$lesson->id]) && $answer->id == $attempt->answerid) { $checked = 'checked="checked"'; } else { $checked = ''; } echo "id}\" $checked />"; echo ""; echo "'; echo ''; if ($answer != end($answers)) { echo "
"; } $i++; } echo ''; print_simple_box_end(); lesson_print_submit_link(get_string('pleasecheckoneanswer', 'lesson'), 'answerform'); break; case LESSON_MULTICHOICE : $i = 0; shuffle($answers); foreach ($answers as $answer) { echo ''; if ($page->qoption) { $checked = ''; if (isset($USER->modattempts[$lesson->id])) { $answerids = explode(",", $attempt->useranswer); if (in_array($answer->id, $answerids)) { $checked = ' checked="checked"'; } else { $checked = ''; } } // more than one answer allowed echo "id}\"$checked />"; } else { if (isset($USER->modattempts[$lesson->id]) && $answer->id == $attempt->answerid) { $checked = ' checked="checked"'; } else { $checked = ''; } // only one answer allowed echo "id}\"$checked />"; } echo ''; echo "'; echo ''; if ($answer != end($answers)) { echo '
'; } $i++; } echo ''; print_simple_box_end(); if ($page->qoption) { $linkname = get_string('pleasecheckoneormoreanswers', 'lesson'); } else { $linkname = get_string('pleasecheckoneanswer', 'lesson'); } lesson_print_submit_link($linkname, 'answerform'); break; case LESSON_MATCHING : // don't suffle answers (could be an option??) foreach ($answers as $answer) { // get all the response if ($answer->response != NULL) { $responses[] = trim($answer->response); } } $responseoptions = array(); if (!empty($responses)) { shuffle($responses); $responses = array_unique($responses); foreach ($responses as $response) { $responseoptions[htmlspecialchars(trim($response))] = $response; } } if (isset($USER->modattempts[$lesson->id])) { $useranswers = explode(',', $attempt->useranswer); $t = 0; } foreach ($answers as $answer) { if ($answer->response != NULL) { echo ''; echo ": '; if (isset($USER->modattempts[$lesson->id])) { $selected = htmlspecialchars(trim($answers[$useranswers[$t]]->response)); // gets the user's previous answer choose_from_menu ($responseoptions, "response[$answer->id]", $selected); $t++; } else { choose_from_menu ($responseoptions, "response[$answer->id]"); } echo ''; if ($answer != end($answers)) { echo '
'; } } } echo ''; print_simple_box_end(); lesson_print_submit_link(get_string('pleasematchtheabovepairs', 'lesson'), 'answerform'); break; case LESSON_BRANCHTABLE : $options = new stdClass; $options->para = false; $buttons = array(); $i = 0; foreach ($answers as $answer) { // Each button must have its own form inorder for it to work with JavaScript turned off $button = "wwwroot/mod/lesson/lesson.php\">\n". '
'. "id\" />\n". "\n". "\n". "\n". "jumpto\" />\n". lesson_print_submit_link(strip_tags(format_text($answer->answer, FORMAT_MOODLE, $options)), "answerform$i", '', '', '', '', true). '
'. ''; $buttons[] = $button; $i++; } /// Set the orientation if ($page->layout) { $orientation = 'horizontal'; } else { $orientation = 'vertical'; } $fullbuttonhtml = "\n
\n" . implode("\n", $buttons). "\n
\n"; if ($lesson->slideshow) { $options = new stdClass; $options->noclean = true; echo '
'.format_text($page->contents, FORMAT_MOODLE, $options)."
\n"; echo ''; echo $fullbuttonhtml; } else { echo $fullbuttonhtml; } break; case LESSON_ESSAY : if (isset($USER->modattempts[$lesson->id])) { $essayinfo = unserialize($attempt->useranswer); $value = s($essayinfo->answer); } else { $value = ""; } echo ':'. '\n"; echo ''; print_simple_box_end(); lesson_print_submit_link(get_string('pleaseenteryouranswerinthebox', 'lesson'), 'answerform'); break; default: // close the tags MDL-7861 echo (''); print_simple_box_end(); break; } if ($page->qtype != LESSON_BRANCHTABLE) { // To fix XHTML problem (BT have their own forms) echo '
'; echo "\n"; } } else { // a page without answers - find the next (logical) page echo "
wwwroot/mod/lesson/view.php\">\n"; echo '
'; echo "id\" />\n"; if ($lesson->nextpagedefault) { // in Flash Card mode... // ...first get number of retakes $nretakes = $DB->count_records("lesson_grades", array("lessonid"=>$lesson->id, "userid"=>$USER->id)); // ...then get the page ids (lessonid the 5th param is needed to make $DB->get_records play) $allpages = $DB->get_records("lesson_pages", array("lessonid" => $lesson->id), "id", "id,lessonid"); shuffle ($allpages); $found = false; if ($lesson->nextpagedefault == LESSON_UNSEENPAGE) { foreach ($allpages as $thispage) { if (!$DB->count_records("lesson_attempts", array("pageid"=>$thispage->id, "userid"=>$USER->id, "retry"=>$nretakes))) { $found = true; break; } } } elseif ($lesson->nextpagedefault == LESSON_UNANSWEREDPAGE) { foreach ($allpages as $thispage) { if (!$DB->count_records("lesson_attempts", array('pageid'=>$thispage->id, 'userid'=>$USER->id, 'correct'=>1, 'retry'=>$nretakes))) { $found = true; break; } } } if ($found) { $newpageid = $thispage->id; if ($lesson->maxpages) { // check number of pages viewed (in the lesson) if ($DB->count_records("lesson_attempts", array("lessonid"=>$lesson->id, "userid"=>$USER->id, "retry"=>$nretakes)) >= $lesson->maxpages) { $newpageid = LESSON_EOL; } } } else { $newpageid = LESSON_EOL; } } else { // in normal lesson mode... if (!$newpageid = $DB->get_field("lesson_pages", "nextpageid", array("id" => $pageid))) { // this is the last page - flag end of lesson $newpageid = LESSON_EOL; } } echo "\n"; lesson_print_submit_link(get_string('continue', 'lesson'), 'pageform'); echo '
'; echo "
\n"; } // Finish of the page lesson_print_progress_bar($lesson, $course); require($CFG->dirroot.'/mod/lesson/viewend.html'); } else { // end of lesson reached work out grade // Used to check to see if the student ran out of time $outoftime = optional_param('outoftime', '', PARAM_ALPHA); // Update the clock / get time information for this user if (!has_capability('mod/lesson:manage', $context)) { unset($USER->startlesson[$lesson->id]); $params = array ("lessonid" => $lesson->id, "userid" => $USER->id); if (!$timer = $DB->get_records_select('lesson_timer', "lessonid = :lessonid AND userid = :userid", $params, 'starttime')) { print_error('cannotfindtimer', 'lesson'); } else { $timer = array_pop($timer); // this will get the latest start time record } $timer->lessontime = time(); if (!$DB->update_record("lesson_timer", $timer)) { print_error('cannotupdatetimer', 'lesson'); } } add_to_log($course->id, "lesson", "end", "view.php?id=$cm->id", "$lesson->id", $cm->id); lesson_print_header($cm, $course, $lesson, 'view'); print_heading(get_string("congratulations", "lesson")); print_simple_box_start("center"); $ntries = $DB->count_records("lesson_grades", array("lessonid"=>$lesson->id, "userid"=>$USER->id)); if (isset($USER->modattempts[$lesson->id])) { $ntries--; // need to look at the old attempts :) } if (!has_capability('mod/lesson:manage', $context)) { $gradeinfo = lesson_grade($lesson, $ntries); if ($gradeinfo->attempts) { if (!$lesson->custom) { echo "

".get_string("numberofpagesviewed", "lesson", $gradeinfo->nquestions). "

\n"; if ($lesson->minquestions) { if ($gradeinfo->nquestions < $lesson->minquestions) { // print a warning and set nviewed to minquestions echo "

".get_string("youshouldview", "lesson", $lesson->minquestions)."

\n"; } } echo "

".get_string("numberofcorrectanswers", "lesson", $gradeinfo->earned). "

\n"; } $a = new stdClass; $a->score = $gradeinfo->earned; $a->grade = $gradeinfo->total; if ($gradeinfo->nmanual) { $a->tempmaxgrade = $gradeinfo->total - $gradeinfo->manualpoints; $a->essayquestions = $gradeinfo->nmanual; echo "
".get_string("displayscorewithessays", "lesson", $a)."
"; } else { echo "
".get_string("displayscorewithoutessays", "lesson", $a)."
"; } $a = new stdClass; $a->grade = number_format($gradeinfo->grade * $lesson->grade / 100, 1); $a->total = $lesson->grade; echo "

".get_string('yourcurrentgradeisoutof', 'lesson', $a)."

\n"; $grade->lessonid = $lesson->id; $grade->userid = $USER->id; $grade->grade = $gradeinfo->grade; $grade->completed = time(); if (!$lesson->practice) { if (isset($USER->modattempts[$lesson->id])) { // if reviewing, make sure update old grade record $params = array ("lessonid" => $lesson->id, "userid" => $USER->id); if (!$grades = $DB->get_records_select("lesson_grades", "lessonid = :lessonid and userid = :userid", $params, "completed")) { print_error('cannotfindgrade', 'lesson'); } $oldgrade = end($grades); $grade->id = $oldgrade->id; if (!$update = $DB->update_record("lesson_grades", $grade)) { print_error('cannotupdategrade', 'lesson'); } } else { if (!$newgradeid = $DB->insert_record("lesson_grades", $grade)) { print_error('cannotinsertgrade', 'lesson'); } } } else { if (!$DB->delete_records("lesson_attempts", array("lessonid" => $lesson->id, "userid" => $USER->id, "retry" => $ntries))) { print_error('cannotdeleteattempt', 'lesson'); } } } else { if ($lesson->timed) { if ($outoftime == 'normal') { $grade = new stdClass; $grade->lessonid = $lesson->id; $grade->userid = $USER->id; $grade->grade = 0; $grade->completed = time(); if (!$lesson->practice) { if (!$newgradeid = $DB->insert_record("lesson_grades", $grade)) { print_error('cannotinsertgrade', 'lesson'); } } echo get_string("eolstudentoutoftimenoanswers", "lesson"); } } else { echo get_string("welldone", "lesson"); } } // update central gradebook lesson_update_grades($lesson, $USER->id); } else { // display for teacher echo "

".get_string("displayofgrade", "lesson")."

\n"; } print_simple_box_end(); //End of Lesson button to Continue. // after all the grade processing, check to see if "Show Grades" is off for the course // if yes, redirect to the course page if (!$course->showgrades) { redirect($CFG->wwwroot.'/course/view.php?id='.$course->id); } // high scores code if ($lesson->highscores && !has_capability('mod/lesson:manage', $context) && !$lesson->practice) { echo "

"; $params = array ("lessonid" => $lesson->id); if ($grades = $DB->get_records_select("lesson_grades", "lessonid = :lessonid", $params, "completed")) { $madeit = false; if ($highscores = $DB->get_records_select("lesson_high_scores", "lessonid = :lessonid", $params)) { // get all the high scores into an array $topscores = array(); $uniquescores = array(); foreach ($highscores as $highscore) { $grade = $grades[$highscore->gradeid]->grade; $topscores[] = $grade; $uniquescores[$grade] = 1; } // sort to find the lowest score sort($topscores); $lowscore = $topscores[0]; if ($gradeinfo->grade >= $lowscore || count($uniquescores) <= $lesson->maxhighscores) { $madeit = true; } } if (!$highscores or $madeit) { echo '

'.get_string("youmadehighscore", "lesson", $lesson->maxhighscores). '

'; lesson_print_submit_link(get_string('clicktopost', 'lesson'), 'highscores'); echo '

'; } else { echo get_string("nothighscore", "lesson", $lesson->maxhighscores)."
"; } } echo "
wwwroot/mod/lesson/highscores.php?id=$cm->id&link=1\">".get_string("viewhighscores", "lesson").'
'; echo "
"; } if ($lesson->modattempts && !has_capability('mod/lesson:manage', $context)) { // make sure if the student is reviewing, that he/she sees the same pages/page path that he/she saw the first time // look at the attempt records to find the first QUESTION page that the user answered, then use that page id // to pass to view again. This is slick cause it wont call the empty($pageid) code // $ntries is decremented above $params = array ("lessonid" => $lesson->id, "userid" => $USER->id, "retry" => $ntries); if (!$attempts = $DB->get_records_select("lesson_attempts", "lessonid = :lessonid AND userid = :userid AND retry = :retry", $params, "timeseen")) { $attempts = array(); } $firstattempt = current($attempts); $pageid = $firstattempt->pageid; // IF the student wishes to review, need to know the last question page that the student answered. This will help to make // sure that the student can leave the lesson via pushing the continue button. $lastattempt = end($attempts); $USER->modattempts[$lesson->id] = $lastattempt->pageid; echo "
id&pageid=$pageid\">".get_string("reviewlesson", "lesson")."
\n"; } elseif ($lesson->modattempts && has_capability('mod/lesson:manage', $context)) { echo "

".get_string("modattemptsnoteacher", "lesson")."

"; } if ($lesson->activitylink) { if ($module = $DB->get_record('course_modules', array('id' => $lesson->activitylink))) { if ($modname = $DB->get_field('modules', 'name', array('id' => $module->module))) if ($instance = $DB->get_record($modname, array('id' => $module->instance))) { echo "
". "wwwroot/mod/$modname/view.php?id=$lesson->activitylink\">". get_string('activitylinkname', 'lesson', $instance->name)."
\n"; } } } echo "
wwwroot/course/view.php?id=$course->id\">".get_string('returnto', 'lesson', format_string($course->fullname, true))."
\n"; echo "
wwwroot/grade/index.php?id=$course->id\">".get_string('viewgrades', 'lesson')."
\n"; } /// Finish the page print_footer($course); ?>