From 60201a66e025a240a7b01774a566f8709a474cae Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Sat, 9 Jul 2011 11:12:18 +1200 Subject: [PATCH] SCORM MDL-26942 - merge scorm_get_toc into a single global function --- mod/scorm/datamodels/aicclib.php | 241 ------------------------- mod/scorm/datamodels/scorm_12lib.php | 242 ------------------------- mod/scorm/datamodels/scorm_13lib.php | 244 ------------------------- mod/scorm/locallib.php | 259 +++++++++++++++++++++++++++ 4 files changed, 259 insertions(+), 727 deletions(-) delete mode 100644 mod/scorm/datamodels/scorm_13lib.php diff --git a/mod/scorm/datamodels/aicclib.php b/mod/scorm/datamodels/aicclib.php index 0badfef890d..73bfa6fdf76 100644 --- a/mod/scorm/datamodels/aicclib.php +++ b/mod/scorm/datamodels/aicclib.php @@ -329,244 +329,3 @@ function scorm_parse_aicc($scorm) { return true; } - -function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$scoid='',$mode='normal',$attempt='',$play=false, $tocheader=false) { - global $CFG, $DB, $PAGE, $OUTPUT; - - $modestr = ''; - if ($mode == 'browse') { - $modestr = '&mode='.$mode; - } - - $result = new stdClass(); - if ($tocheader) { - $result->toc = '
'; - $result->toc .= '
'; - $result->toc .= '
'; - } - $result->toc .= '
    '; - $tocmenus = array(); - $result->prerequisites = true; - $incomplete = false; - - // - // Get the current organization infos - // - if (!empty($currentorg)) { - if (($organizationtitle = $DB->get_field('scorm_scoes','title', array('scorm'=>$scorm->id,'identifier'=>$currentorg))) != '') { - if ($play) { - $result->toctitle = "$organizationtitle"; - } - else { - $result->toc .= "\t
  • $organizationtitle
  • \n"; - } - $tocmenus[] = $organizationtitle; - } - } - // - // If not specified retrieve the last attempt number - // - if (empty($attempt)) { - $attempt = scorm_get_last_attempt($scorm->id, $user->id); - } - $result->attemptleft = $scorm->maxattempt - $attempt; - if ($scoes = scorm_get_scoes($scorm->id, $currentorg)){ - // - // Retrieve user tracking data for each learning object - // - $usertracks = array(); - foreach ($scoes as $sco) { - if (!empty($sco->launch)) { - if (empty($scoid)) { - $scoid = $sco->id; - } - if ($usertrack = scorm_get_tracks($sco->id,$user->id,$attempt)) { - if ($usertrack->status == '') { - $usertrack->status = 'notattempted'; - } - $usertracks[$sco->identifier] = $usertrack; - } - } - } - - $level=0; - $sublist=1; - $previd = 0; - $nextid = 0; - $findnext = false; - $parents[$level]='/'; - - foreach ($scoes as $pos => $sco) { - $isvisible = false; - $sco->title = $sco->title; - if (!isset($sco->isvisible) || (isset($sco->isvisible) && ($sco->isvisible == 'true'))) { - $isvisible = true; - } - if ($parents[$level]!=$sco->parent) { - if ($newlevel = array_search($sco->parent,$parents)) { - for ($i=0; $i<($level-$newlevel); $i++) { - $result->toc .= "\t\t
\n"; - } - $level = $newlevel; - } else { - $i = $level; - $closelist = ''; - while (($i > 0) && ($parents[$level] != $sco->parent)) { - $closelist .= "\t\t\n"; - $i--; - } - if (($i == 0) && ($sco->parent != $currentorg)) { - $result->toc .= "\t\t
    \n"; - $level++; - } else { - $result->toc .= $closelist; - $level = $i; - } - $parents[$level]=$sco->parent; - } - } - if ($isvisible) { - $result->toc .= "\t\t
  • "; - } - if (isset($scoes[$pos+1])) { - $nextsco = $scoes[$pos+1]; - } else { - $nextsco = false; - } - $nextisvisible = false; - if (!isset($nextsco->isvisible) || (isset($nextsco->isvisible) && ($nextsco->isvisible == 'true'))) { - $nextisvisible = true; - } - if ($nextisvisible && ($nextsco !== false) && ($sco->parent != $nextsco->parent) && (($level==0) || (($level>0) && ($nextsco->parent == $sco->identifier)))) { - $sublist++; - } - if (empty($sco->title)) { - $sco->title = $sco->identifier; - } - if (!empty($sco->launch)) { - if ($isvisible) { - $score = ''; - if (empty($scoid) && ($mode != 'normal')) { - $scoid = $sco->id; - } - if (isset($usertracks[$sco->identifier])) { - $usertrack = $usertracks[$sco->identifier]; - $strstatus = get_string($usertrack->status,'scorm'); - if ($sco->scormtype == 'sco') { - $statusicon = ''.$strstatus.''; - } else { - $statusicon = ''.get_string('assetlaunched','scorm').''; - } - - if (($usertrack->status == 'notattempted') || ($usertrack->status == 'incomplete') || ($usertrack->status == 'browsed')) { - $incomplete = true; - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - } - if ($usertrack->score_raw != '' && has_capability('mod/scorm:viewscores', get_context_instance(CONTEXT_MODULE,$cmid))) { - $score = '('.get_string('score','scorm').': '.$usertrack->score_raw.')'; - } - $strsuspended = get_string('suspended','scorm'); - if ($incomplete && isset($usertrack->{'cmi.core.exit'}) && ($usertrack->{'cmi.core.exit'} == 'suspend')) { - $statusicon = ''.$strstatus.' - '.$strsuspended.''; - } - } else { - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - $incomplete = true; - if ($sco->scormtype == 'sco') { - $statusicon = ''.get_string('notattempted','scorm').''; - } else { - $statusicon = ''.get_string('asset','scorm').''; - } - } - if ($sco->id == $scoid) { - $findnext = true; - } - - if (($nextid == 0) && (scorm_count_launchable($scorm->id,$currentorg) > 1) && ($nextsco!==false) && (!$findnext)) { - if (!empty($sco->launch)) { - $previd = $sco->id; - } - } - if (empty($sco->prerequisites) || scorm_eval_prerequisites($sco->prerequisites,$usertracks)) { - if ($sco->id == $scoid) { - $result->prerequisites = true; - } - - $thisscoidstr = '&scoid='.$sco->id; - $link = 'a='.$scorm->id.$thisscoidstr.'¤torg='.$currentorg.$modestr.'&attempt='.$attempt; - - if ($toclink == TOCFULLURL) { //display toc with urls for structure page - $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&currentorg='.$currentorg.$modestr.'&scoid='.$sco->id; - $result->toc .= $statusicon.' '.format_string($sco->title).''.$score."\n"; - } else { - if ($sco->launch) { - $result->toc .= ''.$statusicon.' '.format_string($sco->title).' '.$score.''; - } else { - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } - } - $tocmenus[$sco->id] = scorm_repeater('−',$level) . '>' . format_string($sco->title); - } else { - if ($sco->id == $scoid) { - $result->prerequisites = false; - } - if ($play) { - // should be disabled - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } else { - $result->toc .= $statusicon.' '.format_string($sco->title)."\n"; - } - } - if (($nextsco === false) || $nextsco->parent == $sco->parent) { - $result->toc .= '
  • '; - } - } - } else { - $result->toc .= ' '.format_string($sco->title)."\n"; - } - if (($nextsco !== false) && ($nextid == 0) && ($findnext)) { - if (!empty($nextsco->launch)) { - $nextid = $nextsco->id; - } - } - } - for ($i=0;$i<$level;$i++) { - $result->toc .= "\t\t
\n"; - } - - if ($play) { - $sco = scorm_get_sco($scoid); - $sco->previd = $previd; - $sco->nextid = $nextid; - $result->sco = $sco; - $result->incomplete = $incomplete; - } else { - $result->incomplete = $incomplete; - } - } - $result->toc .= ''; - - // NEW IMS TOC - if ($tocheader) { - $result->toc .= '
'; - $result->toc .= '
'; - } - - - if ($scorm->hidetoc == 0) { - $result->toc .= html_writer::script(js_writer::set_variable('scormdata', array( - 'plusicon' => $OUTPUT->pix_url('plus', 'scorm'), - 'minusicon' => $OUTPUT->pix_url('minus', 'scorm')))); - $result->toc .= html_writer::script('', $CFG->wwwroot.'/lib/cookies.js'); - $result->toc .= html_writer::script('', $CFG->wwwroot.'/mod/scorm/datamodels/scorm_datamodels.js'); - } - - $url = new moodle_url('/mod/scorm/player.php?a='.$scorm->id.'¤torg='.$currentorg.$modestr); - $result->tocmenu = $OUTPUT->single_select($url, 'scoid', $tocmenus, $sco->id, null, "tocmenu"); - - return $result; -} diff --git a/mod/scorm/datamodels/scorm_12lib.php b/mod/scorm/datamodels/scorm_12lib.php index dcae0e4bd69..72dadec12c5 100644 --- a/mod/scorm/datamodels/scorm_12lib.php +++ b/mod/scorm/datamodels/scorm_12lib.php @@ -105,245 +105,3 @@ function scorm_eval_prerequisites($prerequisites, $usertracks) { } return eval('return '.implode($stack).';'); } - -function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$scoid='',$mode='normal',$attempt='',$play=false, $tocheader=false) { - global $CFG, $DB, $PAGE, $OUTPUT; - - $modestr = ''; - if ($mode == 'browse') { - $modestr = '&mode='.$mode; - } - - $result = new stdClass(); - if ($tocheader) { - $result->toc = '
'; - $result->toc .= '
'; - $result->toc .= '
'; - } - $result->toc .= '
    '; - $tocmenus = array(); - $result->prerequisites = true; - $incomplete = false; - - // - // Get the current organization infos - // - if (!empty($currentorg)) { - if (($organizationtitle = $DB->get_field('scorm_scoes','title', array('scorm'=>$scorm->id,'identifier'=>$currentorg))) != '') { - if ($play) { - $result->toctitle = "$organizationtitle"; - } - else { - $result->toc .= "\t
  • $organizationtitle
  • \n"; - } - $tocmenus[] = $organizationtitle; - } - } - - // - // If not specified retrieve the last attempt number - // - if (empty($attempt)) { - $attempt = scorm_get_attempt_count($user->id, $scorm); - } - $result->attemptleft = $scorm->maxattempt == 0 ? 1 : $scorm->maxattempt - $attempt; - $conditions['scorm'] = $scorm->id; - if ($scoes = scorm_get_scoes($scorm->id, $currentorg)){ - // - // Retrieve user tracking data for each learning object - // - $usertracks = array(); - foreach ($scoes as $sco) { - if (!empty($sco->launch)) { - if ($usertrack = scorm_get_tracks($sco->id,$user->id,$attempt)) { - if ($usertrack->status == '') { - $usertrack->status = 'notattempted'; - } - $usertracks[$sco->identifier] = $usertrack; - } - } - } - - $level=0; - $sublist=1; - $previd = 0; - $nextid = 0; - $findnext = false; - $parents[$level]='/'; - - foreach ($scoes as $pos => $sco) { - $isvisible = false; - $sco->title = $sco->title; - if (!isset($sco->isvisible) || (isset($sco->isvisible) && ($sco->isvisible == 'true'))) { - $isvisible = true; - } - if ($parents[$level] != $sco->parent) { - if ($newlevel = array_search($sco->parent,$parents)) { - for ($i=0; $i<($level-$newlevel); $i++) { - $result->toc .= "\t\t
\n"; - } - $level = $newlevel; - } else { - $i = $level; - $closelist = ''; - while (($i > 0) && ($parents[$level] != $sco->parent)) { - $closelist .= "\t\t\n"; - $i--; - } - if (($i == 0) && ($sco->parent != $currentorg)) { - $result->toc .= "\t\t
    \n"; - $level++; - } else { - $result->toc .= $closelist; - $level = $i; - } - $parents[$level] = $sco->parent; - } - } - if ($isvisible) { - $result->toc .= "
  • "; - } - if (isset($scoes[$pos+1])) { - $nextsco = $scoes[$pos+1]; - } else { - $nextsco = false; - } - $nextisvisible = false; - if (($nextsco !== false) && (!isset($nextsco->isvisible) || (isset($nextsco->isvisible) && ($nextsco->isvisible == 'true')))) { - $nextisvisible = true; - } - if ($nextisvisible && ($nextsco !== false) && ($sco->parent != $nextsco->parent) && (($level==0) || (($level>0) && ($nextsco->parent == $sco->identifier)))) { - $sublist++; - } - if (empty($sco->title)) { - $sco->title = $sco->identifier; - } - if (!empty($sco->launch)) { - if ($isvisible) { - $score = ''; - if (empty($scoid) && ($mode != 'normal')) { - $scoid = $sco->id; - } - if (isset($usertracks[$sco->identifier])) { - $usertrack = $usertracks[$sco->identifier]; - $strstatus = get_string($usertrack->status,'scorm'); - if ($sco->scormtype == 'sco') { - $statusicon = ''.$strstatus.''; - } else { - $statusicon = ''.get_string('assetlaunched','scorm').''; - } - - if (($usertrack->status == 'notattempted') || ($usertrack->status == 'incomplete') || ($usertrack->status == 'browsed')) { - $incomplete = true; - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - } - if ($usertrack->score_raw != '' && has_capability('mod/scorm:viewscores', get_context_instance(CONTEXT_MODULE,$cmid))) { - $score = '('.get_string('score','scorm').': '.$usertrack->score_raw.')'; - } - $strsuspended = get_string('suspended','scorm'); - if ($incomplete && isset($usertrack->{'cmi.core.exit'}) && ($usertrack->{'cmi.core.exit'} == 'suspend')) { - $statusicon = ''.$strstatus.' - '.$strsuspended.''; - } - } else { - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - $incomplete = true; - if ($sco->scormtype == 'sco') { - $statusicon = ''.get_string('notattempted','scorm').''; - } else { - $statusicon = ''.get_string('asset','scorm').''; - } - } - if ($sco->id == $scoid) { - $findnext = true; - } - - if (($nextid == 0) && (scorm_count_launchable($scorm->id,$currentorg) > 1) && ($nextsco!==false) && (!$findnext)) { - if (!empty($sco->launch)) { - $previd = $sco->id; - } - } - if (empty($sco->prerequisites) || scorm_eval_prerequisites($sco->prerequisites,$usertracks)) { - if ($sco->id == $scoid) { - $result->prerequisites = true; - } - $thisscoidstr = '&scoid='.$sco->id; - $link = 'a='.$scorm->id.$thisscoidstr.'¤torg='.$currentorg.$modestr.'&attempt='.$attempt; - - if ($toclink == TOCFULLURL) { //display toc with urls for structure page - $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&currentorg='.$currentorg.$modestr.'&scoid='.$sco->id; - $result->toc .= $statusicon.' '.format_string($sco->title).''.$score."\n"; - } else { //display toc for inside scorm player - if ($sco->launch) { - $result->toc .= ''.$statusicon.' '.format_string($sco->title).' '.$score.''; - } else { - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } - } - $tocmenus[$sco->id] = scorm_repeater('−',$level) . '>' . format_string($sco->title); - } else { - if ($sco->id == $scoid) { - $result->prerequisites = false; - } - if ($play) { - // should be disabled - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } else { - $result->toc .= $statusicon.' '.format_string($sco->title)."\n"; - } - } - if (($nextsco === false) || $nextsco->parent == $sco->parent) { - $result->toc .= '
  • '; - } - } - } else { - $result->toc .= ' '.format_string($sco->title)."\n"; - } - if (($nextsco !== false) && ($nextid == 0) && ($findnext)) { - if (!empty($nextsco->launch)) { - $nextid = $nextsco->id; - } - } - } - for ($i=0;$i<$level;$i++) { - $result->toc .= "\t\t
\n"; - } - - if ($play) { - // it is possible that $scoid is still not set, in this case we don't want an empty object - if ($scoid) { - $sco = scorm_get_sco($scoid); - } - $sco->previd = $previd; - $sco->nextid = $nextid; - $result->sco = $sco; - $result->incomplete = $incomplete; - } else { - $result->incomplete = $incomplete; - } - } - $result->toc .= ''; - - // NEW IMS TOC - if ($tocheader) { - $result->toc .= '
'; - $result->toc .= '
'; - } - - - if ($scorm->hidetoc == 0) { - $PAGE->requires->data_for_js('scormdata', array( - 'plusicon' => $OUTPUT->pix_url('plus', 'scorm'), - 'minusicon' => $OUTPUT->pix_url('minus', 'scorm'))); - $PAGE->requires->js('/lib/cookies.js'); - $PAGE->requires->js('/mod/scorm/datamodels/scorm_datamodels.js'); - } - - $url = new moodle_url('/mod/scorm/player.php?a='.$scorm->id.'¤torg='.$currentorg.$modestr); - $result->tocmenu = $OUTPUT->single_select($url, 'scoid', $tocmenus, $sco->id, null, "tocmenu"); - - return $result; -} diff --git a/mod/scorm/datamodels/scorm_13lib.php b/mod/scorm/datamodels/scorm_13lib.php deleted file mode 100644 index d78b4447ba6..00000000000 --- a/mod/scorm/datamodels/scorm_13lib.php +++ /dev/null @@ -1,244 +0,0 @@ -toc = '
'; - $result->toc .= '
'; - $result->toc .= '
'; - } - $result->toc .= '
    '; - $tocmenus = array(); - $result->prerequisites = true; - $incomplete = false; - - // - // Get the current organization infos - // - if (!empty($currentorg)) { - if (($organizationtitle = $DB->get_field('scorm_scoes', 'title', array('scorm'=>$scorm->id,'identifier'=>$currentorg))) != '') { - if ($play) { - $result->toctitle = "$organizationtitle"; - } - else { - $result->toc .= "\t
  • $organizationtitle
  • \n"; - } - $tocmenus[] = $organizationtitle; - } - } - // - // If not specified retrieve the last attempt number - // - if (empty($attempt)) { - $attempt = scorm_get_last_attempt($scorm->id, $user->id); - } - $result->attemptleft = $scorm->maxattempt - $attempt; - if ($scoes = scorm_get_scoes($scorm->id, $currentorg)){ - // - // Retrieve user tracking data for each learning object - // - - $usertracks = array(); - foreach ($scoes as $sco) { - if (!empty($sco->launch)) { - if ($usertrack = scorm_get_tracks($sco->id,$user->id,$attempt)) { - if ($usertrack->status == '') { - $usertrack->status = 'notattempted'; - } - $usertracks[$sco->identifier] = $usertrack; - } - } - } - - $level=0; - $sublist=1; - $previd = 0; - $nextid = 0; - $findnext = false; - $parents[$level]='/'; - foreach ($scoes as $pos => $sco) { - $isvisible = false; - $sco->title = $sco->title; - if (!isset($sco->isvisible) || (isset($sco->isvisible) && ($sco->isvisible == 'true'))) { - $isvisible = true; - } - if ($parents[$level]!=$sco->parent) { - if ($newlevel = array_search($sco->parent,$parents)) { - for ($i=0; $i<($level-$newlevel); $i++) { - $result->toc .= "\t\t
\n"; - } - $level = $newlevel; - } else { - $i = $level; - $closelist = ''; - while (($i > 0) && ($parents[$level] != $sco->parent)) { - $closelist .= "\t\t\n"; - $i--; - } - if (($i == 0) && ($sco->parent != $currentorg)) { - $result->toc .= "\t\t>
    \n"; - $level++; - } else { - $result->toc .= $closelist; - $level = $i; - } - $parents[$level]=$sco->parent; - } - } - if ($isvisible) { - $result->toc .= "
  • "; - } - if (isset($scoes[$pos+1])) { - $nextsco = $scoes[$pos+1]; - } else { - $nextsco = false; - } - $nextisvisible = false; - if (!isset($nextsco->isvisible) || (isset($nextsco->isvisible) && ($nextsco->isvisible == 'true'))) { - $nextisvisible = true; - } - if ($nextisvisible && ($nextsco !== false) && ($sco->parent != $nextsco->parent) && - (($level==0) || (($level>0) && ($nextsco->parent == $sco->identifier)))) { - $sublist++; - } - if (empty($sco->title)) { - $sco->title = $sco->identifier; - } - if (!empty($sco->launch)) { - if ($isvisible) { - $score = ''; - if (empty($scoid) && ($mode != 'normal')) { - $scoid = $sco->id; - } - if (isset($usertracks[$sco->identifier])) { - $usertrack = $usertracks[$sco->identifier]; - $strstatus = get_string($usertrack->status,'scorm'); - if ($sco->scormtype == 'sco') { - $statusicon = ''.$strstatus.''; - } else { - $statusicon = ''.get_string('assetlaunched','scorm').''; - } - - if (($usertrack->status == 'notattempted') || ($usertrack->status == 'incomplete') || ($usertrack->status == 'browsed')) { - $incomplete = true; - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - } - if ($usertrack->score_raw != '' && has_capability('mod/scorm:viewscores', get_context_instance(CONTEXT_MODULE,$cmid))) { - $score = '('.get_string('score','scorm').': '.$usertrack->score_raw.')'; - } - $strsuspended = get_string('suspended','scorm'); - if ($incomplete && isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} == 'suspend')) { - $statusicon = ''.$strstatus.' - '.$strsuspended.''; - } - } else { - if ($play && empty($scoid)) { - $scoid = $sco->id; - } - if ($sco->scormtype == 'sco') { - $statusicon = ''.get_string('notattempted','scorm').''; - $incomplete = true; - } else { - $statusicon = ''.get_string('asset','scorm').''; - } - } - - if ($sco->id == $scoid) { - $findnext = true; - } - - if (($nextid == 0) && (scorm_count_launchable($scorm->id,$currentorg) > 1) && ($nextsco!==false) && (!$findnext)) { - if (!empty($sco->launch)) { - $previd = $sco->id; - } - } - require_once($CFG->dirroot.'/mod/scorm/datamodels/sequencinglib.php'); - if (scorm_seq_evaluate($sco->id,$usertracks)) { - if ($sco->id == $scoid) { - $result->prerequisites = true; - } - - if ($toclink == TOCFULLURL) { //display toc with urls for structure page - $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&currentorg='.$currentorg.$modestr.'&scoid='.$sco->id; - $result->toc .= $statusicon.' '.format_string($sco->title).''.$score."\n"; - } else { - if ($sco->launch) { - $link = 'a='.$scorm->id.'&scoid='.$sco->id.'¤torg='.$currentorg.$modestr.'&attempt='.$attempt; - $result->toc .= ''.$statusicon.' '.format_string($sco->title).' '.$score.''; - } else { - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } - } - $tocmenus[$sco->id] = scorm_repeater('−',$level) . '>' . format_string($sco->title); - } else { - if ($sco->id == $scoid) { - $result->prerequisites = false; - } - if ($play) { - // should be disabled - $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; - } else { - $result->toc .= $statusicon.' '.format_string($sco->title)."\n"; - } - } - if (($nextsco === false) || $nextsco->parent == $sco->parent) { - $result->toc .= '
  • '; - } - } - } else { - $result->toc .= ' '.format_string($sco->title)."\n"; - } - if (($nextsco !== false) && ($nextid == 0) && ($findnext)) { - if (!empty($nextsco->launch)) { - $nextid = $nextsco->id; - } - } - } - for ($i=0;$i<$level;$i++) { - $result->toc .= "\t\t
\n"; - } - - if ($play) { - // it is possible that $scoid is still not set, in this case we don't want an empty object - if ($scoid) { - $sco = scorm_get_sco($scoid); - } - $sco->previd = $previd; - $sco->nextid = $nextid; - $result->sco = $sco; - $result->incomplete = $incomplete; - } else { - $result->incomplete = $incomplete; - } - } - $result->toc .= ''; - - - // NEW IMS TOC - if ($tocheader) { - $result->toc .= '
'; - $result->toc .= '
'; - } - - - if ($scorm->hidetoc == 0) { - $PAGE->requires->data_for_js('scormdata', array( - 'plusicon' => $OUTPUT->pix_url('plus', 'scorm'), - 'minusicon' => $OUTPUT->pix_url('minus', 'scorm'))); - $PAGE->requires->js('/lib/cookies.js'); - $PAGE->requires->js('/mod/scorm/datamodels/scorm_datamodels.js'); - } - - $url = new moodle_url('/mod/scorm/player.php?a='.$scorm->id.'¤torg='.$currentorg.$modestr); - $result->tocmenu = $OUTPUT->single_select($url, 'scoid', $tocmenus, $sco->id, null, "tocmenu"); - - return $result; -} diff --git a/mod/scorm/locallib.php b/mod/scorm/locallib.php index d1e3bf1c1b6..b4445ae91a1 100644 --- a/mod/scorm/locallib.php +++ b/mod/scorm/locallib.php @@ -1218,3 +1218,262 @@ function scorm_format_duration($duration) { return $result; } + +function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$scoid='',$mode='normal',$attempt='',$play=false, $tocheader=false) { + global $CFG, $DB, $PAGE, $OUTPUT; + + $modestr = ''; + if ($mode == 'browse') { + $modestr = '&mode='.$mode; + } + + $result = new stdClass(); + if ($tocheader) { + $result->toc = '
'; + $result->toc .= '
'; + $result->toc .= '
'; + } + $result->toc .= '
    '; + $tocmenus = array(); + $result->prerequisites = true; + $incomplete = false; + + // + // Get the current organization infos + // + if (!empty($currentorg)) { + if (($organizationtitle = $DB->get_field('scorm_scoes','title', array('scorm'=>$scorm->id,'identifier'=>$currentorg))) != '') { + if ($play) { + $result->toctitle = "$organizationtitle"; + } + else { + $result->toc .= "\t
  • $organizationtitle
  • \n"; + } + $tocmenus[] = $organizationtitle; + } + } + + // + // If not specified retrieve the last attempt number + // + if (empty($attempt)) { + $attempt = scorm_get_attempt_count($user->id, $scorm); + } + $result->attemptleft = $scorm->maxattempt == 0 ? 1 : $scorm->maxattempt - $attempt; + if ($scoes = scorm_get_scoes($scorm->id, $currentorg)){ + // + // Retrieve user tracking data for each learning object + // + $usertracks = array(); + foreach ($scoes as $sco) { + if (!empty($sco->launch)) { + if (empty($scoid)) { + $scoid = $sco->id; + } + if ($usertrack = scorm_get_tracks($sco->id,$user->id,$attempt)) { + if ($usertrack->status == '') { + $usertrack->status = 'notattempted'; + } + $usertracks[$sco->identifier] = $usertrack; + } + } + } + + $level=0; + $sublist=1; + $previd = 0; + $nextid = 0; + $findnext = false; + $parents[$level]='/'; + foreach ($scoes as $pos => $sco) { + $isvisible = false; + $sco->title = $sco->title; + if (!isset($sco->isvisible) || (isset($sco->isvisible) && ($sco->isvisible == 'true'))) { + $isvisible = true; + } + if ($parents[$level] != $sco->parent) { + if ($newlevel = array_search($sco->parent,$parents)) { + for ($i=0; $i<($level-$newlevel); $i++) { + $result->toc .= "\t\t
\n"; + } + $level = $newlevel; + } else { + $i = $level; + $closelist = ''; + while (($i > 0) && ($parents[$level] != $sco->parent)) { + if ($i === 1 && $level > 1) { + $closelist .= "\t\t\n"; + } else { + $closelist .= "\t\n"; + } + $i--; + } + if (($i == 0) && ($sco->parent != $currentorg)) { + $result->toc .= "\n\t
    \n"; + $level++; + } else { + $result->toc .= $closelist; + $level = $i; + } + $parents[$level] = $sco->parent; + } + } + if ($isvisible) { + $result->toc .= "
  • "; + } + if (isset($scoes[$pos+1])) { + $nextsco = $scoes[$pos+1]; + } else { + $nextsco = false; + } + $nextisvisible = false; + if (($nextsco !== false) && (!isset($nextsco->isvisible) || (isset($nextsco->isvisible) && ($nextsco->isvisible == 'true')))) { + $nextisvisible = true; + } + if ($nextisvisible && ($nextsco !== false) && ($sco->parent != $nextsco->parent) && + (($level==0) || (($level>0) && ($nextsco->parent == $sco->identifier)))) { + $sublist++; + } + if (empty($sco->title)) { + $sco->title = $sco->identifier; + } + if ($isvisible) { + if (!empty($sco->launch)) { + $score = ''; + if (empty($scoid) && ($mode != 'normal')) { + $scoid = $sco->id; + } + if (isset($usertracks[$sco->identifier])) { + $usertrack = $usertracks[$sco->identifier]; + $strstatus = get_string($usertrack->status,'scorm'); + if ($sco->scormtype == 'sco') { + $statusicon = ''.$strstatus.''; + } else { + $statusicon = ''.get_string('assetlaunched','scorm').''; + } + + if (($usertrack->status == 'notattempted') || ($usertrack->status == 'incomplete') || ($usertrack->status == 'browsed')) { + $incomplete = true; + if ($play && empty($scoid)) { + $scoid = $sco->id; + } + } + if ($usertrack->score_raw != '' && has_capability('mod/scorm:viewscores', get_context_instance(CONTEXT_MODULE,$cmid))) { + $score = '('.get_string('score','scorm').': '.$usertrack->score_raw.')'; + } + $strsuspended = get_string('suspended','scorm'); + $exitvar = 'cmi.core.exit'; + if ($scorm->version == 'SCORM_1.3') { + $exitvar = 'cmi.exit'; + } + if ($incomplete && isset($usertrack->{$exitvar}) && ($usertrack->{$exitvar} == 'suspend')) { + $statusicon = ''.$strstatus.' - '.$strsuspended.''; + } + } else { + if ($play && empty($scoid)) { + $scoid = $sco->id; + } + $incomplete = true; + if ($sco->scormtype == 'sco') { + $statusicon = ''.get_string('notattempted','scorm').''; + } else { + $statusicon = ''.get_string('asset','scorm').''; + } + } + if ($sco->id == $scoid) { + $findnext = true; + } + + if (($nextid == 0) && (scorm_count_launchable($scorm->id,$currentorg) > 1) && ($nextsco!==false) && (!$findnext)) { + if (!empty($sco->launch)) { + $previd = $sco->id; + } + } + + if ($scorm->version == 'SCORM_1.3') { + require_once($CFG->dirroot.'/mod/scorm/datamodels/sequencinglib.php'); + $prereq = scorm_seq_evaluate($sco->id,$usertracks); + } else { + //TODO: split check for sco->prerequisites only for AICC as I think that's the only case it's set. + $prereq = empty($sco->prerequisites) || scorm_eval_prerequisites($sco->prerequisites,$usertracks); + } + if ($prereq) { + if ($sco->id == $scoid) { + $result->prerequisites = true; + } + + if ($toclink == TOCFULLURL) { //display toc with urls for structure page + $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&currentorg='.$currentorg.$modestr.'&scoid='.$sco->id; + $result->toc .= $statusicon.' '.format_string($sco->title).''.$score."\n"; + } else { //display toc for inside scorm player + if ($sco->launch) { + $link = 'a='.$scorm->id.'&scoid='.$sco->id.'¤torg='.$currentorg.$modestr.'&attempt='.$attempt; + $result->toc .= ''.$statusicon.' '.format_string($sco->title).' '.$score.''; + } else { + $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; + } + } + $tocmenus[$sco->id] = scorm_repeater('−',$level) . '>' . format_string($sco->title); + } else { + if ($sco->id == $scoid) { + $result->prerequisites = false; + } + if ($play) { + // should be disabled + $result->toc .= ''.$statusicon.' '.format_string($sco->title).''; + } else { + $result->toc .= $statusicon.' '.format_string($sco->title)."\n"; + } + } + } else { + $result->toc .= ' '.format_string($sco->title); + } + if (($nextsco === false) || $nextsco->parent == $sco->parent) { + $result->toc .= "
  • \n"; + } + } + if (($nextsco !== false) && ($nextid == 0) && ($findnext)) { + if (!empty($nextsco->launch)) { + $nextid = $nextsco->id; + } + } + } + for ($i=0;$i<$level;$i++) { + $result->toc .= "\t\t
\n"; + } + + if ($play) { + if (empty($scoid)) { + $scoid = reset($scoes)->id; + } + $sco = scorm_get_sco($scoid); + $sco->previd = $previd; + $sco->nextid = $nextid; + $result->sco = $sco; + $result->incomplete = $incomplete; + } else { + $result->incomplete = $incomplete; + } + } + $result->toc .= ''; + + // NEW IMS TOC + if ($tocheader) { + $result->toc .= '
'; + $result->toc .= '
'; + } + + + if ($scorm->hidetoc == 0) { + $PAGE->requires->data_for_js('scormdata', array( + 'plusicon' => $OUTPUT->pix_url('plus', 'scorm'), + 'minusicon' => $OUTPUT->pix_url('minus', 'scorm'))); + $PAGE->requires->js('/lib/cookies.js'); + $PAGE->requires->js('/mod/scorm/datamodels/scorm_datamodels.js'); + } + + $url = new moodle_url('/mod/scorm/player.php?a='.$scorm->id.'¤torg='.$currentorg.$modestr); + $result->tocmenu = $OUTPUT->single_select($url, 'scoid', $tocmenus, $sco->id, null, "tocmenu"); + + return $result; +} \ No newline at end of file