$connector = ''; $version = substr($scorm->version, 0, 4); if ((isset($sco->parameters) && (!empty($sco->parameters))) || ($version == 'AICC')) { if (stripos($sco->launch, '?') !== false) { $connector = '&'; } else { $connector = '?'; } if ((isset($sco->parameters) && (!empty($sco->parameters))) && ($sco->parameters[0] == '?')) { $sco->parameters = substr($sco->parameters, 1); } } if ($version == 'AICC') { require_once("$CFG->dirroot/mod/scorm/datamodels/aicclib.php"); $aicc_sid = scorm_aicc_get_hacp_session($scorm->id); if (empty($aicc_sid)) { $aicc_sid = sesskey(); } $sco_params = ''; if (isset($sco->parameters) && (!empty($sco->parameters))) { $sco_params = '&'. $sco->parameters; } $launcher = $sco->launch.$connector.'aicc_sid='.$aicc_sid.'&aicc_url='.$CFG->wwwroot.'/mod/scorm/aicc.php'.$sco_params; } else { if (isset($sco->parameters) && (!empty($sco->parameters))) { $launcher = $sco->launch.$connector.$sco->parameters; } else { $launcher = $sco->launch; } }
/** * Return a SCO object and the SCO launch URL * * @param stdClass $scorm SCORM object * @param int $scoid The SCO id in database * @param stdClass $context context object * @return array the SCO object and URL * @since Moodle 3.1 */ function scorm_get_sco_and_launch_url($scorm, $scoid, $context) { global $CFG, $DB; if (!empty($scoid)) { // Direct SCO request. if ($sco = scorm_get_sco($scoid)) { if ($sco->launch == '') { // Search for the next launchable sco. if ($scoes = $DB->get_records_select( 'scorm_scoes', 'scorm = ? AND '.$DB->sql_isnotempty('scorm_scoes', 'launch', false, true).' AND id > ?', array($scorm->id, $sco->id), 'sortorder, id')) { $sco = current($scoes); } } } } // If no sco was found get the first of SCORM package. if (!isset($sco)) { $scoes = $DB->get_records_select( 'scorm_scoes', 'scorm = ? AND '.$DB->sql_isnotempty('scorm_scoes', 'launch', false, true), array($scorm->id), 'sortorder, id' ); $sco = current($scoes); } $connector = ''; $version = substr($scorm->version, 0, 4); if ((isset($sco->parameters) && (!empty($sco->parameters))) || ($version == 'AICC')) { if (stripos($sco->launch, '?') !== false) { $connector = '&'; } else { $connector = '?'; } if ((isset($sco->parameters) && (!empty($sco->parameters))) && ($sco->parameters[0] == '?')) { $sco->parameters = substr($sco->parameters, 1); } } if ($version == 'AICC') { require_once("$CFG->dirroot/mod/scorm/datamodels/aicclib.php"); $aiccsid = scorm_aicc_get_hacp_session($scorm->id); if (empty($aiccsid)) { $aiccsid = sesskey(); } $scoparams = ''; if (isset($sco->parameters) && (!empty($sco->parameters))) { $scoparams = '&'. $sco->parameters; } $launcher = $sco->launch.$connector.'aicc_sid='.$aiccsid.'&aicc_url='.$CFG->wwwroot.'/mod/scorm/aicc.php'.$scoparams; } else { if (isset($sco->parameters) && (!empty($sco->parameters))) { $launcher = $sco->launch.$connector.$sco->parameters; } else { $launcher = $sco->launch; } } if (scorm_external_link($sco->launch)) { // TODO: does this happen? $scolaunchurl = $launcher; } else if ($scorm->scormtype === SCORM_TYPE_EXTERNAL) { // Remote learning activity. $scolaunchurl = dirname($scorm->reference).'/'.$launcher; } else if ($scorm->scormtype === SCORM_TYPE_LOCAL && strtolower($scorm->reference) == 'imsmanifest.xml') { // This SCORM content sits in a repository that allows relative links. $scolaunchurl = "$CFG->wwwroot/pluginfile.php/$context->id/mod_scorm/imsmanifest/$scorm->revision/$launcher"; } else if ($scorm->scormtype === SCORM_TYPE_LOCAL or $scorm->scormtype === SCORM_TYPE_LOCALSYNC) { // Note: do not convert this to use moodle_url(). // SCORM does not work without slasharguments and moodle_url() encodes querystring vars. $scolaunchurl = "$CFG->wwwroot/pluginfile.php/$context->id/mod_scorm/content/$scorm->revision/$launcher"; } return array($sco, $scolaunchurl); }