mirror of
https://github.com/moodle/moodle.git
synced 2025-02-13 20:36:42 +01:00
Passwords are now held in clear text so you can see what the password is on the config screen. Still backward compatible with old md5 passwords (which are still not displayed of course) Merged from STABLE_19
1040 lines
54 KiB
PHP
1040 lines
54 KiB
PHP
<?php // $Id$
|
|
/**
|
|
* This page prints a particular instance of lesson
|
|
*
|
|
* @version $Id$
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
|
|
* @package lesson
|
|
**/
|
|
|
|
require_once('../../config.php');
|
|
require_once($CFG->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);
|
|
$userpassword = optional_param('userpassword','',PARAM_CLEAN);
|
|
|
|
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 '<div style="text-align:center;">';
|
|
echo '<p>'.$message.'</p>';
|
|
echo '<div class="lessonbutton standardbutton" style="padding: 5px;"><a href="'.$CFG->wwwroot.'/course/view.php?id='. $course->id .'">'. get_string('returnto', 'lesson', format_string($course->fullname, true)) .'</a></div>';
|
|
echo '</div>';
|
|
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 (!empty($userpassword)) {
|
|
// with or without md5 for backward compatibility (MDL-11090)
|
|
if (($lesson->password == md5(trim($userpassword))) or ($lesson->password == $userpassword)) {
|
|
$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 "<div class=\"password-form\">\n";
|
|
print_simple_box_start('center');
|
|
echo '<form id="password" method="post" action="'.$CFG->wwwroot.'/mod/lesson/view.php" autocomplete="off">' . "\n";
|
|
echo '<fieldset class="invisiblefieldset">';
|
|
echo '<input type="hidden" name="id" value="'. $cm->id .'" />' . "\n";
|
|
if (optional_param('userpassword', 0, PARAM_CLEAN)) {
|
|
notify(get_string('loginfail', 'lesson'));
|
|
}
|
|
|
|
echo get_string('passwordprotectedlesson', 'lesson', format_string($lesson->name))."<br /><br />\n".
|
|
get_string('enterpassword', 'lesson')." <input type=\"password\" name=\"userpassword\" /><br /><br />\n<center>".
|
|
'<span class="lessonbutton standardbutton"><a href="'.$CFG->wwwroot.'/course/view.php?id='. $course->id .'">'. get_string('cancel', 'lesson') .'</a></span> ';
|
|
|
|
lesson_print_submit_link(get_string('continue', 'lesson'), 'password', 'center', 'standardbutton submitbutton');
|
|
echo '</fieldset></form>';
|
|
print_simple_box_end();
|
|
echo "</div>\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 '<p>';
|
|
print_simple_box_start('center');
|
|
print_string('completethefollowingconditions', 'lesson', $dependentlesson->name);
|
|
echo '<p style="text-align:center;">'.implode('<br />'.get_string('and', 'lesson').'<br />', $errors).'</p>';
|
|
print_simple_box_end();
|
|
echo '</p>';
|
|
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('lessonnotready2', 'lesson')); // 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('<p style="text-align:center;">'. get_string('leftduringtimed', 'lesson') .'</p>', 'center');
|
|
echo '<div style="text-align:center;" class="lessonbutton standardbutton">'.
|
|
'<a href="view.php?id='.$cm->id.'&pageid='.$firstpageid.'&startlastseen=no">'.
|
|
get_string('continue', 'lesson').'</a></div>';
|
|
} else {
|
|
print_simple_box_start('center');
|
|
echo '<div style="text-align:center;">';
|
|
echo get_string('leftduringtimednoretake', 'lesson');
|
|
echo '<br /><br /><div class="lessonbutton standardbutton"><a href="../../course/view.php?id='. $course->id .'">'. get_string('returntocourse', 'lesson') .'</a></div>';
|
|
echo '</div>';
|
|
print_simple_box_end();
|
|
}
|
|
|
|
} else {
|
|
print_simple_box("<p style=\"text-align:center;\">".get_string('youhaveseen','lesson').'</p>',
|
|
"center");
|
|
|
|
echo '<div style="text-align:center;">';
|
|
echo '<span class="lessonbutton standardbutton">'.
|
|
'<a href="view.php?id='.$cm->id.'&pageid='.$lastpageseen.'&startlastseen=yes">'.
|
|
get_string('yes').'</a></span> ';
|
|
echo '<span class="lessonbutton standardbutton">'.
|
|
'<a href="view.php?id='.$cm->id.'&pageid='.$firstpageid.'&startlastseen=no">'.
|
|
get_string('no').'</a></div>';
|
|
echo '</span>';
|
|
}
|
|
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 "<div style=\"text-align:center;\">";
|
|
echo get_string("noretake", "lesson");
|
|
echo "<br /><br /><div class=\"lessonbutton standardbutton\"><a href=\"../../course/view.php?id=$course->id\">".get_string('returntocourse', 'lesson').'</a></div>';
|
|
echo "</div>";
|
|
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('<div class="contents">'.
|
|
format_text($page->contents, FORMAT_MOODLE, $options).
|
|
'</div>', '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 "<form id=\"answerform\" method =\"post\" action=\"lesson.php\" autocomplete=\"off\">";
|
|
echo '<fieldset class="invisiblefieldset">';
|
|
echo "<input type=\"hidden\" name=\"id\" value=\"$cm->id\" />";
|
|
echo "<input type=\"hidden\" name=\"action\" value=\"continue\" />";
|
|
echo "<input type=\"hidden\" name=\"pageid\" value=\"$pageid\" />";
|
|
echo "<input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />";
|
|
print_simple_box_start("center");
|
|
echo '<table width="100%">';
|
|
}
|
|
// default format text options
|
|
$options = new stdClass;
|
|
$options->para = false; // no <p></p>
|
|
$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 '<tr><td style="text-align:center;"><label for="answer">'.get_string('youranswer', 'lesson').'</label>'.
|
|
": <input type=\"text\" id=\"answer\" name=\"answer\" size=\"50\" maxlength=\"200\" $value />\n";
|
|
echo '</td></tr></table>';
|
|
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 '<tr><td valign="top">';
|
|
if (isset($USER->modattempts[$lesson->id]) && $answer->id == $attempt->answerid) {
|
|
$checked = 'checked="checked"';
|
|
} else {
|
|
$checked = '';
|
|
}
|
|
echo "<input type=\"radio\" id=\"answerid$i\" name=\"answerid\" value=\"{$answer->id}\" $checked />";
|
|
echo "</td><td>";
|
|
echo "<label for=\"answerid$i\">".format_text(trim($answer->answer), FORMAT_MOODLE, $options).'</label>';
|
|
echo '</td></tr>';
|
|
if ($answer != end($answers)) {
|
|
echo "<tr><td><br /></td></tr>";
|
|
}
|
|
$i++;
|
|
}
|
|
echo '</table>';
|
|
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 '<tr><td valign="top">';
|
|
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 "<input type=\"checkbox\" id=\"answerid$i\" name=\"answer[$i]\" value=\"{$answer->id}\"$checked />";
|
|
} else {
|
|
if (isset($USER->modattempts[$lesson->id]) && $answer->id == $attempt->answerid) {
|
|
$checked = ' checked="checked"';
|
|
} else {
|
|
$checked = '';
|
|
}
|
|
// only one answer allowed
|
|
echo "<input type=\"radio\" id=\"answerid$i\" name=\"answerid\" value=\"{$answer->id}\"$checked />";
|
|
}
|
|
echo '</td><td>';
|
|
echo "<label for=\"answerid$i\" >".format_text(trim($answer->answer), FORMAT_MOODLE, $options).'</label>';
|
|
echo '</td></tr>';
|
|
if ($answer != end($answers)) {
|
|
echo '<tr><td><br /></td></tr>';
|
|
}
|
|
$i++;
|
|
}
|
|
echo '</table>';
|
|
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 '<tr><td align="right">';
|
|
echo "<b><label for=\"menuresponse[$answer->id]\">".
|
|
format_text($answer->answer,FORMAT_MOODLE,$options).
|
|
'</label>: </b></td><td valign="bottom">';
|
|
|
|
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 '</td></tr>';
|
|
if ($answer != end($answers)) {
|
|
echo '<tr><td><br /></td></tr>';
|
|
}
|
|
}
|
|
}
|
|
echo '</table>';
|
|
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 = "<form id=\"answerform$i\" method=\"post\" action=\"$CFG->wwwroot/mod/lesson/lesson.php\">\n".
|
|
'<div>'.
|
|
"<input type=\"hidden\" name=\"id\" value=\"$cm->id\" />\n".
|
|
"<input type=\"hidden\" name=\"action\" value=\"continue\" />\n".
|
|
"<input type=\"hidden\" name=\"pageid\" value=\"$pageid\" />\n".
|
|
"<input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n".
|
|
"<input type=\"hidden\" name=\"jumpto\" value=\"$answer->jumpto\" />\n".
|
|
lesson_print_submit_link(strip_tags(format_text($answer->answer, FORMAT_MOODLE, $options)), "answerform$i", '', '', '', '', true).
|
|
'</div>'.
|
|
'</form>';
|
|
|
|
$buttons[] = $button;
|
|
$i++;
|
|
}
|
|
|
|
/// Set the orientation
|
|
if ($page->layout) {
|
|
$orientation = 'horizontal';
|
|
} else {
|
|
$orientation = 'vertical';
|
|
}
|
|
|
|
$fullbuttonhtml = "\n<div class=\"branchbuttoncontainer $orientation\">\n" .
|
|
implode("\n", $buttons).
|
|
"\n</div>\n";
|
|
|
|
if ($lesson->slideshow) {
|
|
$options = new stdClass;
|
|
$options->noclean = true;
|
|
echo '<div class="contents">'.format_text($page->contents, FORMAT_MOODLE, $options)."</div>\n";
|
|
echo '</div><!--end slideshow div-->';
|
|
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 '<tr><td style="text-align:center;" valign="top" nowrap="nowrap"><label for="answer">'.get_string("youranswer", "lesson").'</label>:</td><td>'.
|
|
'<textarea id="answer" name="answer" rows="15" cols="60">'.$value."</textarea>\n";
|
|
echo '</td></tr></table>';
|
|
print_simple_box_end();
|
|
lesson_print_submit_link(get_string('pleaseenteryouranswerinthebox', 'lesson'), 'answerform');
|
|
break;
|
|
default: // close the tags MDL-7861
|
|
echo ('</table>');
|
|
print_simple_box_end();
|
|
break;
|
|
}
|
|
if ($page->qtype != LESSON_BRANCHTABLE) { // To fix XHTML problem (BT have their own forms)
|
|
echo '</fieldset>';
|
|
echo "</form>\n";
|
|
}
|
|
} else {
|
|
// a page without answers - find the next (logical) page
|
|
echo "<form id=\"pageform\" method=\"post\" action=\"$CFG->wwwroot/mod/lesson/view.php\">\n";
|
|
echo '<div>';
|
|
echo "<input type=\"hidden\" name=\"id\" value=\"$cm->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 "<input type=\"hidden\" name=\"pageid\" value=\"$newpageid\" />\n";
|
|
lesson_print_submit_link(get_string('continue', 'lesson'), 'pageform');
|
|
echo '</div>';
|
|
echo "</form>\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 "<p style=\"text-align:center;\">".get_string("numberofpagesviewed", "lesson", $gradeinfo->nquestions).
|
|
"</p>\n";
|
|
if ($lesson->minquestions) {
|
|
if ($gradeinfo->nquestions < $lesson->minquestions) {
|
|
// print a warning and set nviewed to minquestions
|
|
echo "<p style=\"text-align:center;\">".get_string("youshouldview", "lesson",
|
|
$lesson->minquestions)."</p>\n";
|
|
}
|
|
}
|
|
echo "<p style=\"text-align:center;\">".get_string("numberofcorrectanswers", "lesson", $gradeinfo->earned).
|
|
"</p>\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 "<div style=\"text-align:center;\">".get_string("displayscorewithessays", "lesson", $a)."</div>";
|
|
} else {
|
|
echo "<div style=\"text-align:center;\">".get_string("displayscorewithoutessays", "lesson", $a)."</div>";
|
|
}
|
|
$a = new stdClass;
|
|
$a->grade = number_format($gradeinfo->grade * $lesson->grade / 100, 1);
|
|
$a->total = $lesson->grade;
|
|
echo "<p style=\"text-align:center;\">".get_string('yourcurrentgradeisoutof', 'lesson', $a)."</p>\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 "<p style=\"text-align:center;\">".get_string("displayofgrade", "lesson")."</p>\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 "<div style=\"text-align:center;\"><br />";
|
|
$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 '<p>'.get_string("youmadehighscore", "lesson", $lesson->maxhighscores).
|
|
'</p>
|
|
<form method="post" id="highscores" action="'.$CFG->wwwroot.'/mod/lesson/highscores.php">
|
|
<div>
|
|
<input type="hidden" name="mode" value="add" />
|
|
<input type="hidden" name="id" value="'.$cm->id.'" />
|
|
<input type="hidden" name="sesskey" value="'.sesskey().'" />
|
|
<p>';
|
|
lesson_print_submit_link(get_string('clicktopost', 'lesson'), 'highscores');
|
|
echo '</p>
|
|
</div>
|
|
</form>';
|
|
} else {
|
|
echo get_string("nothighscore", "lesson", $lesson->maxhighscores)."<br />";
|
|
}
|
|
}
|
|
echo "<br /><div style=\"padding: 5px;\" class=\"lessonbutton standardbutton\"><a href=\"$CFG->wwwroot/mod/lesson/highscores.php?id=$cm->id&link=1\">".get_string("viewhighscores", "lesson").'</a></div>';
|
|
echo "</div>";
|
|
}
|
|
|
|
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 "<div style=\"text-align:center; padding:5px;\" class=\"lessonbutton standardbutton\"><a href=\"view.php?id=$cm->id&pageid=$pageid\">".get_string("reviewlesson", "lesson")."</a></div>\n";
|
|
} elseif ($lesson->modattempts && has_capability('mod/lesson:manage', $context)) {
|
|
echo "<p style=\"text-align:center;\">".get_string("modattemptsnoteacher", "lesson")."</p>";
|
|
}
|
|
|
|
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 "<div style=\"text-align:center; padding:5px;\" class=\"lessonbutton standardbutton\">".
|
|
"<a href=\"$CFG->wwwroot/mod/$modname/view.php?id=$lesson->activitylink\">".
|
|
get_string('activitylinkname', 'lesson', $instance->name)."</a></div>\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
echo "<div style=\"text-align:center; padding:5px;\" class=\"lessonbutton standardbutton\"><a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">".get_string('returnto', 'lesson', format_string($course->fullname, true))."</a></div>\n";
|
|
echo "<div style=\"text-align:center; padding:5px;\" class=\"lessonbutton standardbutton\"><a href=\"$CFG->wwwroot/grade/index.php?id=$course->id\">".get_string('viewgrades', 'lesson')."</a></div>\n";
|
|
}
|
|
|
|
/// Finish the page
|
|
print_footer($course);
|
|
|
|
/// Mark as viewed
|
|
$completion=new completion_info($course);
|
|
$completion->set_module_viewed($cm);
|
|
?>
|