/**
  * Get course completion criteria
  *
  * @param int $criteriatype Specific criteria type to return (optional)
  */
 public function get_criteria($criteriatype = null)
 {
     // Fill cache if empty
     if (!is_array($this->criteria)) {
         global $DB;
         $params = array('course' => $this->course->id);
         // Load criteria from database
         $records = (array) $DB->get_records('course_completion_criteria', $params);
         // Build array of criteria objects
         $this->criteria = array();
         foreach ($records as $record) {
             $this->criteria[$record->id] = completion_criteria::factory((array) $record);
         }
     }
     // If after all criteria
     if ($criteriatype === null) {
         return $this->criteria;
     }
     // If we are only after a specific criteria type
     $criteria = array();
     foreach ($this->criteria as $criterion) {
         if ($criterion->criteriatype != $criteriatype) {
             continue;
         }
         $criteria[$criterion->id] = $criterion;
     }
     return $criteria;
 }
 // Check user is logged in
 $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 $context = context_course::instance($course->id);
 require_login($course);
 $completion = new completion_info($course);
 $trackeduser = $user ? $user : $USER->id;
 if (!$completion->is_enabled()) {
     throw new moodle_exception('completionnotenabled', 'completion');
 } else {
     if (!$completion->is_tracked_user($trackeduser)) {
         throw new moodle_exception('nottracked', 'completion');
     }
 }
 if ($user && $rolec) {
     require_sesskey();
     completion_criteria::factory(array('id' => $rolec, 'criteriatype' => COMPLETION_CRITERIA_TYPE_ROLE));
     //TODO: this is dumb, because it does not fetch the data?!?!
     $criteria = completion_criteria_role::fetch(array('id' => $rolec));
     if ($criteria and user_has_role_assignment($USER->id, $criteria->role, $context->id)) {
         $criteria_completions = $completion->get_completions($user, COMPLETION_CRITERIA_TYPE_ROLE);
         foreach ($criteria_completions as $criteria_completion) {
             if ($criteria_completion->criteriaid == $rolec) {
                 $criteria->complete($criteria_completion);
                 break;
             }
         }
     }
     // Return to previous page
     $referer = clean_param($_SERVER['HTTP_REFERER'], PARAM_LOCALURL);
     if (!empty($referer)) {
         redirect($referer);
 /**
  * Return the associated criteria with this completion
  * If nothing attached, load from the db
  *
  * @return completion_criteria
  */
 public function get_criteria()
 {
     if (!$this->_criteria) {
         global $DB;
         $params = array('id' => $this->criteriaid);
         $record = $DB->get_record('course_completion_criteria', $params);
         $this->attach_criteria(completion_criteria::factory($record));
     }
     return $this->_criteria;
 }
    $completion = new completion_info($course);
    if (!$completion->is_enabled()) {
        throw new moodle_exception('completionnotenabled', 'completion');
    } elseif (!$completion->is_tracked_user($USER->id)) {
        throw new moodle_exception('nottracked', 'completion');
    }

    // Check if we are marking a user complete via the completion report
    $user = optional_param('user', 0, PARAM_INT);
    $rolec = optional_param('rolec', 0, PARAM_INT);

    if ($user && $rolec) {
        require_sesskey();

        completion_criteria::factory(array('id'=>$rolec, 'criteriatype'=>COMPLETION_CRITERIA_TYPE_ROLE)); //TODO: this is dumb, because it does not fetch the data?!?!
        $criteria = completion_criteria_role::fetch(array('id'=>$rolec));

        if ($criteria and user_has_role_assignment($USER->id, $criteria->role, $context->id)) {
            $criteria_completions = $completion->get_completions($user, COMPLETION_CRITERIA_TYPE_ROLE);

            foreach ($criteria_completions as $criteria_completion) {
                if ($criteria_completion->criteriaid == $rolec) {
                    $criteria->complete($criteria_completion);
                    break;
                }
            }
        }

        // Return to previous page
        if (!empty($_SERVER['HTTP_REFERER'])) {