diff --git a/lib/completionlib.php b/lib/completionlib.php index a747101b6cf..c705d6194ed 100644 --- a/lib/completionlib.php +++ b/lib/completionlib.php @@ -592,6 +592,9 @@ class completion_info { * Should be called whenever a module is 'viewed' (it is up to the module how to * determine that). Has no effect if viewing is not set as a completion condition. * + * Note that this function must be called before you print the page header because + * it is possible that the navigation block may depend on it. If you call it after + * printing the header, it shows a developer debug warning. * @uses COMPLETION_VIEW_NOT_REQUIRED * @uses COMPLETION_VIEWED * @uses COMPLETION_COMPLETE @@ -600,6 +603,11 @@ class completion_info { * @return void */ public function set_module_viewed($cm, $userid=0) { + global $PAGE; + if ($PAGE->headerprinted) { + debugging('set_module_viewed must be called before header is printed', + DEBUG_DEVELOPER); + } // Don't do anything if view condition is not turned on if ($cm->completionview == COMPLETION_VIEW_NOT_REQUIRED || !$this->is_enabled($cm)) { return; @@ -932,6 +940,8 @@ class completion_info { if ($data->userid == $USER->id) { $SESSION->completioncache[$cm->course][$cm->id] = $data; + $reset = 'reset'; + get_fast_modinfo($reset); } } diff --git a/mod/chat/view.php b/mod/chat/view.php index 1033edcf298..0475e8a2d87 100644 --- a/mod/chat/view.php +++ b/mod/chat/view.php @@ -79,6 +79,10 @@ $strnextsession = get_string('nextsession', 'chat'); $title = $course->shortname . ': ' . format_string($chat->name); +// Mark viewed by user (if required) +$completion = new completion_info($course); +$completion->set_module_viewed($cm); + // Initialize $PAGE $PAGE->set_url('/mod/chat/view.php', array('id' => $cm->id)); $PAGE->set_title($title); @@ -178,7 +182,4 @@ if ($chatusers = chat_get_users($chat->id, $currentgroup, $cm->groupingid)) { echo $OUTPUT->box_end(); } -$completion = new completion_info($course); -$completion->set_module_viewed($cm); - echo $OUTPUT->footer(); diff --git a/mod/choice/view.php b/mod/choice/view.php index 458b53011a6..2e11c5e491e 100644 --- a/mod/choice/view.php +++ b/mod/choice/view.php @@ -50,6 +50,10 @@ $PAGE->set_title(format_string($choice->name)); $PAGE->set_heading($course->fullname); + // Mark viewed by user (if required) + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + /// Submit any new data if there is any if (data_submitted() && is_enrolled($context, NULL, 'mod/choice:choose') && confirm_sesskey()) { $timenow = time(); @@ -168,8 +172,3 @@ } echo $OUTPUT->footer(); - -/// Mark as viewed - $completion=new completion_info($course); - $completion->set_module_viewed($cm); - diff --git a/mod/data/view.php b/mod/data/view.php index d94443d37b2..a8fdb05258c 100644 --- a/mod/data/view.php +++ b/mod/data/view.php @@ -289,6 +289,10 @@ $PAGE->requires->js('/mod/data/js.php?d='.$data->id, true); } + // Mark as viewed + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + /// Print the page header // Note: MDL-19010 there will be further changes to printing header and blocks. // The code will be much nicer than this eventually. @@ -730,11 +734,6 @@ if ($showactivity) { if (($maxcount || $mode == 'asearch') && $mode != 'single') { data_print_preference_form($data, $perpage, $search, $sort, $order, $search_array, $advanced, $mode); } - -/// Mark as viewed - $completion=new completion_info($course); - $completion->set_module_viewed($cm); } echo $OUTPUT->footer(); - diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php index a325e9e0c6d..7f81b9b9a04 100644 --- a/mod/feedback/complete.php +++ b/mod/feedback/complete.php @@ -121,6 +121,10 @@ print_error('error'); } + // Mark activity viewed for completion-tracking + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + /// Print the page header $strfeedbacks = get_string("modulenameplural", "feedback"); $strfeedback = get_string("modulename", "feedback"); @@ -502,9 +506,5 @@ /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// - // Mark activity viewed for completion-tracking - $completion=new completion_info($course); - $completion->set_module_viewed($cm); - echo $OUTPUT->footer(); diff --git a/mod/forum/view.php b/mod/forum/view.php index 90c5d4deb84..70ac8ba23f0 100644 --- a/mod/forum/view.php +++ b/mod/forum/view.php @@ -97,6 +97,10 @@ rss_add_http_header($context, 'mod_forum', $forum, $rsstitle); } + // Mark viewed if required + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + /// Print header. /// Add ajax-related libs for ratings if required MDL-20119 $PAGE->requires->yui2_lib('event'); @@ -239,8 +243,7 @@ break; } - $completion=new completion_info($course); - $completion->set_module_viewed($cm); + echo $OUTPUT->footer($course); diff --git a/mod/glossary/view.php b/mod/glossary/view.php index 236a52557dc..de7f2c8ca0e 100644 --- a/mod/glossary/view.php +++ b/mod/glossary/view.php @@ -125,6 +125,10 @@ if (!$cm->visible and !has_capability('moodle/course:viewhiddenactivities', $con } add_to_log($course->id, "glossary", "view", "view.php?id=$cm->id&tab=$tab", $glossary->id, $cm->id); +// Mark as viewed +$completion = new completion_info($course); +$completion->set_module_viewed($cm); + /// stablishing flag variables if ( $sortorder = strtolower($sortorder) ) { if ($sortorder != 'asc' and $sortorder != 'desc') { @@ -495,8 +499,3 @@ glossary_print_tabbed_table_end(); /// Finish the page echo $OUTPUT->footer(); - -/// Mark as viewed -$completion=new completion_info($course); -$completion->set_module_viewed($cm); - diff --git a/mod/lesson/view.php b/mod/lesson/view.php index b0d93c8f664..c82d5895dcd 100644 --- a/mod/lesson/view.php +++ b/mod/lesson/view.php @@ -45,6 +45,10 @@ if ($backtocourse) { redirect(new moodle_url('/course/view.php', array('id'=>$course->id))); } +// Mark as viewed +$completion = new completion_info($course); +$completion->set_module_viewed($cm); + $url = new moodle_url('/mod/lesson/view.php', array('id'=>$id)); if ($pageid !== null) { $url->param('pageid', $pageid); @@ -564,7 +568,3 @@ if ($pageid != LESSON_EOL) { echo $lessoncontent; echo $lessonoutput->footer(); } - -/// Mark as viewed -$completion=new completion_info($course); -$completion->set_module_viewed($cm); diff --git a/mod/quiz/view.php b/mod/quiz/view.php index 7b816bc672a..ce970257688 100644 --- a/mod/quiz/view.php +++ b/mod/quiz/view.php @@ -55,6 +55,10 @@ /// Log this request. add_to_log($course->id, "quiz", "view", "view.php?id=$cm->id", $quiz->id, $cm->id); + // Mark module as viewed + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + /// Initialize $PAGE, compute blocks $PAGE->set_url('/mod/quiz/view.php', array('id' => $cm->id)); @@ -382,10 +386,4 @@ } echo $OUTPUT->box_end(); - // Mark module as viewed (note, we do this here and not in finish_page, - // otherwise the 'not enrolled' error conditions would result in marking - // 'viewed', I think it's better if they don't.) - $completion=new completion_info($course); - $completion->set_module_viewed($cm); - echo $OUTPUT->footer(); diff --git a/mod/scorm/player.php b/mod/scorm/player.php index c45b992dcde..74d2269cd90 100644 --- a/mod/scorm/player.php +++ b/mod/scorm/player.php @@ -146,6 +146,10 @@ $SESSION->scorm_mode = $mode; $SESSION->scorm_attempt = $attempt; + // Mark module viewed + $completion = new completion_info($course); + $completion->set_module_viewed($cm); + // // Print the page header // @@ -249,10 +253,6 @@ if (!isset($result->toctitle)) { $PAGE->requires->js_init_call('M.mod_scorm.init', array($scorm->hidenav, $scorm->hidetoc, $result->toctitle, $name, $sco->id)); - -$completion=new completion_info($course); -$completion->set_module_viewed($cm); - if (!empty($forcejs)) { echo $OUTPUT->box(get_string("forcejavascriptmessage", "scorm"), "generalbox boxaligncenter forcejavascriptmessage"); } diff --git a/mod/workshop/view.php b/mod/workshop/view.php index 2cd32a0062f..7edceb54afc 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -51,6 +51,10 @@ require_capability('mod/workshop:view', $PAGE->context); $workshop = new workshop($workshop, $cm, $course); $workshop->log('view'); +// Mark viewed +$completion = new completion_info($course); +$completion->set_module_viewed($cm); + if (!is_null($editmode) && $PAGE->user_allowed_editing()) { $USER->editing = $editmode; } @@ -538,7 +542,4 @@ case workshop::PHASE_CLOSED: default: } -$completion = new completion_info($course); -$completion->set_module_viewed($cm); - echo $output->footer();