mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 06:18:28 +01:00
4e1132a8c5
Put in most of the obvious missing require_once($CFG->libdir . '/completionlib.php');
1021 lines
53 KiB
PHP
1021 lines
53 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(dirname(__FILE__) . '/../../config.php');
|
|
require_once($CFG->dirroot.'/mod/lesson/locallib.php');
|
|
require_once($CFG->dirroot.'/mod/lesson/lib.php');
|
|
require_once($CFG->libdir . '/completionlib.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 == trim($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();
|
|
|
|
$DB->insert_record('lesson_timer', $startlesson);
|
|
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;
|
|
}
|
|
$DB->delete_records('lesson_attempts', array('userid' => $USER->id, 'lessonid' => $lesson->id, 'retry' => $retries));
|
|
$DB->delete_records('lesson_branch', array('userid' => $USER->id, 'lessonid' => $lesson->id, 'retry' => $retries));
|
|
}
|
|
}
|
|
|
|
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();
|
|
$DB->update_record('lesson_timer', $timer);
|
|
}
|
|
|
|
/// 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->set_url('mod/lesson/view.php', array('id' => $cm->id, 'pageid' => $page->id));
|
|
$PAGE->set_subpage($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
|
|
lesson_print_header($cm, $course, $lesson, 'view', 'true', $page->id);
|
|
|
|
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();
|
|
|
|
$DB->update_record("lesson_timer", $timer);
|
|
}
|
|
|
|
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;
|
|
$DB->update_record("lesson_grades", $grade);
|
|
} else {
|
|
$newgradeid = $DB->insert_record("lesson_grades", $grade);
|
|
}
|
|
} else {
|
|
$DB->delete_records("lesson_attempts", array("lessonid" => $lesson->id, "userid" => $USER->id, "retry" => $ntries));
|
|
}
|
|
} 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) {
|
|
$newgradeid = $DB->insert_record("lesson_grades", $grade);
|
|
}
|
|
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);
|
|
?>
|