From c5e3a242b11a5b73e70fd90d9109766743f8a3a7 Mon Sep 17 00:00:00 2001 From: sam marshall Date: Wed, 6 Apr 2011 18:05:43 +0100 Subject: [PATCH] MDL-26778 Change to completion should immediately affect nav block Includes change so that updating completion resets the cache, and a debugging warning if any module calls the completion viewed thing after it's already printed navigation (which will mean navigation obviously doesn't update right away). All existing modules that currently update after printing navigation were updated. --- lib/completionlib.php | 10 ++++++++++ mod/chat/view.php | 7 ++++--- mod/choice/view.php | 9 ++++----- mod/data/view.php | 9 ++++----- mod/feedback/complete.php | 8 ++++---- mod/forum/view.php | 7 +++++-- mod/glossary/view.php | 9 ++++----- mod/lesson/view.php | 8 ++++---- mod/quiz/view.php | 10 ++++------ mod/scorm/player.php | 8 ++++---- mod/workshop/view.php | 7 ++++--- 11 files changed, 51 insertions(+), 41 deletions(-) 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();