Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.
   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  
  29  /**
  30   * Class for loading/storing template_competencies from the DB.
  31   *
  32   * @copyright  2015 Damyon Wiese
  33   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  34   */
  35  class template_competency extends persistent {
  36  
  37      const TABLE = 'competency_templatecomp';
  38  
  39      /**
  40       * Return the definition of the properties of this model.
  41       *
  42       * @return array
  43       */
  44      protected static function define_properties() {
  45          return array(
  46              'templateid' => array(
  47                  'type' => PARAM_INT,
  48                  'default' => 0,
  49              ),
  50              'competencyid' => array(
  51                  'type' => PARAM_INT,
  52                  'default' => 0,
  53              ),
  54              'sortorder' => array(
  55                  'type' => PARAM_INT,
  56                  'default' => 0,
  57              ),
  58          );
  59      }
  60  
  61      /**
  62       * Count the templates using a competency.
  63       *
  64       * @param int $competencyid The competency id
  65       * @param bool $onlyvisible If true, only count visible templates using this competency.
  66       * @return int
  67       */
  68      public static function count_templates($competencyid, $onlyvisible) {
  69          global $DB;
  70  
  71          $sql = 'SELECT COUNT(tpl.id)
  72                    FROM {' . self::TABLE . '} tplcomp
  73                    JOIN {' . template::TABLE . '} tpl
  74                      ON tplcomp.templateid = tpl.id
  75                   WHERE tplcomp.competencyid = ? ';
  76          $params = array($competencyid);
  77  
  78          if ($onlyvisible) {
  79              $sql .= ' AND tpl.visible = ?';
  80              $params[] = 1;
  81          }
  82  
  83          $results = $DB->count_records_sql($sql, $params);
  84  
  85          return $results;
  86      }
  87  
  88      /**
  89       * List the templates using a competency.
  90       *
  91       * @param int $competencyid The competency id
  92       * @param bool $onlyvisible If true, only count visible templates using this competency.
  93       * @return array[competency]
  94       */
  95      public static function list_templates($competencyid, $onlyvisible) {
  96          global $DB;
  97  
  98          $sql = 'SELECT tpl.*
  99                    FROM {' . template::TABLE . '} tpl
 100                    JOIN {' . self::TABLE . '} tplcomp
 101                      ON tplcomp.templateid = tpl.id
 102                   WHERE tplcomp.competencyid = ? ';
 103          $params = array($competencyid);
 104  
 105          if ($onlyvisible) {
 106              $sql .= ' AND tpl.visible = ?';
 107              $params[] = 1;
 108          }
 109  
 110          $sql .= ' ORDER BY tpl.id ASC';
 111  
 112          $results = $DB->get_records_sql($sql, $params);
 113  
 114          $instances = array();
 115          foreach ($results as $result) {
 116              array_push($instances, new template(0, $result));
 117          }
 118  
 119          return $instances;
 120      }
 121  
 122      /**
 123       * Count the competencies in a template.
 124       *
 125       * @param int $templateid The template id
 126       * @return int
 127       */
 128      public static function count_competencies($templateid) {
 129          global $DB;
 130  
 131          $sql = 'SELECT COUNT(comp.id)
 132                    FROM {' . self::TABLE . '} tplcomp
 133                    JOIN {' . competency::TABLE . '} comp
 134                      ON tplcomp.competencyid = comp.id
 135                   WHERE tplcomp.templateid = ? ';
 136          $params = array($templateid);
 137  
 138          $results = $DB->count_records_sql($sql, $params);
 139  
 140          return $results;
 141      }
 142  
 143      /**
 144       * Count the competencies in a template with no links to courses.
 145       *
 146       * @param int $templateid The template id
 147       * @return int
 148       */
 149      public static function count_competencies_with_no_courses($templateid) {
 150          global $DB;
 151  
 152          $sql = 'SELECT COUNT(comp.id)
 153                    FROM {' . self::TABLE . '} tplcomp
 154                    JOIN {' . competency::TABLE . '} comp
 155                      ON tplcomp.competencyid = comp.id
 156                    LEFT JOIN {' . course_competency::TABLE . '} crscomp
 157                      ON crscomp.competencyid = comp.id
 158                   WHERE tplcomp.templateid = ? AND crscomp.id IS NULL';
 159          $params = array($templateid);
 160  
 161          $results = $DB->count_records_sql($sql, $params);
 162  
 163          return $results;
 164      }
 165  
 166      /**
 167       * Get a single competency from the template (only if it is really in the template).
 168       *
 169       * @param int $templateid The template id
 170       * @param int $competencyid The competency id
 171       * @return competency
 172       */
 173      public static function get_competency($templateid, $competencyid) {
 174          global $DB;
 175  
 176          $sql = 'SELECT comp.*
 177                    FROM {' . competency::TABLE . '} comp
 178                    JOIN {' . self::TABLE . '} tplcomp
 179                      ON tplcomp.competencyid = comp.id
 180                   WHERE tplcomp.templateid = ? AND tplcomp.competencyid = ?';
 181          $params = array($templateid, $competencyid);
 182  
 183          $result = $DB->get_record_sql($sql, $params);
 184          if (!$result) {
 185              throw new \coding_exception('The competency does not belong to this template: ' . $competencyid . ', ' . $templateid);
 186          }
 187  
 188          return new competency(0, $result);
 189      }
 190  
 191      /**
 192       * List the competencies in this template.
 193       *
 194       * @param int $templateid The template id
 195       * @return array[competency]
 196       */
 197      public static function list_competencies($templateid) {
 198          global $DB;
 199  
 200          $sql = 'SELECT comp.*
 201                    FROM {' . competency::TABLE . '} comp
 202                    JOIN {' . self::TABLE . '} tplcomp
 203                      ON tplcomp.competencyid = comp.id
 204                   WHERE tplcomp.templateid = ?
 205                ORDER BY tplcomp.sortorder ASC,
 206                         tplcomp.id ASC';
 207          $params = array($templateid);
 208  
 209          $results = $DB->get_records_sql($sql, $params);
 210  
 211          $instances = array();
 212          foreach ($results as $result) {
 213              array_push($instances, new competency(0, $result));
 214          }
 215  
 216          return $instances;
 217      }
 218  
 219      /**
 220       * Remove the competencies in this template.
 221       *
 222       * @param int $templateid The template id
 223       * @return boolen
 224       */
 225      public static function delete_by_templateid($templateid) {
 226          global $DB;
 227  
 228          return $DB->delete_records(self::TABLE, array('templateid' => $templateid));
 229      }
 230  
 231      /**
 232       * Hook to execute before validate.
 233       *
 234       * @return void
 235       */
 236      protected function before_validate() {
 237          if (($this->get('id') && $this->get('sortorder') === null) || !$this->get('id')) {
 238              $this->set('sortorder', $this->count_records(array('templateid' => $this->get('templateid'))));
 239          }
 240      }
 241  
 242      /**
 243       * Validate competencyid.
 244       *
 245       * @param  int $value ID.
 246       * @return true|lang_string
 247       */
 248      protected function validate_competencyid($value) {
 249          if (!competency::record_exists($value)) {
 250              return new \lang_string('invaliddata', 'error');
 251          }
 252          return true;
 253      }
 254  
 255      /**
 256       * Validate templateid.
 257       *
 258       * @param  int $value ID.
 259       * @return true|lang_string
 260       */
 261      protected function validate_templateid($value) {
 262          if (!template::record_exists($value)) {
 263              return new \lang_string('invaliddata', 'error');
 264          }
 265          return true;
 266      }
 267  
 268      /**
 269       * Hook to execute after delete.
 270       *
 271       * @param bool $result Whether or not the delete was successful.
 272       * @return void
 273       */
 274      protected function after_delete($result) {
 275          global $DB;
 276          if (!$result) {
 277              return;
 278          }
 279  
 280          $table = '{' . self::TABLE . '}';
 281          $sql = "UPDATE $table SET sortorder = sortorder -1  WHERE templateid = ? AND sortorder > ?";
 282          $DB->execute($sql, array($this->get('templateid'), $this->get('sortorder')));
 283      }
 284  
 285      /**
 286       * Check if template competency has records for competencies.
 287       *
 288       * @param array $competencyids Array of competencies ids.
 289       * @return boolean Return true if competencies were found in template_competency.
 290       */
 291      public static function has_records_for_competencies($competencyids) {
 292          global $DB;
 293          list($insql, $params) = $DB->get_in_or_equal($competencyids, SQL_PARAMS_NAMED);
 294          return self::record_exists_select("competencyid $insql", $params);
 295      }
 296  
 297  }