Commit | Line | Data |
---|---|---|
a4813c36 | 1 | <?php |
f7b5c6aa DM |
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 | ||
bfebaf64 MD |
17 | if (!defined('MOODLE_INTERNAL')) { |
18 | die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page | |
19 | } | |
20 | ||
ca4eda13 | 21 | require_once($CFG->dirroot.'/course/moodleform_mod.php'); |
a4813c36 | 22 | require_once($CFG->dirroot.'/mod/scorm/locallib.php'); |
23 | ||
24 | class mod_scorm_mod_form extends moodleform_mod { | |
25 | ||
26 | function definition() { | |
6aff538a | 27 | global $CFG, $COURSE, $OUTPUT; |
30fc6e2d | 28 | $cfg_scorm = get_config('scorm'); |
a4813c36 | 29 | |
9528568b | 30 | $mform = $this->_form; |
31 | ||
9528568b | 32 | if (!$CFG->slasharguments) { |
ca4eda13 | 33 | $mform->addElement('static', '', '', $OUTPUT->notification(get_string('slashargs', 'scorm'), 'notifyproblem')); |
01e6c030 | 34 | } |
ca4eda13 | 35 | //------------------------------------------------------------------------------- |
a4813c36 | 36 | $mform->addElement('header', 'general', get_string('general', 'form')); |
37 | ||
ca4eda13 | 38 | // Name |
a4813c36 | 39 | $mform->addElement('text', 'name', get_string('name')); |
8eb1d25f | 40 | if (!empty($CFG->formatstringstriptags)) { |
41 | $mform->setType('name', PARAM_TEXT); | |
42 | } else { | |
b8ea3041 | 43 | $mform->setType('name', PARAM_CLEANHTML); |
8eb1d25f | 44 | } |
a4813c36 | 45 | $mform->addRule('name', null, 'required', null, 'client'); |
a74cd331 | 46 | $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); |
a4813c36 | 47 | |
ca4eda13 | 48 | // Summary |
ac3668bf | 49 | $this->add_intro_editor(true); |
a4813c36 | 50 | |
ca4eda13 | 51 | // Scorm types |
8aba9cda | 52 | $scormtypes = array(SCORM_TYPE_LOCAL => get_string('typelocal', 'scorm')); |
9528568b | 53 | |
30fc6e2d | 54 | if ($cfg_scorm->allowtypeexternal) { |
8aba9cda | 55 | $scormtypes[SCORM_TYPE_EXTERNAL] = get_string('typeexternal', 'scorm'); |
9528568b | 56 | } |
57 | ||
30fc6e2d | 58 | if ($cfg_scorm->allowtypelocalsync) { |
8aba9cda | 59 | $scormtypes[SCORM_TYPE_LOCALSYNC] = get_string('typelocalsync', 'scorm'); |
9528568b | 60 | } |
61 | ||
30fc6e2d | 62 | if (!empty($CFG->repositoryactivate) and $cfg_scorm->allowtypeimsrepository) { |
8aba9cda | 63 | $scormtypes[SCORM_TYPE_IMSREPOSITORY] = get_string('typeimsrepository', 'scorm'); |
9528568b | 64 | } |
65 | ||
4388bd45 | 66 | if ($cfg_scorm->allowtypeexternalaicc) { |
8aba9cda | 67 | $scormtypes[SCORM_TYPE_AICCURL] = get_string('typeaiccurl', 'scorm'); |
4388bd45 DM |
68 | } |
69 | ||
ca4eda13 | 70 | // Reference |
8aba9cda DM |
71 | if (count($scormtypes) > 1) { |
72 | $mform->addElement('select', 'scormtype', get_string('scormtype', 'scorm'), $scormtypes); | |
1de23b7f | 73 | $mform->setType('scormtype', PARAM_ALPHA); |
427bcd4d DM |
74 | $mform->addHelpButton('scormtype', 'scormtype', 'scorm'); |
75 | $mform->addElement('text', 'packageurl', get_string('packageurl', 'scorm'), array('size'=>60)); | |
9528568b | 76 | $mform->setType('packageurl', PARAM_RAW); |
427bcd4d | 77 | $mform->addHelpButton('packageurl', 'packageurl', 'scorm'); |
9528568b | 78 | $mform->disabledIf('packageurl', 'scormtype', 'eq', SCORM_TYPE_LOCAL); |
e73d5557 DM |
79 | } else { |
80 | $mform->addElement('hidden', 'scormtype', SCORM_TYPE_LOCAL); | |
1de23b7f | 81 | $mform->setType('scormtype', PARAM_ALPHA); |
9528568b | 82 | } |
83 | ||
ca4eda13 | 84 | // New local package upload |
ca4eda13 | 85 | $mform->addElement('filepicker', 'packagefile', get_string('package', 'scorm')); |
427bcd4d | 86 | $mform->addHelpButton('packagefile', 'package', 'scorm'); |
9528568b | 87 | $mform->disabledIf('packagefile', 'scormtype', 'noteq', SCORM_TYPE_LOCAL); |
a4813c36 | 88 | |
ca4eda13 DM |
89 | $mform->addElement('date_time_selector', 'timeopen', get_string("scormopen", "scorm"), array('optional' => true)); |
90 | $mform->addElement('date_time_selector', 'timeclose', get_string("scormclose", "scorm"), array('optional' => true)); | |
61fbdb0e | 91 | |
0ffaa76b | 92 | // display Settings |
3c0b04c4 | 93 | $mform->addElement('header', 'displaysettings', get_string('displaysettings', 'scorm')); |
0ffaa76b DM |
94 | // Framed / Popup Window |
95 | $mform->addElement('select', 'popup', get_string('display', 'scorm'), scorm_get_popup_display_array()); | |
96 | $mform->setDefault('popup', $cfg_scorm->popup); | |
97 | $mform->setAdvanced('popup', $cfg_scorm->popup_adv); | |
98 | ||
99 | // Width | |
100 | $mform->addElement('text', 'width', get_string('width', 'scorm'), 'maxlength="5" size="5"'); | |
101 | $mform->setDefault('width', $cfg_scorm->framewidth); | |
102 | $mform->setType('width', PARAM_INT); | |
103 | $mform->setAdvanced('width', $cfg_scorm->framewidth_adv); | |
104 | $mform->disabledIf('width', 'popup', 'eq', 0); | |
105 | ||
106 | // Height | |
107 | $mform->addElement('text', 'height', get_string('height', 'scorm'), 'maxlength="5" size="5"'); | |
108 | $mform->setDefault('height', $cfg_scorm->frameheight); | |
109 | $mform->setType('height', PARAM_INT); | |
110 | $mform->setAdvanced('height', $cfg_scorm->frameheight_adv); | |
111 | $mform->disabledIf('height', 'popup', 'eq', 0); | |
112 | ||
113 | // Window Options | |
114 | $winoptgrp = array(); | |
115 | foreach (scorm_get_popup_options_array() as $key => $value) { | |
116 | $winoptgrp[] = &$mform->createElement('checkbox', $key, '', get_string($key, 'scorm')); | |
117 | $mform->setDefault($key, $value); | |
118 | } | |
119 | $mform->addGroup($winoptgrp, 'winoptgrp', get_string('options', 'scorm'), '<br />', false); | |
120 | $mform->disabledIf('winoptgrp', 'popup', 'eq', 0); | |
121 | $mform->setAdvanced('winoptgrp', $cfg_scorm->winoptgrp_adv); | |
122 | ||
123 | // Skip view page | |
bb5cc0e9 DM |
124 | $skipviewoptions = scorm_get_skip_view_array(); |
125 | if ($COURSE->format == 'scorm') { // Remove option that would cause a constant redirect. | |
126 | unset($skipviewoptions[SCORM_SKIPVIEW_ALWAYS]); | |
127 | if ($cfg_scorm->skipview == SCORM_SKIPVIEW_ALWAYS) { | |
128 | $cfg_scorm->skipview = SCORM_SKIPVIEW_FIRST; | |
129 | } | |
130 | } | |
131 | $mform->addElement('select', 'skipview', get_string('skipview', 'scorm'), $skipviewoptions); | |
0ffaa76b DM |
132 | $mform->addHelpButton('skipview', 'skipview', 'scorm'); |
133 | $mform->setDefault('skipview', $cfg_scorm->skipview); | |
134 | $mform->setAdvanced('skipview', $cfg_scorm->skipview_adv); | |
135 | ||
136 | // Hide Browse | |
137 | $mform->addElement('selectyesno', 'hidebrowse', get_string('hidebrowse', 'scorm')); | |
138 | $mform->addHelpButton('hidebrowse', 'hidebrowse', 'scorm'); | |
139 | $mform->setDefault('hidebrowse', $cfg_scorm->hidebrowse); | |
140 | $mform->setAdvanced('hidebrowse', $cfg_scorm->hidebrowse_adv); | |
141 | ||
142 | // Display course structure | |
143 | $mform->addElement('selectyesno', 'displaycoursestructure', get_string('displaycoursestructure', 'scorm')); | |
144 | $mform->addHelpButton('displaycoursestructure', 'displaycoursestructure', 'scorm'); | |
145 | $mform->setDefault('displaycoursestructure', $cfg_scorm->displaycoursestructure); | |
146 | $mform->setAdvanced('displaycoursestructure', $cfg_scorm->displaycoursestructure_adv); | |
147 | ||
148 | // Toc display | |
149 | $mform->addElement('select', 'hidetoc', get_string('hidetoc', 'scorm'), scorm_get_hidetoc_array()); | |
150 | $mform->addHelpButton('hidetoc', 'hidetoc', 'scorm'); | |
151 | $mform->setDefault('hidetoc', $cfg_scorm->hidetoc); | |
152 | $mform->setAdvanced('hidetoc', $cfg_scorm->hidetoc_adv); | |
153 | ||
154 | // Hide Navigation panel | |
155 | $mform->addElement('selectyesno', 'hidenav', get_string('hidenav', 'scorm')); | |
156 | $mform->setDefault('hidenav', $cfg_scorm->hidenav); | |
157 | $mform->setAdvanced('hidenav', $cfg_scorm->hidenav_adv); | |
93e46331 | 158 | $mform->disabledIf('hidenav', 'hidetoc', 'noteq', 0); |
0ffaa76b DM |
159 | |
160 | //------------------------------------------------------------------------------- | |
161 | // grade Settings | |
3c0b04c4 | 162 | $mform->addElement('header', 'gradesettings', get_string('gradesettings', 'scorm')); |
a4813c36 | 163 | |
ca4eda13 | 164 | // Grade Method |
30fc6e2d | 165 | $mform->addElement('select', 'grademethod', get_string('grademethod', 'scorm'), scorm_get_grade_method_array()); |
c329e370 | 166 | $mform->addHelpButton('grademethod', 'grademethod', 'scorm'); |
30fc6e2d | 167 | $mform->setDefault('grademethod', $cfg_scorm->grademethod); |
0ffaa76b | 168 | $mform->setAdvanced('grademethod', $cfg_scorm->grademethod_adv); |
3268cf99 | 169 | |
ca4eda13 | 170 | // Maximum Grade |
a4813c36 | 171 | for ($i=0; $i<=100; $i++) { |
ca4eda13 | 172 | $grades[$i] = "$i"; |
a4813c36 | 173 | } |
174 | $mform->addElement('select', 'maxgrade', get_string('maximumgrade'), $grades); | |
30fc6e2d | 175 | $mform->setDefault('maxgrade', $cfg_scorm->maxgrade); |
ca4eda13 | 176 | $mform->disabledIf('maxgrade', 'grademethod', 'eq', GRADESCOES); |
0ffaa76b | 177 | $mform->setAdvanced('maxgrade', $cfg_scorm->maxgrade_adv); |
a4813c36 | 178 | |
3c0b04c4 | 179 | $mform->addElement('header', 'othersettings', get_string('othersettings', 'scorm')); |
a4813c36 | 180 | |
ca4eda13 | 181 | // Max Attempts |
30fc6e2d | 182 | $mform->addElement('select', 'maxattempt', get_string('maximumattempts', 'scorm'), scorm_get_attempts_array()); |
c329e370 | 183 | $mform->addHelpButton('maxattempt', 'maximumattempts', 'scorm'); |
e0d90c54 DM |
184 | $mform->setDefault('maxattempt', $cfg_scorm->maxattempt); |
185 | $mform->setAdvanced('maxattempt', $cfg_scorm->maxattempt_adv); | |
3268cf99 | 186 | |
ca4eda13 | 187 | // What Grade |
87db13b5 | 188 | $mform->addElement('select', 'whatgrade', get_string('whatgrade', 'scorm'), scorm_get_what_grade_array()); |
ca4eda13 | 189 | $mform->disabledIf('whatgrade', 'maxattempt', 'eq', 1); |
c329e370 | 190 | $mform->addHelpButton('whatgrade', 'whatgrade', 'scorm'); |
87db13b5 | 191 | $mform->setDefault('whatgrade', $cfg_scorm->whatgrade); |
0ffaa76b | 192 | $mform->setAdvanced('whatgrade', $cfg_scorm->whatgrade_adv); |
87db13b5 | 193 | |
ca4eda13 | 194 | // Display attempt status |
da92e3b0 | 195 | $mform->addElement('select', 'displayattemptstatus', get_string('displayattemptstatus', 'scorm'), scorm_get_attemptstatus_array()); |
c329e370 | 196 | $mform->addHelpButton('displayattemptstatus', 'displayattemptstatus', 'scorm'); |
30fc6e2d | 197 | $mform->setDefault('displayattemptstatus', $cfg_scorm->displayattemptstatus); |
0ffaa76b | 198 | $mform->setAdvanced('displayattemptstatus', $cfg_scorm->displayattemptstatus_adv); |
3268cf99 | 199 | |
ca4eda13 | 200 | // Force completed |
6381fa56 | 201 | $mform->addElement('selectyesno', 'forcecompleted', get_string('forcecompleted', 'scorm')); |
c329e370 | 202 | $mform->addHelpButton('forcecompleted', 'forcecompleted', 'scorm'); |
30fc6e2d | 203 | $mform->setDefault('forcecompleted', $cfg_scorm->forcecompleted); |
0ffaa76b | 204 | $mform->setAdvanced('forcecompleted', $cfg_scorm->forcecompleted_adv); |
6381fa56 | 205 | |
ca4eda13 | 206 | // Force new attempt |
6381fa56 | 207 | $mform->addElement('selectyesno', 'forcenewattempt', get_string('forcenewattempt', 'scorm')); |
c329e370 | 208 | $mform->addHelpButton('forcenewattempt', 'forcenewattempt', 'scorm'); |
30fc6e2d | 209 | $mform->setDefault('forcenewattempt', $cfg_scorm->forcenewattempt); |
0ffaa76b | 210 | $mform->setAdvanced('forcenewattempt', $cfg_scorm->forcenewattempt_adv); |
3268cf99 | 211 | |
ca4eda13 | 212 | // Last attempt lock - lock the enter button after the last available attempt has been made |
6381fa56 | 213 | $mform->addElement('selectyesno', 'lastattemptlock', get_string('lastattemptlock', 'scorm')); |
c329e370 | 214 | $mform->addHelpButton('lastattemptlock', 'lastattemptlock', 'scorm'); |
30fc6e2d | 215 | $mform->setDefault('lastattemptlock', $cfg_scorm->lastattemptlock); |
0ffaa76b | 216 | $mform->setAdvanced('lastattemptlock', $cfg_scorm->lastattemptlock_adv); |
3268cf99 | 217 | |
ca4eda13 | 218 | // Autocontinue |
a4813c36 | 219 | $mform->addElement('selectyesno', 'auto', get_string('autocontinue', 'scorm')); |
c329e370 | 220 | $mform->addHelpButton('auto', 'autocontinue', 'scorm'); |
30fc6e2d | 221 | $mform->setDefault('auto', $cfg_scorm->auto); |
0ffaa76b | 222 | $mform->setAdvanced('auto', $cfg_scorm->auto_adv); |
a4813c36 | 223 | |
8aba9cda DM |
224 | if (count($scormtypes) > 1) { |
225 | // Update packages timing | |
226 | $mform->addElement('select', 'updatefreq', get_string('updatefreq', 'scorm'), scorm_get_updatefreq_array()); | |
1de23b7f | 227 | $mform->setType('updatefreq', PARAM_INT); |
8aba9cda DM |
228 | $mform->setDefault('updatefreq', $cfg_scorm->updatefreq); |
229 | $mform->setAdvanced('updatefreq', $cfg_scorm->updatefreq_adv); | |
230 | $mform->addHelpButton('updatefreq', 'updatefreq', 'scorm'); | |
231 | $mform->disabledIf('updatefreq', 'scormtype', 'eq', SCORM_TYPE_LOCAL); | |
232 | } else { | |
233 | $mform->addElement('hidden', 'updatefreq', 0); | |
1de23b7f | 234 | $mform->setType('updatefreq', PARAM_INT); |
8aba9cda | 235 | } |
ca4eda13 DM |
236 | //------------------------------------------------------------------------------- |
237 | // Hidden Settings | |
a4813c36 | 238 | $mform->addElement('hidden', 'datadir', null); |
d18e0fe6 | 239 | $mform->setType('datadir', PARAM_RAW); |
a4813c36 | 240 | $mform->addElement('hidden', 'pkgtype', null); |
d18e0fe6 | 241 | $mform->setType('pkgtype', PARAM_RAW); |
a4813c36 | 242 | $mform->addElement('hidden', 'launch', null); |
d18e0fe6 | 243 | $mform->setType('launch', PARAM_RAW); |
a4813c36 | 244 | $mform->addElement('hidden', 'redirect', null); |
d18e0fe6 | 245 | $mform->setType('redirect', PARAM_RAW); |
a4813c36 | 246 | $mform->addElement('hidden', 'redirecturl', null); |
d18e0fe6 | 247 | $mform->setType('redirecturl', PARAM_RAW); |
a4813c36 | 248 | |
ca4eda13 | 249 | //------------------------------------------------------------------------------- |
42f103be | 250 | $this->standard_coursemodule_elements(); |
ca4eda13 | 251 | //------------------------------------------------------------------------------- |
a4813c36 | 252 | // buttons |
253 | $this->add_action_buttons(); | |
a4813c36 | 254 | } |
255 | ||
728d0599 | 256 | function data_preprocessing(&$default_values) { |
a4813c36 | 257 | global $COURSE; |
258 | ||
259 | if (isset($default_values['popup']) && ($default_values['popup'] == 1) && isset($default_values['options'])) { | |
1adc77e6 | 260 | if (!empty($default_values['options'])) { |
ca4eda13 | 261 | $options = explode(',', $default_values['options']); |
1adc77e6 | 262 | foreach ($options as $option) { |
ca4eda13 | 263 | list($element, $value) = explode('=', $option); |
1adc77e6 | 264 | $element = trim($element); |
265 | $default_values[$element] = trim($value); | |
266 | } | |
a4813c36 | 267 | } |
268 | } | |
269 | if (isset($default_values['grademethod'])) { | |
adefe70e | 270 | $default_values['grademethod'] = intval($default_values['grademethod']); |
a4813c36 | 271 | } |
ca4eda13 | 272 | if (isset($default_values['width']) && (strpos($default_values['width'], '%') === false) && ($default_values['width'] <= 100)) { |
efe95a6f | 273 | $default_values['width'] .= '%'; |
a4813c36 | 274 | } |
ca4eda13 | 275 | if (isset($default_values['width']) && (strpos($default_values['height'], '%') === false) && ($default_values['height'] <= 100)) { |
efe95a6f | 276 | $default_values['height'] .= '%'; |
a4813c36 | 277 | } |
278 | $scorms = get_all_instances_in_course('scorm', $COURSE); | |
279 | $coursescorm = current($scorms); | |
b76f2e60 DC |
280 | |
281 | $draftitemid = file_get_submitted_draft_itemid('packagefile'); | |
783f1486 | 282 | file_prepare_draft_area($draftitemid, $this->context->id, 'mod_scorm', 'package', 0); |
b76f2e60 DC |
283 | $default_values['packagefile'] = $draftitemid; |
284 | ||
a4813c36 | 285 | if (($COURSE->format == 'scorm') && ((count($scorms) == 0) || ($default_values['instance'] == $coursescorm->id))) { |
286 | $default_values['redirect'] = 'yes'; | |
9528568b | 287 | $default_values['redirecturl'] = '../course/view.php?id='.$default_values['course']; |
a4813c36 | 288 | } else { |
289 | $default_values['redirect'] = 'no'; | |
290 | $default_values['redirecturl'] = '../mod/scorm/view.php?id='.$default_values['coursemodule']; | |
291 | } | |
292 | if (isset($default_values['version'])) { | |
ca4eda13 | 293 | $default_values['pkgtype'] = (substr($default_values['version'], 0, 5) == 'SCORM') ? 'scorm':'aicc'; |
a4813c36 | 294 | } |
295 | if (isset($default_values['instance'])) { | |
296 | $default_values['datadir'] = $default_values['instance']; | |
297 | } | |
d54e2145 | 298 | if (empty($default_values['timeopen'])) { |
413900b4 DM |
299 | $default_values['timeopen'] = 0; |
300 | } | |
301 | if (empty($default_values['timeclose'])) { | |
302 | $default_values['timeclose'] = 0; | |
d54e2145 | 303 | } |
94db2749 AB |
304 | |
305 | // Set some completion default data | |
306 | if (!empty($default_values['completionstatusrequired']) && !is_array($default_values['completionstatusrequired'])) { | |
307 | // Unpack values | |
308 | $cvalues = array(); | |
309 | foreach (scorm_status_options() as $key => $value) { | |
310 | if (($default_values['completionstatusrequired'] & $key) == $key) { | |
311 | $cvalues[$key] = 1; | |
312 | } | |
313 | } | |
314 | ||
315 | $default_values['completionstatusrequired'] = $cvalues; | |
316 | } | |
317 | ||
318 | if (!isset($default_values['completionscorerequired']) || !strlen($default_values['completionscorerequired'])) { | |
319 | $default_values['completionscoredisabled'] = 1; | |
320 | } | |
321 | ||
a4813c36 | 322 | } |
323 | ||
a78890d5 | 324 | function validation($data, $files) { |
d3d98a3a | 325 | global $CFG; |
a78890d5 | 326 | $errors = parent::validation($data, $files); |
60243313 | 327 | |
9528568b | 328 | $type = $data['scormtype']; |
329 | ||
330 | if ($type === SCORM_TYPE_LOCAL) { | |
331 | if (!empty($data['update'])) { | |
332 | //ok, not required | |
a679d64d | 333 | |
d3d98a3a | 334 | } else if (empty($data['packagefile'])) { |
9528568b | 335 | $errors['packagefile'] = get_string('required'); |
336 | ||
337 | } else { | |
d3d98a3a DC |
338 | $files = $this->get_draft_files('packagefile'); |
339 | if (count($files)<1) { | |
340 | $errors['packagefile'] = get_string('required'); | |
9eb8dccc | 341 | return $errors; |
d3d98a3a DC |
342 | } |
343 | $file = reset($files); | |
7aa06e6d | 344 | $filename = $CFG->tempdir.'/scormimport/scrom_'.time(); |
af9b1444 | 345 | make_temp_directory('scormimport'); |
d3d98a3a DC |
346 | $file->copy_content_to($filename); |
347 | ||
9528568b | 348 | $packer = get_file_packer('application/zip'); |
349 | ||
d3d98a3a | 350 | $filelist = $packer->list_files($filename); |
9528568b | 351 | if (!is_array($filelist)) { |
352 | $errors['packagefile'] = 'Incorrect file package - not an archive'; //TODO: localise | |
353 | } else { | |
354 | $manifestpresent = false; | |
355 | $aiccfound = false; | |
356 | foreach ($filelist as $info) { | |
357 | if ($info->pathname == 'imsmanifest.xml') { | |
358 | $manifestpresent = true; | |
359 | break; | |
360 | } | |
361 | if (preg_match('/\.cst$/', $info->pathname)) { | |
362 | $aiccfound = true; | |
363 | break; | |
364 | } | |
365 | } | |
366 | if (!$manifestpresent and !$aiccfound) { | |
367 | $errors['packagefile'] = 'Incorrect file package - missing imsmanifest.xml or AICC structure'; //TODO: localise | |
368 | } | |
369 | } | |
d3d98a3a | 370 | unlink($filename); |
9528568b | 371 | } |
372 | ||
373 | } else if ($type === SCORM_TYPE_EXTERNAL) { | |
374 | $reference = $data['packageurl']; | |
f833171f | 375 | // Syntax check. |
9528568b | 376 | if (!preg_match('/(http:\/\/|https:\/\/|www).*\/imsmanifest.xml$/i', $reference)) { |
4388bd45 | 377 | $errors['packageurl'] = get_string('invalidurl', 'scorm'); |
f833171f MS |
378 | } else { |
379 | // Availability check. | |
380 | $result = scorm_check_url($reference); | |
381 | if (is_string($result)) { | |
382 | $errors['packageurl'] = $result; | |
383 | } | |
9528568b | 384 | } |
385 | ||
386 | } else if ($type === 'packageurl') { | |
387 | $reference = $data['reference']; | |
f833171f | 388 | // Syntax check. |
9528568b | 389 | if (!preg_match('/(http:\/\/|https:\/\/|www).*(\.zip|\.pif)$/i', $reference)) { |
4388bd45 | 390 | $errors['packageurl'] = get_string('invalidurl', 'scorm'); |
f833171f MS |
391 | } else { |
392 | // Availability check. | |
393 | $result = scorm_check_url($reference); | |
394 | if (is_string($result)) { | |
395 | $errors['packageurl'] = $result; | |
396 | } | |
9528568b | 397 | } |
398 | ||
399 | } else if ($type === SCORM_TYPE_IMSREPOSITORY) { | |
400 | $reference = $data['packageurl']; | |
401 | if (stripos($reference, '#') !== 0) { | |
4388bd45 DM |
402 | $errors['packageurl'] = get_string('invalidurl', 'scorm'); |
403 | } | |
f833171f | 404 | |
4388bd45 DM |
405 | } else if ($type === SCORM_TYPE_AICCURL) { |
406 | $reference = $data['packageurl']; | |
f833171f | 407 | // Syntax check. |
4388bd45 DM |
408 | if (!preg_match('/(http:\/\/|https:\/\/|www).*/', $reference)) { |
409 | $errors['packageurl'] = get_string('invalidurl', 'scorm'); | |
f833171f MS |
410 | } else { |
411 | // Availability check. | |
412 | $result = scorm_check_url($reference); | |
413 | if (is_string($result)) { | |
414 | $errors['packageurl'] = $result; | |
415 | } | |
9528568b | 416 | } |
f833171f | 417 | |
60243313 | 418 | } |
419 | ||
a78890d5 | 420 | return $errors; |
a679d64d | 421 | } |
9528568b | 422 | |
423 | //need to translate the "options" and "reference" field. | |
ea38a6b9 | 424 | function set_data($default_values) { |
9528568b | 425 | $default_values = (array)$default_values; |
426 | ||
427 | if (isset($default_values['scormtype']) and isset($default_values['reference'])) { | |
428 | switch ($default_values['scormtype']) { | |
429 | case SCORM_TYPE_LOCALSYNC : | |
430 | case SCORM_TYPE_EXTERNAL: | |
431 | case SCORM_TYPE_IMSREPOSITORY: | |
047b4e83 | 432 | case SCORM_TYPE_AICCURL: |
9528568b | 433 | $default_values['packageurl'] = $default_values['reference']; |
434 | } | |
435 | } | |
436 | unset($default_values['reference']); | |
437 | ||
438 | if (!empty($default_values['options'])) { | |
439 | $options = explode(',', $default_values['options']); | |
440 | foreach ($options as $option) { | |
441 | $opt = explode('=', $option); | |
442 | if (isset($opt[1])) { | |
9b426d03 | 443 | $default_values[$opt[0]] = $opt[1]; |
ea38a6b9 | 444 | } |
445 | } | |
ea38a6b9 | 446 | } |
9528568b | 447 | |
ea38a6b9 | 448 | $this->data_preprocessing($default_values); |
9528568b | 449 | parent::set_data($default_values); |
ea38a6b9 | 450 | } |
94db2749 AB |
451 | |
452 | function add_completion_rules() { | |
453 | $mform =& $this->_form; | |
454 | $items = array(); | |
455 | ||
456 | // Require score | |
457 | $group = array(); | |
458 | $group[] =& $mform->createElement('text', 'completionscorerequired', '', array('size' => 5)); | |
459 | $group[] =& $mform->createElement('checkbox', 'completionscoredisabled', null, get_string('disable')); | |
460 | $mform->setType('completionscorerequired', PARAM_INT); | |
461 | $mform->addGroup($group, 'completionscoregroup', get_string('completionscorerequired', 'scorm'), '', false); | |
462 | $mform->addHelpButton('completionscoregroup', 'completionscorerequired', 'scorm'); | |
463 | $mform->disabledIf('completionscorerequired', 'completionscoredisabled', 'checked'); | |
464 | $mform->setDefault('completionscorerequired', 0); | |
465 | ||
466 | $items[] = 'completionscoregroup'; | |
467 | ||
468 | ||
469 | // Require status | |
470 | $first = true; | |
471 | $firstkey = null; | |
472 | foreach (scorm_status_options(true) as $key => $value) { | |
473 | $name = null; | |
474 | $key = 'completionstatusrequired['.$key.']'; | |
475 | if ($first) { | |
476 | $name = get_string('completionstatusrequired', 'scorm'); | |
477 | $first = false; | |
478 | $firstkey = $key; | |
479 | } | |
480 | $mform->addElement('checkbox', $key, $name, $value); | |
481 | $mform->setType($key, PARAM_BOOL); | |
482 | $items[] = $key; | |
483 | } | |
484 | $mform->addHelpButton($firstkey, 'completionstatusrequired', 'scorm'); | |
485 | ||
486 | return $items; | |
487 | } | |
488 | ||
489 | function completion_rule_enabled($data) { | |
490 | $status = !empty($data['completionstatusrequired']); | |
491 | $score = empty($data['completionscoredisabled']) && strlen($data['completionscorerequired']); | |
492 | ||
493 | return $status || $score; | |
494 | } | |
495 | ||
496 | function get_data($slashed = true) { | |
497 | $data = parent::get_data($slashed); | |
498 | ||
499 | if (!$data) { | |
500 | return false; | |
501 | } | |
502 | ||
a9f5fc15 | 503 | if (!empty($data->completionunlocked)) { |
504 | // Turn off completion settings if the checkboxes aren't ticked | |
505 | $autocompletion = isset($data->completion) && $data->completion == COMPLETION_TRACKING_AUTOMATIC; | |
506 | ||
507 | if (isset($data->completionstatusrequired) && | |
508 | is_array($data->completionstatusrequired) && $autocompletion) { | |
509 | $total = 0; | |
510 | foreach (array_keys($data->completionstatusrequired) as $state) { | |
511 | $total |= $state; | |
512 | } | |
94db2749 | 513 | |
a9f5fc15 | 514 | $data->completionstatusrequired = $total; |
515 | } else { | |
516 | $data->completionstatusrequired = null; | |
94db2749 AB |
517 | } |
518 | ||
a9f5fc15 | 519 | if (!empty($data->completionscoredisabled) || !$autocompletion) { |
520 | $data->completionscorerequired = null; | |
521 | } | |
94db2749 AB |
522 | } |
523 | ||
524 | return $data; | |
525 | } | |
a4813c36 | 526 | } |