1df8a94a3d0a310e22a4a6679dd71b6da24561a1
[moodle.git] / mod / scorm / loadSCO.php
1 <?php  // $Id$
2     require_once('../../config.php');
3     require_once('locallib.php');
5     $id = optional_param('id', '', PARAM_INT);       // Course Module ID, or
6     $a = optional_param('a', '', PARAM_INT);         // scorm ID
7     $scoid = required_param('scoid', PARAM_INT);     // sco ID
9     $delayseconds = 2;  // Delay time before sco launch, used to give time to browser to define API
11     if (!empty($id)) {
12         if (! $cm = get_coursemodule_from_id('scorm', $id)) {
13             print_error('invalidcoursemodule');
14         }
15         if (! $course = $DB->get_record('course', array('id'=>$cm->course))) {
16             print_error('coursemisconf');
17         }
18         if (! $scorm = $DB->get_record('scorm', array('id'=>$cm->instance))) {
19             print_error('invalidcoursemodule');
20         }
21     } else if (!empty($a)) {
22         if (! $scorm = $DB->get_record('scorm', array('id'=>$a))) {
23             print_error('coursemisconf');
24         }
25         if (! $course = $DB->get_record('course', array('id'=>$scorm->course))) {
26             print_error('coursemisconf');
27         }
28         if (! $cm = get_coursemodule_from_instance('scorm', $scorm->id, $course->id)) {
29             print_error('invalidcoursemodule');
30         }
31     } else {
32         print_error('missingparameter');
33     }
35     require_login($course->id, false, $cm);
36     if (!empty($scoid)) {
37     //
38     // Direct SCO request
39     //
40         if ($sco = scorm_get_sco($scoid)) {
41             if ($sco->launch == '') {
42                 // Search for the next launchable sco
43                 if ($scoes = $DB->get_records_select('scorm_scoes',"scorm=? AND launch<>'' AND id>?",array($scorm->id, $sco->id), 'id ASC')) {
44                     $sco = current($scoes);
45                 }
46             }
47         }
48     }
49     //
50     // If no sco was found get the first of SCORM package
51     //
52     if (!isset($sco)) {
53         $scoes = $DB->get_records_select('scorm_scoes',"scorm=? AND launch<>''", array($scorm->id),'id ASC');
54         $sco = current($scoes);
55     }
57     if ($sco->scormtype == 'asset') {
58        $attempt = scorm_get_last_attempt($scorm->id,$USER->id);
59        $element = $scorm->version == 'scorm_13'?'cmi.completion_status':'cmi.core.lesson_status';
60        $value = 'completed';
61        $result = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
62     }
63     
64     //
65     // Forge SCO URL
66     //
67     $connector = '';
68     $version = substr($scorm->version,0,4);
69     if ((isset($sco->parameters) && (!empty($sco->parameters))) || ($version == 'AICC')) {
70         if (stripos($sco->launch,'?') !== false) {
71             $connector = '&';
72         } else {
73             $connector = '?';
74         }
75         if ((isset($sco->parameters) && (!empty($sco->parameters))) && ($sco->parameters[0] == '?')) {
76             $sco->parameters = substr($sco->parameters,1);
77         }
78     }
79     
80     if ($version == 'AICC') {
81         if (isset($sco->parameters) && (!empty($sco->parameters))) {
82             $sco->parameters = '&'. $sco->parameters;
83         }
84         $launcher = $sco->launch.$connector.'aicc_sid='.sesskey().'&aicc_url='.$CFG->wwwroot.'/mod/scorm/aicc.php'.$sco->parameters;
85     } else {
86         if (isset($sco->parameters) && (!empty($sco->parameters))) {
87             $launcher = $sco->launch.$connector.$sco->parameters;
88         } else {
89             $launcher = $sco->launch;
90         }
91     }
92     
93     if (scorm_external_link($sco->launch)) {
94         // Remote learning activity
95         $result = $launcher;
96     } else if ($scorm->reference[0] == '#') {
97         // Repository
98         require_once($repositoryconfigfile);
99         $result = $CFG->repositorywebroot.substr($scorm->reference,1).'/'.$sco->launch;
100     } else {
101         if ((basename($scorm->reference) == 'imsmanifest.xml') && scorm_external_link($scorm->reference)) {
102             // Remote manifest
103             $result = dirname($scorm->reference).'/'.$launcher;
104         } else {
105             // Moodle internal package/manifest or remote (auto-imported) package
106             if (basename($scorm->reference) == 'imsmanifest.xml') {
107                 $basedir = dirname($scorm->reference);
108             } else {
109                 $basedir = $CFG->moddata.'/scorm/'.$scorm->id;
110             }
111             require_once($CFG->libdir.'/filelib.php');
112             $result = get_file_url($scorm->course .'/'. $basedir .'/'. $launcher);
113         }
114     }
115 ?>
116 <html>
117     <head>
118         <title>LoadSCO</title>
119         <script type="text/javascript">
120         //<![CDATA[
121             setTimeout('document.location = "<?php echo $result ?>";',<?php echo $delayseconds ?>000);
122         //]]>
123         </script>
124         <noscript>
125             <meta http-equiv="refresh" content="<?php echo $delayseconds ?>;url=<?php echo $result ?>" />
126         </noscript> 
127     </head>
128     <body>
129         &nbsp;
130     </body>
131 </html>