Search moodle.org's
Developer Documentation

   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 - the form definition.
  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  defined('MOODLE_INTERNAL') || die();
  29  
  30  require_once($CFG->libdir.'/formslib.php');
  31  require_once($CFG->libdir.'/completionlib.php');
  32  
  33  /**
  34   * Defines the course completion settings form.
  35   */
  36  class course_completion_form extends moodleform {
  37  
  38      /**
  39       * Defines the form fields.
  40       */
  41      public function definition() {
  42          global $USER, $CFG, $DB;
  43  
  44          $courseconfig = get_config('moodlecourse');
  45          $mform = $this->_form;
  46          $course = $this->_customdata['course'];
  47          $completion = new completion_info($course);
  48  
  49          $params = array(
  50              'course'  => $course->id
  51          );
  52  
  53          // Check if there are existing criteria completions.
  54          if ($completion->is_course_locked()) {
  55              $mform->addElement('header', 'completionsettingslocked', get_string('completionsettingslocked', 'completion'));
  56              $mform->addElement('static', '', '', get_string('err_settingslocked', 'completion'));
  57              $mform->addElement('submit', 'settingsunlock', get_string('unlockcompletiondelete', 'completion'));
  58          }
  59  
  60          // Get array of all available aggregation methods.
  61          $aggregation_methods = $completion->get_aggregation_methods();
  62  
  63          // Overall criteria aggregation.
  64          $mform->addElement('header', 'overallcriteria', get_string('general', 'core_form'));
  65          // Map aggregation methods to context-sensitive human readable dropdown menu.
  66          $overallaggregationmenu = array();
  67          foreach ($aggregation_methods as $methodcode => $methodname) {
  68              if ($methodcode === COMPLETION_AGGREGATION_ALL) {
  69                  $overallaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('overallaggregation_all', 'core_completion');
  70              } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
  71                  $overallaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('overallaggregation_any', 'core_completion');
  72              } else {
  73                  $overallaggregationmenu[$methodcode] = $methodname;
  74              }
  75          }
  76          $mform->addElement('select', 'overall_aggregation', get_string('overallaggregation', 'core_completion'), $overallaggregationmenu);
  77          $mform->setDefault('overall_aggregation', $completion->get_aggregation_method());
  78  
  79          // Activity completion criteria
  80          $label = get_string('coursecompletioncondition', 'core_completion', get_string('activitiescompleted', 'core_completion'));
  81          $mform->addElement('header', 'activitiescompleted', $label);
  82          // Get the list of currently specified conditions and expand the section if some are found.
  83          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_ACTIVITY);
  84          if (!empty($current)) {
  85              $mform->setExpanded('activitiescompleted');
  86          }
  87  
  88          $activities = $completion->get_activities();
  89          if (!empty($activities)) {
  90  
  91              foreach ($activities as $activity) {
  92                  $params_a = array('moduleinstance' => $activity->id);
  93                  $criteria = new completion_criteria_activity(array_merge($params, $params_a));
  94                  $criteria->config_form_display($mform, $activity);
  95              }
  96              $mform->addElement('static', 'criteria_role_note', '', get_string('activitiescompletednote', 'core_completion'));
  97  
  98              if (count($activities) > 1) {
  99                  // Map aggregation methods to context-sensitive human readable dropdown menu.
 100                  $activityaggregationmenu = array();
 101                  foreach ($aggregation_methods as $methodcode => $methodname) {
 102                      if ($methodcode === COMPLETION_AGGREGATION_ALL) {
 103                          $activityaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('activityaggregation_all', 'core_completion');
 104                      } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
 105                          $activityaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('activityaggregation_any', 'core_completion');
 106                      } else {
 107                          $activityaggregationmenu[$methodcode] = $methodname;
 108                      }
 109                  }
 110                  $mform->addElement('select', 'activity_aggregation', get_string('activityaggregation', 'core_completion'), $activityaggregationmenu);
 111                  $mform->setDefault('activity_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ACTIVITY));
 112              }
 113  
 114          } else {
 115              $mform->addElement('static', 'noactivities', '', get_string('err_noactivities', 'completion'));
 116          }
 117  
 118          // Course prerequisite completion criteria.
 119          $label = get_string('coursecompletioncondition', 'core_completion', get_string('dependenciescompleted', 'core_completion'));
 120          $mform->addElement('header', 'courseprerequisites', $label);
 121          // Get the list of currently specified conditions and expand the section if some are found.
 122          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_COURSE);
 123          if (!empty($current)) {
 124              $mform->setExpanded('courseprerequisites');
 125          }
 126  
 127          // Get applicable courses (prerequisites).
 128          $courses = $DB->get_records_sql("
 129                  SELECT DISTINCT c.id, c.category, c.fullname, cc.id AS selected
 130                    FROM {course} c
 131               LEFT JOIN {course_completion_criteria} cc ON cc.courseinstance = c.id AND cc.course = {$course->id}
 132              INNER JOIN {course_completion_criteria} ccc ON ccc.course = c.id
 133                   WHERE c.enablecompletion = ".COMPLETION_ENABLED."
 134                         AND c.id <> {$course->id}");
 135  
 136          if (!empty($courses)) {
 137              // Get category list.
 138              require_once($CFG->libdir. '/coursecatlib.php');
 139              $list = coursecat::make_categories_list();
 140  
 141              // Get course list for select box.
 142              $selectbox = array();
 143              $selected = array();
 144              foreach ($courses as $c) {
 145                  $selectbox[$c->id] = $list[$c->category] . ' / ' . format_string($c->fullname, true,
 146                      array('context' => context_course::instance($c->id)));
 147  
 148                  // If already selected ...
 149                  if ($c->selected) {
 150                      $selected[] = $c->id;
 151                  }
 152              }
 153  
 154              // Show multiselect box.
 155              $mform->addElement('select', 'criteria_course', get_string('coursesavailable', 'completion'), $selectbox,
 156                  array('multiple' => 'multiple', 'size' => 6));
 157  
 158              // Select current criteria.
 159              $mform->setDefault('criteria_course', $selected);
 160  
 161              // Explain list.
 162              $mform->addElement('static', 'criteria_courses_explaination', '', get_string('coursesavailableexplaination', 'completion'));
 163  
 164              if (count($courses) > 1) {
 165                  // Map aggregation methods to context-sensitive human readable dropdown menu.
 166                  $courseaggregationmenu = array();
 167                  foreach ($aggregation_methods as $methodcode => $methodname) {
 168                      if ($methodcode === COMPLETION_AGGREGATION_ALL) {
 169                          $courseaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('courseaggregation_all', 'core_completion');
 170                      } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
 171                          $courseaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('courseaggregation_any', 'core_completion');
 172                      } else {
 173                          $courseaggregationmenu[$methodcode] = $methodname;
 174                      }
 175                  }
 176                  $mform->addElement('select', 'course_aggregation', get_string('courseaggregation', 'core_completion'), $courseaggregationmenu);
 177                  $mform->setDefault('course_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_COURSE));
 178              }
 179  
 180          } else {
 181              $mform->addElement('static', 'nocourses', '', get_string('err_nocourses', 'completion'));
 182          }
 183  
 184          // Completion on date
 185          $label = get_string('coursecompletioncondition', 'core_completion', get_string('completionondate', 'core_completion'));
 186          $mform->addElement('header', 'date', $label);
 187          // Expand the condition section if it is currently enabled.
 188          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_DATE);
 189          if (!empty($current)) {
 190              $mform->setExpanded('date');
 191          }
 192          $criteria = new completion_criteria_date($params);
 193          $criteria->config_form_display($mform);
 194  
 195          // Completion after enrolment duration
 196          $label = get_string('coursecompletioncondition', 'core_completion', get_string('enrolmentduration', 'core_completion'));
 197          $mform->addElement('header', 'duration', $label);
 198          // Expand the condition section if it is currently enabled.
 199          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_DURATION);
 200          if (!empty($current)) {
 201              $mform->setExpanded('duration');
 202          }
 203          $criteria = new completion_criteria_duration($params);
 204          $criteria->config_form_display($mform);
 205  
 206          // Completion on unenrolment
 207          $label = get_string('coursecompletioncondition', 'core_completion', get_string('unenrolment', 'core_completion'));
 208          $mform->addElement('header', 'unenrolment', $label);
 209          // Expand the condition section if it is currently enabled.
 210          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_UNENROL);
 211          if (!empty($current)) {
 212              $mform->setExpanded('unenrolment');
 213          }
 214          $criteria = new completion_criteria_unenrol($params);
 215          $criteria->config_form_display($mform);
 216  
 217          // Completion on course grade
 218          $label = get_string('coursecompletioncondition', 'core_completion', get_string('coursegrade', 'core_completion'));
 219          $mform->addElement('header', 'grade', $label);
 220          // Expand the condition section if it is currently enabled.
 221          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_GRADE);
 222          if (!empty($current)) {
 223              $mform->setExpanded('grade');
 224          }
 225          $course_grade = $DB->get_field('grade_items', 'gradepass', array('courseid' => $course->id, 'itemtype' => 'course'));
 226          if (!$course_grade) {
 227              $course_grade = '0.00000';
 228          }
 229          $criteria = new completion_criteria_grade($params);
 230          $criteria->config_form_display($mform, $course_grade);
 231  
 232          // Manual self completion
 233          $label = get_string('coursecompletioncondition', 'core_completion', get_string('manualselfcompletion', 'core_completion'));
 234          $mform->addElement('header', 'manualselfcompletion', $label);
 235          // Expand the condition section if it is currently enabled.
 236          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_SELF);
 237          if (!empty($current)) {
 238              $mform->setExpanded('manualselfcompletion');
 239          }
 240          $criteria = new completion_criteria_self($params);
 241          $criteria->config_form_display($mform);
 242          $mform->addElement('static', 'criteria_self_note', '', get_string('manualselfcompletionnote', 'core_completion'));
 243  
 244          // Role completion criteria
 245          $label = get_string('coursecompletioncondition', 'core_completion', get_string('manualcompletionby', 'core_completion'));
 246          $mform->addElement('header', 'roles', $label);
 247          // Expand the condition section if it is currently enabled.
 248          $current = $completion->get_criteria(COMPLETION_CRITERIA_TYPE_ROLE);
 249          if (!empty($current)) {
 250              $mform->setExpanded('roles');
 251          }
 252          $roles = get_roles_with_capability('moodle/course:markcomplete', CAP_ALLOW, context_course::instance($course->id, IGNORE_MISSING));
 253  
 254          if (!empty($roles)) {
 255              foreach ($roles as $role) {
 256                  $params_a = array('role' => $role->id);
 257                  $criteria = new completion_criteria_role(array_merge($params, $params_a));
 258                  $criteria->config_form_display($mform, $role);
 259              }
 260              $mform->addElement('static', 'criteria_role_note', '', get_string('manualcompletionbynote', 'core_completion'));
 261              // Map aggregation methods to context-sensitive human readable dropdown menu.
 262              $roleaggregationmenu = array();
 263              foreach ($aggregation_methods as $methodcode => $methodname) {
 264                  if ($methodcode === COMPLETION_AGGREGATION_ALL) {
 265                      $roleaggregationmenu[COMPLETION_AGGREGATION_ALL] = get_string('roleaggregation_all', 'core_completion');
 266                  } else if ($methodcode === COMPLETION_AGGREGATION_ANY) {
 267                      $roleaggregationmenu[COMPLETION_AGGREGATION_ANY] = get_string('roleaggregation_any', 'core_completion');
 268                  } else {
 269                      $roleaggregationmenu[$methodcode] = $methodname;
 270                  }
 271              }
 272              $mform->addElement('select', 'role_aggregation', get_string('roleaggregation', 'core_completion'), $roleaggregationmenu);
 273              $mform->setDefault('role_aggregation', $completion->get_aggregation_method(COMPLETION_CRITERIA_TYPE_ROLE));
 274  
 275          } else {
 276              $mform->addElement('static', 'noroles', '', get_string('err_noroles', 'completion'));
 277          }
 278  
 279          // Add common action buttons.
 280          $this->add_action_buttons();
 281  
 282          // Add hidden fields.
 283          $mform->addElement('hidden', 'id', $course->id);
 284          $mform->setType('id', PARAM_INT);
 285  
 286          // If the criteria are locked, freeze values and submit button.
 287          if ($completion->is_course_locked()) {
 288              $except = array('settingsunlock');
 289              $mform->hardFreezeAllVisibleExcept($except);
 290              $mform->addElement('cancel');
 291          }
 292      }
 293  }

Search This Site: