[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/mod/scorm/datamodels/ -> scorm_12lib.php (source)

   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('/&amp;/', '&', $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  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1