diff --git a/course/lib.php b/course/lib.php index 984b5e5f4e8..167b380e4bb 100644 --- a/course/lib.php +++ b/course/lib.php @@ -1328,7 +1328,7 @@ function get_print_section_cm_text(cm_info $cm, $course) { * @param stdClass|section_info $section The section object containing properties id and section * @param array $mods (argument not used) * @param array $modnamesused (argument not used) - * @param bool $absolute All links are absolute + * @param bool $absolute (argument not used) * @param string $width (argument not used) * @param bool $hidecompletion Hide completion status * @param int $sectionreturn The section to return to @@ -1542,88 +1542,8 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false, echo $mod->get_after_edit_icons(); } - // Completion - $completion = $hidecompletion - ? COMPLETION_TRACKING_NONE - : $completioninfo->is_enabled($mod); - if ($completion!=COMPLETION_TRACKING_NONE && isloggedin() && - !isguestuser() && $mod->uservisible) { - $completiondata = $completioninfo->get_data($mod,true); - $completionicon = ''; - if ($isediting) { - switch ($completion) { - case COMPLETION_TRACKING_MANUAL : - $completionicon = 'manual-enabled'; break; - case COMPLETION_TRACKING_AUTOMATIC : - $completionicon = 'auto-enabled'; break; - default: // wtf - } - } else if ($completion==COMPLETION_TRACKING_MANUAL) { - switch($completiondata->completionstate) { - case COMPLETION_INCOMPLETE: - $completionicon = 'manual-n'; break; - case COMPLETION_COMPLETE: - $completionicon = 'manual-y'; break; - } - } else { // Automatic - switch($completiondata->completionstate) { - case COMPLETION_INCOMPLETE: - $completionicon = 'auto-n'; break; - case COMPLETION_COMPLETE: - $completionicon = 'auto-y'; break; - case COMPLETION_COMPLETE_PASS: - $completionicon = 'auto-pass'; break; - case COMPLETION_COMPLETE_FAIL: - $completionicon = 'auto-fail'; break; - } - } - if ($completionicon) { - $imgsrc = $OUTPUT->pix_url('i/completion-'.$completionicon); - $formattedname = format_string($mod->name, true, array('context' => $modcontext)); - $imgalt = get_string('completion-alt-' . $completionicon, 'completion', $formattedname); - if ($completion == COMPLETION_TRACKING_MANUAL && !$isediting) { - $imgtitle = get_string('completion-title-' . $completionicon, 'completion', $formattedname); - $newstate = - $completiondata->completionstate==COMPLETION_COMPLETE - ? COMPLETION_INCOMPLETE - : COMPLETION_COMPLETE; - // In manual mode the icon is a toggle form... - - // If this completion state is used by the - // conditional activities system, we need to turn - // off the JS. - if (!empty($CFG->enableavailability) && - condition_info::completion_value_used_as_condition($course, $mod)) { - $extraclass = ' preventjs'; - } else { - $extraclass = ''; - } - echo html_writer::start_tag('form', array( - 'class' => 'togglecompletion' . $extraclass, - 'method' => 'post', - 'action' => $CFG->wwwroot . '/course/togglecompletion.php')); - echo html_writer::start_tag('div'); - echo html_writer::empty_tag('input', array( - 'type' => 'hidden', 'name' => 'id', 'value' => $mod->id)); - echo html_writer::empty_tag('input', array( - 'type' => 'hidden', 'name' => 'modulename', - 'value' => $mod->name)); - echo html_writer::empty_tag('input', array( - 'type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); - echo html_writer::empty_tag('input', array( - 'type' => 'hidden', 'name' => 'completionstate', - 'value' => $newstate)); - echo html_writer::empty_tag('input', array( - 'type' => 'image', 'src' => $imgsrc, 'alt' => $imgalt, 'title' => $imgtitle)); - echo html_writer::end_tag('div'); - echo html_writer::end_tag('form'); - } else { - // In auto mode, or when editing, the icon is just an image - echo ""; - echo "$imgalt"; - } - } - } + echo $courserenderer->course_section_cm_completion($course, $completioninfo, $mod, + array('hidecompletion' => $hidecompletion)); // If there is content AND a link, then display the content here // (AFTER any icons). Otherwise it was displayed before diff --git a/course/renderer.php b/course/renderer.php index 2fb7c01ccdf..cdca66e235c 100644 --- a/course/renderer.php +++ b/course/renderer.php @@ -506,4 +506,110 @@ class core_course_renderer extends plugin_renderer_base { return $output; } + + /** + * Renders html for completion box on course page + * + * If completion is disabled, returns empty string + * If completion is automatic, returns an icon of the current completion state + * If completion is manual, returns a form (with an icon inside) that allows user to + * toggle completion + * + * @param stdClass $course course object + * @param completion_info $completioninfo completion info for the course, it is recommended + * to fetch once for all modules in course/section for performance + * @param cm_info $mod module to show completion for + * @param array $displayoptions display options, not used in core + * @return string + */ + public function course_section_cm_completion($course, &$completioninfo, cm_info $mod, $displayoptions = array()) { + global $CFG; + $output = ''; + if (!empty($displayoptions['hidecompletion']) || !isloggedin() || isguestuser() || !$mod->uservisible) { + return $output; + } + if ($completioninfo === null) { + $completioninfo = new completion_info($course); + } + $completion = $completioninfo->is_enabled($mod); + if ($completion == COMPLETION_TRACKING_NONE) { + return $output; + } + + $completiondata = $completioninfo->get_data($mod, true); + $completionicon = ''; + + if ($this->page->user_is_editing()) { + switch ($completion) { + case COMPLETION_TRACKING_MANUAL : + $completionicon = 'manual-enabled'; break; + case COMPLETION_TRACKING_AUTOMATIC : + $completionicon = 'auto-enabled'; break; + } + } else if ($completion == COMPLETION_TRACKING_MANUAL) { + switch($completiondata->completionstate) { + case COMPLETION_INCOMPLETE: + $completionicon = 'manual-n'; break; + case COMPLETION_COMPLETE: + $completionicon = 'manual-y'; break; + } + } else { // Automatic + switch($completiondata->completionstate) { + case COMPLETION_INCOMPLETE: + $completionicon = 'auto-n'; break; + case COMPLETION_COMPLETE: + $completionicon = 'auto-y'; break; + case COMPLETION_COMPLETE_PASS: + $completionicon = 'auto-pass'; break; + case COMPLETION_COMPLETE_FAIL: + $completionicon = 'auto-fail'; break; + } + } + if ($completionicon) { + $formattedname = $mod->get_formatted_name(); + $imgalt = get_string('completion-alt-' . $completionicon, 'completion', $formattedname); + if ($completion == COMPLETION_TRACKING_MANUAL && !$this->page->user_is_editing()) { + $imgtitle = get_string('completion-title-' . $completionicon, 'completion', $formattedname); + $newstate = + $completiondata->completionstate == COMPLETION_COMPLETE + ? COMPLETION_INCOMPLETE + : COMPLETION_COMPLETE; + // In manual mode the icon is a toggle form... + + // If this completion state is used by the + // conditional activities system, we need to turn + // off the JS. + $extraclass = ''; + if (!empty($CFG->enableavailability) && + condition_info::completion_value_used_as_condition($course, $mod)) { + $extraclass = ' preventjs'; + } + $output .= html_writer::start_tag('form', array('method' => 'post', + 'action' => new moodle_url('/course/togglecompletion.php'), + 'class' => 'togglecompletion'. $extraclass)); + $output .= html_writer::start_tag('div'); + $output .= html_writer::empty_tag('input', array( + 'type' => 'hidden', 'name' => 'id', 'value' => $mod->id)); + $output .= html_writer::empty_tag('input', array( + 'type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); + $output .= html_writer::empty_tag('input', array( + 'type' => 'hidden', 'name' => 'modulename', 'value' => $mod->name)); + $output .= html_writer::empty_tag('input', array( + 'type' => 'hidden', 'name' => 'completionstate', 'value' => $newstate)); + $output .= html_writer::empty_tag('input', array( + 'type' => 'image', + 'src' => $this->output->pix_url('i/completion-'.$completionicon), + 'alt' => $imgalt, 'title' => $imgtitle)); + $output .= html_writer::end_tag('div'); + $output .= html_writer::end_tag('form'); + } else { + // In auto mode, or when editing, the icon is just an image + $completionpixicon = new pix_icon('i/completion-'.$completionicon, $imgalt, '', + array('title' => $imgalt)); + $output .= html_writer::tag('span', $this->output->render($completionpixicon), + array('class' => 'autocompletion')); + } + } + return $output; + } } diff --git a/course/togglecompletion.php b/course/togglecompletion.php index 3773890099a..2977f7179f1 100644 --- a/course/togglecompletion.php +++ b/course/togglecompletion.php @@ -123,7 +123,7 @@ switch($targetstate) { } // Get course-modules entry -$cm = get_coursemodule_from_id(null, $cmid, null, false, MUST_EXIST); +$cm = get_coursemodule_from_id(null, $cmid, null, true, MUST_EXIST); $course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST); // Check user is logged in @@ -152,8 +152,12 @@ if ($fromajax) { } else { // In case of use in other areas of code we allow a 'backto' parameter, // otherwise go back to course page - $backto = optional_param('backto', 'view.php?id='.$course->id, PARAM_URL); - redirect($backto); + + if ($backto = optional_param('backto', null, PARAM_URL)) { + redirect($backto); + } else { + redirect(course_get_url($course, $cm->sectionnum)); + } } // utility functions