Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * Edit course completion settings
  20   *
  21   * @package     core_completion
  22   * @category    completion
  23   * @copyright   2009 Catalyst IT Ltd
  24   * @author      Aaron Barnes <aaronb@catalyst.net.nz>
  25   * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  26   */
  27  
  28  require_once(__DIR__.'/../config.php');
  29  require_once($CFG->dirroot.'/course/lib.php');
  30  require_once($CFG->libdir.'/completionlib.php');
  31  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_self.php');
  32  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_date.php');
  33  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_unenrol.php');
  34  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_activity.php');
  35  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_duration.php');
  36  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_grade.php');
  37  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_role.php');
  38  require_once($CFG->dirroot.'/completion/criteria/completion_criteria_course.php');
  39  require_once $CFG->libdir.'/gradelib.php';
  40  require_once($CFG->dirroot.'/course/completion_form.php');
  41  
  42  $id = required_param('id', PARAM_INT);       // course id
  43  
  44  // Perform some basic access control checks.
  45  if ($id) {
  46  
  47      if($id == SITEID){
  48          // Don't allow editing of 'site course' using this form.
  49          print_error('cannoteditsiteform');
  50      }
  51  
  52      if (!$course = $DB->get_record('course', array('id'=>$id))) {
  53          print_error('invalidcourseid');
  54      }
  55      require_login($course);
  56      $context = context_course::instance($course->id);
  57      if (!has_capability('moodle/course:update', $context)) {
  58          // User is not allowed to modify course completion.
  59          // Check if they can see default completion or edit bulk completion and redirect there.
  60          if ($tabs = core_completion\manager::get_available_completion_tabs($course)) {
  61              redirect($tabs[0]->link);
  62          } else {
  63              require_capability('moodle/course:update', $context);
  64          }
  65      }
  66  
  67  } else {
  68      require_login();
  69      print_error('needcourseid');
  70  }
  71  
  72  // Set up the page.
  73  $PAGE->set_course($course);
  74  $PAGE->set_url('/course/completion.php', array('id' => $course->id));
  75  $PAGE->set_title($course->shortname);
  76  $PAGE->set_heading($course->fullname);
  77  $PAGE->set_pagelayout('admin');
  78  
  79  // Create the settings form instance.
  80  $form = new course_completion_form('completion.php?id='.$id, array('course' => $course));
  81  
  82  if ($form->is_cancelled()){
  83      redirect($CFG->wwwroot.'/course/view.php?id='.$course->id);
  84  
  85  } else if ($data = $form->get_data()) {
  86      $completion = new completion_info($course);
  87  
  88      // Process criteria unlocking if requested.
  89      if (!empty($data->settingsunlock)) {
  90          $completion->delete_course_completion_data();
  91  
  92          // Return to form (now unlocked).
  93          redirect($PAGE->url);
  94      }
  95  
  96      // Delete old criteria.
  97      $completion->clear_criteria();
  98  
  99      // Loop through each criteria type and run its update_config() method.
 100      global $COMPLETION_CRITERIA_TYPES;
 101      foreach ($COMPLETION_CRITERIA_TYPES as $type) {
 102          $class = 'completion_criteria_'.$type;
 103          $criterion = new $class();
 104          $criterion->update_config($data);
 105      }
 106  
 107      // Handle overall aggregation.
 108      $aggdata = array(
 109          'course'        => $data->id,
 110          'criteriatype'  => null
 111      );
 112      $aggregation = new completion_aggregation($aggdata);
 113      $aggregation->setMethod($data->overall_aggregation);
 114      $aggregation->save();
 115  
 116      // Handle activity aggregation.
 117      if (empty($data->activity_aggregation)) {
 118          $data->activity_aggregation = 0;
 119      }
 120  
 121      $aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_ACTIVITY;
 122      $aggregation = new completion_aggregation($aggdata);
 123      $aggregation->setMethod($data->activity_aggregation);
 124      $aggregation->save();
 125  
 126      // Handle course aggregation.
 127      if (empty($data->course_aggregation)) {
 128          $data->course_aggregation = 0;
 129      }
 130  
 131      $aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_COURSE;
 132      $aggregation = new completion_aggregation($aggdata);
 133      $aggregation->setMethod($data->course_aggregation);
 134      $aggregation->save();
 135  
 136      // Handle role aggregation.
 137      if (empty($data->role_aggregation)) {
 138          $data->role_aggregation = 0;
 139      }
 140  
 141      $aggdata['criteriatype'] = COMPLETION_CRITERIA_TYPE_ROLE;
 142      $aggregation = new completion_aggregation($aggdata);
 143      $aggregation->setMethod($data->role_aggregation);
 144      $aggregation->save();
 145  
 146      // Trigger an event for course module completion changed.
 147      $event = \core\event\course_completion_updated::create(
 148              array(
 149                  'courseid' => $course->id,
 150                  'context' => context_course::instance($course->id)
 151                  )
 152              );
 153      $event->trigger();
 154  
 155      // Redirect to the course main page.
 156      $url = new moodle_url('/course/view.php', array('id' => $course->id));
 157      redirect($url);
 158  }
 159  
 160  $renderer = $PAGE->get_renderer('core_course', 'bulk_activity_completion');
 161  
 162  // Print the form.
 163  echo $OUTPUT->header();
 164  echo $OUTPUT->heading(get_string('editcoursecompletionsettings', 'core_completion'));
 165  
 166  echo $renderer->navigation($course, 'completion');
 167  
 168  $form->display();
 169  
 170  echo $OUTPUT->footer();