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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body