Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Class for loading/storing competencies from the DB.
  19   *
  20   * @package    core_competency
  21   * @copyright  2015 Damyon Wiese
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  namespace core_competency;
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  use stdClass;
  28  use lang_string;
  29  
  30  /**
  31   * Class for loading/storing course_module_competencies from the DB.
  32   *
  33   * @copyright  2015 Damyon Wiese
  34   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  35   */
  36  class course_module_competency extends persistent {
  37  
  38      const TABLE = 'competency_modulecomp';
  39  
  40      /** Course competency ruleoutcome constant. */
  41      const OUTCOME_NONE = 0;
  42      /** Course competency ruleoutcome constant. */
  43      const OUTCOME_EVIDENCE = 1;
  44      /** Course competency ruleoutcome constant. */
  45      const OUTCOME_RECOMMEND = 2;
  46      /** Course competency ruleoutcome constant. */
  47      const OUTCOME_COMPLETE = 3;
  48  
  49      /**
  50       * Return the definition of the properties of this model.
  51       *
  52       * @return array
  53       */
  54      protected static function define_properties() {
  55          return array(
  56              'cmid' => array(
  57                  'type' => PARAM_INT
  58              ),
  59              'competencyid' => array(
  60                  'type' => PARAM_INT
  61              ),
  62              'sortorder' => array(
  63                  'type' => PARAM_INT
  64              ),
  65              'ruleoutcome' => array(
  66                  'choices' => array(self::OUTCOME_NONE,
  67                      self::OUTCOME_EVIDENCE,
  68                      self::OUTCOME_RECOMMEND,
  69                      self::OUTCOME_COMPLETE
  70                  ),
  71                  'default' => self::OUTCOME_EVIDENCE,
  72                  'type' => PARAM_INT,
  73              ),
  74              'overridegrade' => array(
  75                  'default' => false,
  76                  'type' => PARAM_BOOL
  77              ),
  78          );
  79      }
  80  
  81      /**
  82       * Hook to execute before validate.
  83       *
  84       * @return void
  85       */
  86      protected function before_validate() {
  87          if (($this->get('id') && $this->get('sortorder') === null) || !$this->get('id')) {
  88              $this->set('sortorder', $this->count_records(array('cmid' => $this->get('cmid'))));
  89          }
  90      }
  91  
  92      /**
  93       * Return a list of rules.
  94       *
  95       * @return array Indexed by outcome value.
  96       */
  97      public static function get_ruleoutcome_list() {
  98          static $list = null;
  99  
 100          if ($list === null) {
 101              $list = array(
 102                  self::OUTCOME_NONE => self::get_ruleoutcome_name(self::OUTCOME_NONE),
 103                  self::OUTCOME_EVIDENCE => self::get_ruleoutcome_name(self::OUTCOME_EVIDENCE),
 104                  self::OUTCOME_RECOMMEND => self::get_ruleoutcome_name(self::OUTCOME_RECOMMEND),
 105                  self::OUTCOME_COMPLETE => self::get_ruleoutcome_name(self::OUTCOME_COMPLETE));
 106          }
 107  
 108          return $list;
 109      }
 110  
 111      /**
 112       * Human readable rule name.
 113       *
 114       * @param int $ruleoutcome The value of ruleoutcome.
 115       * @return lang_string
 116       */
 117      public static function get_ruleoutcome_name($ruleoutcome) {
 118  
 119          switch ($ruleoutcome) {
 120              case self::OUTCOME_NONE:
 121                  $strname = 'none';
 122                  break;
 123              case self::OUTCOME_EVIDENCE:
 124                  $strname = 'evidence';
 125                  break;
 126              case self::OUTCOME_RECOMMEND:
 127                  $strname = 'recommend';
 128                  break;
 129              case self::OUTCOME_COMPLETE:
 130                  $strname = 'complete';
 131                  break;
 132              default:
 133                  throw new \moodle_exception('errorcompetencyrule', 'core_competency', '', $ruleoutcome);
 134                  break;
 135          }
 136  
 137          return new lang_string('coursemodulecompetencyoutcome_' . $strname, 'core_competency');
 138      }
 139  
 140      /**
 141       * Validate cmid ID.
 142       *
 143       * @param int $data The CM ID.
 144       * @return true|lang_string
 145       */
 146      protected function validate_cmid($data) {
 147          global $DB;
 148          if (!$DB->record_exists('course_modules', array('id' => $data))) {
 149              return new lang_string('invalidmodule', 'error');
 150          }
 151          return true;
 152      }
 153  
 154      /**
 155       * Validate competency ID.
 156       *
 157       * @param int $data The competency ID.
 158       * @return true|lang_string
 159       */
 160      protected function validate_competencyid($data) {
 161          if (!competency::record_exists($data)) {
 162              return new lang_string('invaliddata', 'error');
 163          }
 164          return true;
 165      }
 166  
 167      /**
 168       * Return the module IDs and visible flags that include this competency in a single course.
 169       *
 170       * @param int $competencyid The competency id
 171       * @param int $courseid The course ID.
 172       * @return array of ints (cmids)
 173       */
 174      public static function list_course_modules($competencyid, $courseid) {
 175          global $DB;
 176  
 177          $results = $DB->get_records_sql('SELECT coursemodules.id as id
 178                                             FROM {' . self::TABLE . '} modcomp
 179                                             JOIN {course_modules} coursemodules
 180                                               ON modcomp.cmid = coursemodules.id
 181                                            WHERE modcomp.competencyid = ? AND coursemodules.course = ?',
 182                                            array($competencyid, $courseid));
 183  
 184          return array_keys($results);
 185      }
 186  
 187      /**
 188       * Count the competencies in this course module.
 189       *
 190       * @param int $cmid The course module id.
 191       * @return int
 192       */
 193      public static function count_competencies($cmid) {
 194          global $DB;
 195  
 196          $sql = 'SELECT COUNT(comp.id)
 197                    FROM {' . self::TABLE . '} coursemodulecomp
 198                    JOIN {' . competency::TABLE . '} comp
 199                      ON coursemodulecomp.competencyid = comp.id
 200                   WHERE coursemodulecomp.cmid = ? ';
 201          $params = array($cmid);
 202  
 203          $results = $DB->count_records_sql($sql, $params);
 204  
 205          return $results;
 206      }
 207  
 208      /**
 209       * List the competencies in this course module.
 210       *
 211       * @param int $cmid The course module id
 212       * @return competency[] Indexed by competency ID.
 213       */
 214      public static function list_competencies($cmid) {
 215          global $DB;
 216  
 217          $sql = 'SELECT comp.*
 218                    FROM {' . competency::TABLE . '} comp
 219                    JOIN {' . self::TABLE . '} coursemodulecomp
 220                      ON coursemodulecomp.competencyid = comp.id
 221                   WHERE coursemodulecomp.cmid = ?
 222                   ORDER BY coursemodulecomp.sortorder ASC';
 223          $params = array($cmid);
 224  
 225          $results = $DB->get_recordset_sql($sql, $params);
 226          $instances = array();
 227          foreach ($results as $result) {
 228              $comp = new competency(0, $result);
 229              $instances[$comp->get('id')] = $comp;
 230          }
 231          $results->close();
 232  
 233          return $instances;
 234      }
 235  
 236      /**
 237       * Get a single competency from the course module (only if it is really in the course module).
 238       *
 239       * @param int $cmid The course module id
 240       * @param int $competencyid The competency id
 241       * @return competency
 242       */
 243      public static function get_competency($cmid, $competencyid) {
 244          global $DB;
 245  
 246          $sql = 'SELECT comp.*
 247                    FROM {' . competency::TABLE . '} comp
 248                    JOIN {' . self::TABLE . '} crsmodcomp
 249                      ON crsmodcomp.competencyid = comp.id
 250                   WHERE crsmodcomp.cmid = ? AND crsmodcomp.competencyid = ?';
 251          $params = array($cmid, $competencyid);
 252  
 253          $result = $DB->get_record_sql($sql, $params);
 254          if (!$result) {
 255              throw new \coding_exception('The competency does not belong to this course module: ' . $competencyid . ', ' . $cmid);
 256          }
 257  
 258          return new competency(0, $result);
 259      }
 260  
 261      /**
 262       * Hook to execute after delete.
 263       *
 264       * @param bool $result Whether or not the delete was successful.
 265       * @return void
 266       */
 267      protected function after_delete($result) {
 268          global $DB;
 269          if (!$result) {
 270              return;
 271          }
 272  
 273          $table = '{' . self::TABLE . '}';
 274          $sql = "UPDATE $table SET sortorder = sortorder -1 WHERE cmid = ? AND sortorder > ?";
 275          $DB->execute($sql, array($this->get('cmid'), $this->get('sortorder')));
 276      }
 277  
 278      /**
 279       * List the course_module_competencies in this course module.
 280       *
 281       * @param int $cmid The course module id
 282       * @return course_module_competency[]
 283       */
 284      public static function list_course_module_competencies($cmid) {
 285          global $DB;
 286  
 287          $sql = 'SELECT coursemodcomp.*
 288                    FROM {' . self::TABLE . '} coursemodcomp
 289                    JOIN {' . competency::TABLE . '} comp
 290                      ON coursemodcomp.competencyid = comp.id
 291                   WHERE coursemodcomp.cmid = ?
 292                   ORDER BY coursemodcomp.sortorder ASC';
 293          $params = array($cmid);
 294  
 295          $results = $DB->get_recordset_sql($sql, $params);
 296          $instances = array();
 297          foreach ($results as $result) {
 298              array_push($instances, new course_module_competency(0, $result));
 299          }
 300          $results->close();
 301  
 302          return $instances;
 303      }
 304  
 305      /**
 306       * List the relationship objects for a competency in a course.
 307       *
 308       * @param int $competencyid The competency ID.
 309       * @param int $courseid The course ID.
 310       * @return course_module_competency[]
 311       */
 312      public static function get_records_by_competencyid_in_course($competencyid, $courseid) {
 313          global $DB;
 314  
 315          $sql = 'SELECT cmc.*
 316                    FROM {' . self::TABLE . '} cmc
 317                    JOIN {course_modules} cm
 318                      ON cm.course = ?
 319                     AND cmc.cmid = cm.id
 320                   WHERE cmc.competencyid = ?
 321                ORDER BY cmc.sortorder ASC';
 322          $params = array($courseid, $competencyid);
 323  
 324          $results = $DB->get_recordset_sql($sql, $params);
 325          $instances = array();
 326          foreach ($results as $result) {
 327              $instances[$result->id] = new course_module_competency(0, $result);
 328          }
 329          $results->close();
 330  
 331          return $instances;
 332      }
 333  
 334  }