[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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 * This is really a little language parser for AICC_SCRIPT 19 * evaluates the expression and returns a boolean answer 20 * see 2.3.2.5.1. Sequencing/Navigation Today - from the SCORM 1.2 spec (CAM). 21 * 22 * @param string $prerequisites the aicc_script prerequisites expression 23 * @param array $usertracks the tracked user data of each SCO visited 24 * @return boolean 25 */ 26 function scorm_eval_prerequisites($prerequisites, $usertracks) { 27 28 // This is really a little language parser - AICC_SCRIPT is the reference 29 // see 2.3.2.5.1. Sequencing/Navigation Today - from the SCORM 1.2 spec. 30 $element = ''; 31 $stack = array(); 32 $statuses = array( 33 'passed' => 'passed', 34 'completed' => 'completed', 35 'failed' => 'failed', 36 'incomplete' => 'incomplete', 37 'browsed' => 'browsed', 38 'not attempted' => 'notattempted', 39 'p' => 'passed', 40 'c' => 'completed', 41 'f' => 'failed', 42 'i' => 'incomplete', 43 'b' => 'browsed', 44 'n' => 'notattempted' 45 ); 46 $i = 0; 47 48 // Expand the amp entities. 49 $prerequisites = preg_replace('/&/', '&', $prerequisites); 50 // Find all my parsable tokens. 51 $prerequisites = preg_replace('/(&|\||\(|\)|\~)/', '\t$1\t', $prerequisites); 52 // Expand operators. 53 $prerequisites = preg_replace('/&/', '&&', $prerequisites); 54 $prerequisites = preg_replace('/\|/', '||', $prerequisites); 55 // Now - grab all the tokens. 56 $elements = explode('\t', trim($prerequisites)); 57 58 // Process each token to build an expression to be evaluated. 59 $stack = array(); 60 foreach ($elements as $element) { 61 $element = trim($element); 62 if (empty($element)) { 63 continue; 64 } 65 if (!preg_match('/^(&&|\|\||\(|\))$/', $element)) { 66 // Create each individual expression. 67 // Search for ~ = <> X*{} . 68 69 // Sets like 3*{S34, S36, S37, S39}. 70 if (preg_match('/^(\d+)\*\{(.+)\}$/', $element, $matches)) { 71 $repeat = $matches[1]; 72 $set = explode(',', $matches[2]); 73 $count = 0; 74 foreach ($set as $setelement) { 75 if (isset($usertracks[$setelement]) && 76 ($usertracks[$setelement]->status == 'completed' || $usertracks[$setelement]->status == 'passed')) { 77 $count++; 78 } 79 } 80 if ($count >= $repeat) { 81 $element = 'true'; 82 } else { 83 $element = 'false'; 84 } 85 } else if ($element == '~') { 86 // Not maps ~. 87 $element = '!'; 88 } else if (preg_match('/^(.+)(\=|\<\>)(.+)$/', $element, $matches)) { 89 // Other symbols = | <> . 90 $element = trim($matches[1]); 91 if (isset($usertracks[$element])) { 92 $value = trim(preg_replace('/(\'|\")/', '', $matches[3])); 93 if (isset($statuses[$value])) { 94 $value = $statuses[$value]; 95 } 96 if ($matches[2] == '<>') { 97 $oper = '!='; 98 } else { 99 $oper = '=='; 100 } 101 $element = '(\''.$usertracks[$element]->status.'\' '.$oper.' \''.$value.'\')'; 102 } else { 103 $element = 'false'; 104 } 105 } else { 106 // Everything else must be an element defined like S45 ... 107 if (isset($usertracks[$element]) && 108 ($usertracks[$element]->status == 'completed' || $usertracks[$element]->status == 'passed')) { 109 $element = 'true'; 110 } else { 111 $element = 'false'; 112 } 113 } 114 115 } 116 $stack[] = ' '.$element.' '; 117 } 118 return eval('return '.implode($stack).';'); 119 } 120 121 /** 122 * Sets up $userdata array and default values for SCORM 1.2 . 123 * 124 * @param stdClass $userdata an empty stdClass variable that should be set up with user values 125 * @param object $scorm package record 126 * @param string $scoid SCO Id 127 * @param string $attempt attempt number for the user 128 * @param string $mode scorm display mode type 129 * @return array The default values that should be used for SCORM 1.2 package 130 */ 131 function get_scorm_default (&$userdata, $scorm, $scoid, $attempt, $mode) { 132 global $USER; 133 134 $userdata->student_id = $USER->username; 135 $userdata->student_name = $USER->lastname .', '. $USER->firstname; 136 137 if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) { 138 foreach ($usertrack as $key => $value) { 139 $userdata->$key = $value; 140 } 141 } else { 142 $userdata->status = ''; 143 $userdata->score_raw = ''; 144 } 145 146 if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) { 147 foreach ($scodatas as $key => $value) { 148 $userdata->$key = $value; 149 } 150 } else { 151 print_error('cannotfindsco', 'scorm'); 152 } 153 if (!$sco = scorm_get_sco($scoid)) { 154 print_error('cannotfindsco', 'scorm'); 155 } 156 157 if (isset($userdata->status)) { 158 if ($userdata->status == '') { 159 $userdata->entry = 'ab-initio'; 160 } else { 161 if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) { 162 $userdata->entry = 'resume'; 163 } else { 164 $userdata->entry = ''; 165 } 166 } 167 } 168 169 $userdata->mode = 'normal'; 170 if (!empty($mode)) { 171 $userdata->mode = $mode; 172 } 173 if ($userdata->mode == 'normal') { 174 $userdata->credit = 'credit'; 175 } else { 176 $userdata->credit = 'no-credit'; 177 } 178 179 $def = array(); 180 $def['cmi.core.student_id'] = $userdata->student_id; 181 $def['cmi.core.student_name'] = $userdata->student_name; 182 $def['cmi.core.credit'] = $userdata->credit; 183 $def['cmi.core.entry'] = $userdata->entry; 184 $def['cmi.core.lesson_mode'] = $userdata->mode; 185 $def['cmi.launch_data'] = scorm_isset($userdata, 'datafromlms'); 186 $def['cmi.student_data.mastery_score'] = scorm_isset($userdata, 'masteryscore'); 187 $def['cmi.student_data.max_time_allowed'] = scorm_isset($userdata, 'maxtimeallowed'); 188 $def['cmi.student_data.time_limit_action'] = scorm_isset($userdata, 'timelimitaction'); 189 $def['cmi.core.total_time'] = scorm_isset($userdata, 'cmi.core.total_time', '00:00:00'); 190 191 // Now handle standard userdata items. 192 $def['cmi.core.lesson_location'] = scorm_isset($userdata, 'cmi.core.lesson_location'); 193 $def['cmi.core.lesson_status'] = scorm_isset($userdata, 'cmi.core.lesson_status'); 194 $def['cmi.core.score.raw'] = scorm_isset($userdata, 'cmi.core.score.raw'); 195 $def['cmi.core.score.max'] = scorm_isset($userdata, 'cmi.core.score.max'); 196 $def['cmi.core.score.min'] = scorm_isset($userdata, 'cmi.core.score.min'); 197 $def['cmi.core.exit'] = scorm_isset($userdata, 'cmi.core.exit'); 198 $def['cmi.suspend_data'] = scorm_isset($userdata, 'cmi.suspend_data'); 199 $def['cmi.comments'] = scorm_isset($userdata, 'cmi.comments'); 200 $def['cmi.student_preference.language'] = scorm_isset($userdata, 'cmi.student_preference.language'); 201 $def['cmi.student_preference.audio'] = scorm_isset($userdata, 'cmi.student_preference.audio', '0'); 202 $def['cmi.student_preference.speed'] = scorm_isset($userdata, 'cmi.student_preference.speed', '0'); 203 $def['cmi.student_preference.text'] = scorm_isset($userdata, 'cmi.student_preference.text', '0'); 204 return $def; 205 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |