$result = 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. $result = "{$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 get_file_url() or moodle_url() // SCORM does not work without slasharguments and moodle_url() encodes querystring vars. $result = "{$CFG->wwwroot}/pluginfile.php/{$context->id}/mod_scorm/content/{$scorm->revision}/{$launcher}"; } } } } // Trigger a Sco launched event. $event = \mod_scorm\event\sco_launched::create(array('objectid' => $sco->id, 'context' => $context, 'other' => array('instanceid' => $scorm->id, 'loadedcontent' => $result))); $event->add_record_snapshot('course_modules', $cm); $event->add_record_snapshot('scorm', $scorm); $event->add_record_snapshot('scorm_scoes', $sco); $event->trigger(); header('Content-Type: text/html; charset=UTF-8'); if ($sco->scormtype == 'asset') { // HTTP 302 Found => Moved Temporarily. header('Location: ' . $result); // Provide a short feedback in case of slow network connection. echo html_writer::start_tag('html'); echo html_writer::tag('body', html_writer::tag('p', get_string('activitypleasewait', 'scorm'))); echo html_writer::end_tag('html'); exit; } // We expect a SCO: select which API are we looking for.
/** Tests for sco launched event. * * There is no api involved so the best we can do is test legacy data and validations by triggering event manually. */ public function test_sco_launched_event() { $this->resetAfterTest(); $event = \mod_scorm\event\sco_launched::create(array('objectid' => 2, 'context' => context_module::instance($this->eventcm->id), 'courseid' => $this->eventcourse->id, 'other' => array('loadedcontent' => 'url_to_content_that_was_laoded.php'))); // Trigger and capture the event. $sink = $this->redirectEvents(); $event->trigger(); $events = $sink->get_events(); $event = reset($events); // Check that the legacy log data is valid. $expected = array($this->eventcourse->id, 'scorm', 'launch', 'view.php?id=' . $this->eventcm->id, 'url_to_content_that_was_laoded.php', $this->eventcm->id); $this->assertEventLegacyLogData($expected, $event); $this->assertEventContextNotUsed($event); // Test validations. $this->setExpectedException('coding_exception'); \mod_scorm\event\sco_launched::create(array('objectid' => $this->eventscorm->id, 'context' => context_module::instance($this->eventcm->id), 'courseid' => $this->eventcourse->id)); $this->fail('Event \\mod_scorm\\event\\sco_launched is not validating "loadedcontent" properly'); }
/** * Trigger the scorm_launched event. * * @param stdClass $scorm scorm object * @param stdClass $sco sco object * @param stdClass $cm course module object * @param stdClass $context context object * @param string $scourl SCO URL * @since Moodle 3.1 */ function scorm_launch_sco($scorm, $sco, $cm, $context, $scourl) { $event = \mod_scorm\event\sco_launched::create(array( 'objectid' => $sco->id, 'context' => $context, 'other' => array('instanceid' => $scorm->id, 'loadedcontent' => $scourl) )); $event->add_record_snapshot('course_modules', $cm); $event->add_record_snapshot('scorm', $scorm); $event->add_record_snapshot('scorm_scoes', $sco); $event->trigger(); }