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.
   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   * A scheduled task.
  19   *
  20   * @package    core
  21   * @copyright  2013 onwards Martin Dougiamas  http://dougiamas.com
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  namespace core\task;
  25  
  26  /**
  27   * Simple task to run the badges cron.
  28   */
  29  class badges_cron_task extends scheduled_task {
  30  
  31      /**
  32       * Get a descriptive name for this task (shown to admins).
  33       *
  34       * @return string
  35       */
  36      public function get_name() {
  37          return get_string('taskbadgescron', 'admin');
  38      }
  39  
  40      /**
  41       * Reviews criteria and awards badges
  42       *
  43       * First find all badges that can be earned, then reviews each badge.
  44       * (Not sure how efficient this is timewise).
  45       */
  46      public function execute() {
  47          global $DB, $CFG;
  48          if (!empty($CFG->enablebadges)) {
  49              require_once($CFG->libdir . '/badgeslib.php');
  50              $total = 0;
  51  
  52              $courseparams = array();
  53              if (empty($CFG->badges_allowcoursebadges)) {
  54                  $coursesql = '';
  55              } else {
  56                  $coursesql = ' OR EXISTS (SELECT c.id FROM {course} c WHERE c.visible = :visible AND c.startdate < :current'
  57                          . '     AND c.id = b.courseid) ';
  58                  $courseparams = array('visible' => true, 'current' => time());
  59              }
  60  
  61              $sql = 'SELECT b.id
  62                        FROM {badge} b
  63                       WHERE (b.status = :active OR b.status = :activelocked)
  64                         AND (b.type = :site ' . $coursesql . ')';
  65              $badgeparams = [
  66                  'active' => BADGE_STATUS_ACTIVE,
  67                  'activelocked' => BADGE_STATUS_ACTIVE_LOCKED,
  68                  'site' => BADGE_TYPE_SITE
  69              ];
  70              $params = array_merge($badgeparams, $courseparams);
  71              $badges = $DB->get_fieldset_sql($sql, $params);
  72  
  73              mtrace('Started reviewing available badges.');
  74              foreach ($badges as $bid) {
  75                  $badge = new \badge($bid);
  76  
  77                  if ($badge->has_criteria()) {
  78                      if (debugging()) {
  79                          mtrace('Processing badge "' . $badge->name . '"...');
  80                      }
  81  
  82                      $issued = $badge->review_all_criteria();
  83  
  84                      if (debugging()) {
  85                          mtrace('...badge was issued to ' . $issued . ' users.');
  86                      }
  87                      $total += $issued;
  88                  }
  89              }
  90  
  91              mtrace('Badges were issued ' . $total . ' time(s).');
  92          }
  93      }
  94  }