Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 311 and 402] [Versions 400 and 402] [Versions 402 and 403]

   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   * List of deprecated mod_scorm functions.
  19   *
  20   * @package   mod_scorm
  21   * @copyright 2021 Shamim Rezaie <shamim@moodle.com>
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  /**
  26   * Obtains the automatic completion state for this scorm based on any conditions
  27   * in scorm settings.
  28   *
  29   * @deprecated since Moodle 3.11
  30   * @todo MDL-71196 Final deprecation in Moodle 4.3
  31   * @see \mod_scorm\completion\custom_completion
  32   * @param stdClass $course Course
  33   * @param cm_info|stdClass $cm Course-module
  34   * @param int $userid User ID
  35   * @param bool $type Type of comparison (or/and; can be used as return value if no conditions)
  36   * @return bool True if completed, false if not. (If no conditions, then return
  37   *   value depends on comparison type)
  38   */
  39  function scorm_get_completion_state($course, $cm, $userid, $type) {
  40      global $DB;
  41  
  42      // No need to call debugging here. Deprecation debugging notice already being called in \completion_info::internal_get_state().
  43  
  44      $result = $type;
  45  
  46      // Get scorm.
  47      if (!$scorm = $DB->get_record('scorm', array('id' => $cm->instance))) {
  48          throw new \moodle_exception('cannotfindscorm');
  49      }
  50      // Only check for existence of tracks and return false if completionstatusrequired or completionscorerequired
  51      // this means that if only view is required we don't end up with a false state.
  52      if ($scorm->completionstatusrequired !== null || $scorm->completionscorerequired !== null) {
  53          // Get user's tracks data.
  54          $tracks = $DB->get_records_sql(
  55              "
  56              SELECT
  57                  id,
  58                  scoid,
  59                  element,
  60                  value
  61              FROM
  62                  {scorm_scoes_track}
  63              WHERE
  64                  scormid = ?
  65              AND userid = ?
  66              AND element IN
  67              (
  68                  'cmi.core.lesson_status',
  69                  'cmi.completion_status',
  70                  'cmi.success_status',
  71                  'cmi.core.score.raw',
  72                  'cmi.score.raw'
  73              )
  74              ",
  75              array($scorm->id, $userid)
  76          );
  77  
  78          if (!$tracks) {
  79              return completion_info::aggregate_completion_states($type, $result, false);
  80          }
  81      }
  82  
  83      // Check for status.
  84      if ($scorm->completionstatusrequired !== null) {
  85  
  86          // Get status.
  87          $statuses = array_flip(scorm_status_options());
  88          $nstatus = 0;
  89          // Check any track for these values.
  90          $scostatus = array();
  91          foreach ($tracks as $track) {
  92              if (!in_array($track->element, array('cmi.core.lesson_status', 'cmi.completion_status', 'cmi.success_status'))) {
  93                  continue;
  94              }
  95              if (array_key_exists($track->value, $statuses)) {
  96                  $scostatus[$track->scoid] = true;
  97                  $nstatus |= $statuses[$track->value];
  98              }
  99          }
 100  
 101          if (!empty($scorm->completionstatusallscos)) {
 102              // Iterate over all scos and make sure each has a lesson_status.
 103              $scos = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id, 'scormtype' => 'sco'));
 104              foreach ($scos as $sco) {
 105                  if (empty($scostatus[$sco->id])) {
 106                      return completion_info::aggregate_completion_states($type, $result, false);
 107                  }
 108              }
 109              return completion_info::aggregate_completion_states($type, $result, true);
 110          } else if ($scorm->completionstatusrequired & $nstatus) {
 111              return completion_info::aggregate_completion_states($type, $result, true);
 112          } else {
 113              return completion_info::aggregate_completion_states($type, $result, false);
 114          }
 115      }
 116  
 117      // Check for score.
 118      if ($scorm->completionscorerequired !== null) {
 119          $maxscore = -1;
 120  
 121          foreach ($tracks as $track) {
 122              if (!in_array($track->element, array('cmi.core.score.raw', 'cmi.score.raw'))) {
 123                  continue;
 124              }
 125  
 126              if (strlen($track->value) && floatval($track->value) >= $maxscore) {
 127                  $maxscore = floatval($track->value);
 128              }
 129          }
 130  
 131          if ($scorm->completionscorerequired <= $maxscore) {
 132              return completion_info::aggregate_completion_states($type, $result, true);
 133          } else {
 134              return completion_info::aggregate_completion_states($type, $result, false);
 135          }
 136      }
 137  
 138      return $result;
 139  }