Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/mod/scorm/mod_form.php
Go to the documentation of this file.
00001 <?php
00002 // This file is part of Moodle - http://moodle.org/
00003 //
00004 // Moodle is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU General Public License as published by
00006 // the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 //
00009 // Moodle is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
00016 
00017 if (!defined('MOODLE_INTERNAL')) {
00018     die('Direct access to this script is forbidden.');    
00019 }
00020 
00021 require_once($CFG->dirroot.'/course/moodleform_mod.php');
00022 require_once($CFG->dirroot.'/mod/scorm/locallib.php');
00023 
00024 class mod_scorm_mod_form extends moodleform_mod {
00025 
00026     function definition() {
00027         global $CFG, $COURSE, $OUTPUT;
00028         $cfg_scorm = get_config('scorm');
00029 
00030         $mform = $this->_form;
00031 
00032         if (!$CFG->slasharguments) {
00033             $mform->addElement('static', '', '', $OUTPUT->notification(get_string('slashargs', 'scorm'), 'notifyproblem'));
00034         }
00035         //-------------------------------------------------------------------------------
00036         $mform->addElement('header', 'general', get_string('general', 'form'));
00037 
00038         // Name
00039         $mform->addElement('text', 'name', get_string('name'));
00040         if (!empty($CFG->formatstringstriptags)) {
00041             $mform->setType('name', PARAM_TEXT);
00042         } else {
00043             $mform->setType('name', PARAM_CLEANHTML);
00044         }
00045         $mform->addRule('name', null, 'required', null, 'client');
00046 
00047         // Summary
00048         $this->add_intro_editor(true);
00049 
00050         // Scorm types
00051         $scormtypes = array(SCORM_TYPE_LOCAL => get_string('typelocal', 'scorm'));
00052 
00053         if ($cfg_scorm->allowtypeexternal) {
00054             $scormtypes[SCORM_TYPE_EXTERNAL] = get_string('typeexternal', 'scorm');
00055         }
00056 
00057         if ($cfg_scorm->allowtypelocalsync) {
00058             $scormtypes[SCORM_TYPE_LOCALSYNC] = get_string('typelocalsync', 'scorm');
00059         }
00060 
00061         if (!empty($CFG->repositoryactivate) and $cfg_scorm->allowtypeimsrepository) {
00062             $scormtypes[SCORM_TYPE_IMSREPOSITORY] = get_string('typeimsrepository', 'scorm');
00063         }
00064 
00065         if ($cfg_scorm->allowtypeexternalaicc) {
00066             $scormtypes[SCORM_TYPE_AICCURL] = get_string('typeaiccurl', 'scorm');
00067         }
00068 
00069         // Reference
00070         if (count($scormtypes) > 1) {
00071             $mform->addElement('select', 'scormtype', get_string('scormtype', 'scorm'), $scormtypes);
00072             $mform->addHelpButton('scormtype', 'scormtype', 'scorm');
00073             $mform->addElement('text', 'packageurl', get_string('packageurl', 'scorm'), array('size'=>60));
00074             $mform->setType('packageurl', PARAM_RAW);
00075             $mform->addHelpButton('packageurl', 'packageurl', 'scorm');
00076             $mform->disabledIf('packageurl', 'scormtype', 'eq', SCORM_TYPE_LOCAL);
00077         } else {
00078             $mform->addElement('hidden', 'scormtype', SCORM_TYPE_LOCAL);
00079         }
00080 
00081         // New local package upload
00082         $maxbytes = get_max_upload_file_size($CFG->maxbytes, $COURSE->maxbytes);
00083         $mform->setMaxFileSize($maxbytes);
00084         $mform->addElement('filepicker', 'packagefile', get_string('package', 'scorm'));
00085         $mform->addHelpButton('packagefile', 'package', 'scorm');
00086         $mform->disabledIf('packagefile', 'scormtype', 'noteq', SCORM_TYPE_LOCAL);
00087 
00088         //-------------------------------------------------------------------------------
00089         // Time restrictions
00090         $mform->addElement('header', 'timerestricthdr', get_string('timerestrict', 'scorm'));
00091 
00092         $mform->addElement('date_time_selector', 'timeopen', get_string("scormopen", "scorm"), array('optional' => true));
00093         $mform->addElement('date_time_selector', 'timeclose', get_string("scormclose", "scorm"), array('optional' => true));
00094         //-------------------------------------------------------------------------------
00095         // display Settings
00096         $mform->addElement('header', 'displaysettings', get_string('displaysettings', 'scorm'));
00097         // Framed / Popup Window
00098         $mform->addElement('select', 'popup', get_string('display', 'scorm'), scorm_get_popup_display_array());
00099         $mform->setDefault('popup', $cfg_scorm->popup);
00100         $mform->setAdvanced('popup', $cfg_scorm->popup_adv);
00101 
00102         // Width
00103         $mform->addElement('text', 'width', get_string('width', 'scorm'), 'maxlength="5" size="5"');
00104         $mform->setDefault('width', $cfg_scorm->framewidth);
00105         $mform->setType('width', PARAM_INT);
00106         $mform->setAdvanced('width', $cfg_scorm->framewidth_adv);
00107         $mform->disabledIf('width', 'popup', 'eq', 0);
00108 
00109         // Height
00110         $mform->addElement('text', 'height', get_string('height', 'scorm'), 'maxlength="5" size="5"');
00111         $mform->setDefault('height', $cfg_scorm->frameheight);
00112         $mform->setType('height', PARAM_INT);
00113         $mform->setAdvanced('height', $cfg_scorm->frameheight_adv);
00114         $mform->disabledIf('height', 'popup', 'eq', 0);
00115 
00116         // Window Options
00117         $winoptgrp = array();
00118         foreach (scorm_get_popup_options_array() as $key => $value) {
00119             $winoptgrp[] = &$mform->createElement('checkbox', $key, '', get_string($key, 'scorm'));
00120             $mform->setDefault($key, $value);
00121         }
00122         $mform->addGroup($winoptgrp, 'winoptgrp', get_string('options', 'scorm'), '<br />', false);
00123         $mform->disabledIf('winoptgrp', 'popup', 'eq', 0);
00124         $mform->setAdvanced('winoptgrp', $cfg_scorm->winoptgrp_adv);
00125 
00126         // Skip view page
00127         $mform->addElement('select', 'skipview', get_string('skipview', 'scorm'), scorm_get_skip_view_array());
00128         $mform->addHelpButton('skipview', 'skipview', 'scorm');
00129         $mform->setDefault('skipview', $cfg_scorm->skipview);
00130         $mform->setAdvanced('skipview', $cfg_scorm->skipview_adv);
00131 
00132         // Hide Browse
00133         $mform->addElement('selectyesno', 'hidebrowse', get_string('hidebrowse', 'scorm'));
00134         $mform->addHelpButton('hidebrowse', 'hidebrowse', 'scorm');
00135         $mform->setDefault('hidebrowse', $cfg_scorm->hidebrowse);
00136         $mform->setAdvanced('hidebrowse', $cfg_scorm->hidebrowse_adv);
00137 
00138         // Display course structure
00139         $mform->addElement('selectyesno', 'displaycoursestructure', get_string('displaycoursestructure', 'scorm'));
00140         $mform->addHelpButton('displaycoursestructure', 'displaycoursestructure', 'scorm');
00141         $mform->setDefault('displaycoursestructure', $cfg_scorm->displaycoursestructure);
00142         $mform->setAdvanced('displaycoursestructure', $cfg_scorm->displaycoursestructure_adv);
00143 
00144         // Toc display
00145         $mform->addElement('select', 'hidetoc', get_string('hidetoc', 'scorm'), scorm_get_hidetoc_array());
00146         $mform->addHelpButton('hidetoc', 'hidetoc', 'scorm');
00147         $mform->setDefault('hidetoc', $cfg_scorm->hidetoc);
00148         $mform->setAdvanced('hidetoc', $cfg_scorm->hidetoc_adv);
00149 
00150         // Hide Navigation panel
00151         $mform->addElement('selectyesno', 'hidenav', get_string('hidenav', 'scorm'));
00152         $mform->setDefault('hidenav', $cfg_scorm->hidenav);
00153         $mform->setAdvanced('hidenav', $cfg_scorm->hidenav_adv);
00154         $mform->disabledIf('hidenav', 'hidetoc', 'noteq', 0);
00155 
00156         //-------------------------------------------------------------------------------
00157         // grade Settings
00158         $mform->addElement('header', 'gradesettings', get_string('gradesettings', 'scorm'));
00159 
00160         // Grade Method
00161         $mform->addElement('select', 'grademethod', get_string('grademethod', 'scorm'), scorm_get_grade_method_array());
00162         $mform->addHelpButton('grademethod', 'grademethod', 'scorm');
00163         $mform->setDefault('grademethod', $cfg_scorm->grademethod);
00164         $mform->setAdvanced('grademethod', $cfg_scorm->grademethod_adv);
00165 
00166         // Maximum Grade
00167         for ($i=0; $i<=100; $i++) {
00168             $grades[$i] = "$i";
00169         }
00170         $mform->addElement('select', 'maxgrade', get_string('maximumgrade'), $grades);
00171         $mform->setDefault('maxgrade', $cfg_scorm->maxgrade);
00172         $mform->disabledIf('maxgrade', 'grademethod', 'eq', GRADESCOES);
00173         $mform->setAdvanced('maxgrade', $cfg_scorm->maxgrade_adv);
00174 
00175         $mform->addElement('header', 'othersettings', get_string('othersettings', 'scorm'));
00176 
00177         // Max Attempts
00178         $mform->addElement('select', 'maxattempt', get_string('maximumattempts', 'scorm'), scorm_get_attempts_array());
00179         $mform->addHelpButton('maxattempt', 'maximumattempts', 'scorm');
00180         $mform->setDefault('maxattempt', $cfg_scorm->maxattempts);
00181         $mform->setAdvanced('maxattempt', $cfg_scorm->maxattempts_adv);
00182 
00183         // What Grade
00184         $mform->addElement('select', 'whatgrade', get_string('whatgrade', 'scorm'),  scorm_get_what_grade_array());
00185         $mform->disabledIf('whatgrade', 'maxattempt', 'eq', 1);
00186         $mform->addHelpButton('whatgrade', 'whatgrade', 'scorm');
00187         $mform->setDefault('whatgrade', $cfg_scorm->whatgrade);
00188         $mform->setAdvanced('whatgrade', $cfg_scorm->whatgrade_adv);
00189 
00190         // Display attempt status
00191         $mform->addElement('selectyesno', 'displayattemptstatus', get_string('displayattemptstatus', 'scorm'));
00192         $mform->addHelpButton('displayattemptstatus', 'displayattemptstatus', 'scorm');
00193         $mform->setDefault('displayattemptstatus', $cfg_scorm->displayattemptstatus);
00194         $mform->setAdvanced('displayattemptstatus', $cfg_scorm->displayattemptstatus_adv);
00195 
00196         // Force completed
00197         $mform->addElement('selectyesno', 'forcecompleted', get_string('forcecompleted', 'scorm'));
00198         $mform->addHelpButton('forcecompleted', 'forcecompleted', 'scorm');
00199         $mform->setDefault('forcecompleted', $cfg_scorm->forcecompleted);
00200         $mform->setAdvanced('forcecompleted', $cfg_scorm->forcecompleted_adv);
00201 
00202         // Force new attempt
00203         $mform->addElement('selectyesno', 'forcenewattempt', get_string('forcenewattempt', 'scorm'));
00204         $mform->addHelpButton('forcenewattempt', 'forcenewattempt', 'scorm');
00205         $mform->setDefault('forcenewattempt', $cfg_scorm->forcenewattempt);
00206         $mform->setAdvanced('forcenewattempt', $cfg_scorm->forcenewattempt_adv);
00207 
00208         // Last attempt lock - lock the enter button after the last available attempt has been made
00209         $mform->addElement('selectyesno', 'lastattemptlock', get_string('lastattemptlock', 'scorm'));
00210         $mform->addHelpButton('lastattemptlock', 'lastattemptlock', 'scorm');
00211         $mform->setDefault('lastattemptlock', $cfg_scorm->lastattemptlock);
00212         $mform->setAdvanced('lastattemptlock', $cfg_scorm->lastattemptlock_adv);
00213 
00214         // Activation period
00215 /*        $mform->addElement('static', '', '' ,'<hr />');
00216         $mform->addElement('static', 'activation', get_string('activation','scorm'));
00217         $datestartgrp = array();
00218         $datestartgrp[] = &$mform->createElement('date_time_selector', 'startdate');
00219         $datestartgrp[] = &$mform->createElement('checkbox', 'startdisabled', null, get_string('disable'));
00220         $mform->addGroup($datestartgrp, 'startdategrp', get_string('from'), ' ', false);
00221         $mform->setDefault('startdate', 0);
00222         $mform->setDefault('startdisabled', 1);
00223         $mform->disabledIf('startdategrp', 'startdisabled', 'checked');
00224 
00225         $dateendgrp = array();
00226         $dateendgrp[] = &$mform->createElement('date_time_selector', 'enddate');
00227         $dateendgrp[] = &$mform->createElement('checkbox', 'enddisabled', null, get_string('disable'));
00228         $mform->addGroup($dateendgrp, 'dateendgrp', get_string('to'), ' ', false);
00229         $mform->setDefault('enddate', 0);
00230         $mform->setDefault('enddisabled', 1);
00231         $mform->disabledIf('dateendgrp', 'enddisabled', 'checked');
00232 */
00233 
00234         // Autocontinue
00235         $mform->addElement('selectyesno', 'auto', get_string('autocontinue', 'scorm'));
00236         $mform->addHelpButton('auto', 'autocontinue', 'scorm');
00237         $mform->setDefault('auto', $cfg_scorm->auto);
00238         $mform->setAdvanced('auto', $cfg_scorm->auto_adv);
00239 
00240         if (count($scormtypes) > 1) {
00241             // Update packages timing
00242             $mform->addElement('select', 'updatefreq', get_string('updatefreq', 'scorm'), scorm_get_updatefreq_array());
00243             $mform->setDefault('updatefreq', $cfg_scorm->updatefreq);
00244             $mform->setAdvanced('updatefreq', $cfg_scorm->updatefreq_adv);
00245             $mform->addHelpButton('updatefreq', 'updatefreq', 'scorm');
00246             $mform->disabledIf('updatefreq', 'scormtype', 'eq', SCORM_TYPE_LOCAL);
00247         } else {
00248             $mform->addElement('hidden', 'updatefreq', 0);
00249         }
00250         //-------------------------------------------------------------------------------
00251         // Hidden Settings
00252         $mform->addElement('hidden', 'datadir', null);
00253         $mform->setType('datadir', PARAM_RAW);
00254         $mform->addElement('hidden', 'pkgtype', null);
00255         $mform->setType('pkgtype', PARAM_RAW);
00256         $mform->addElement('hidden', 'launch', null);
00257         $mform->setType('launch', PARAM_RAW);
00258         $mform->addElement('hidden', 'redirect', null);
00259         $mform->setType('redirect', PARAM_RAW);
00260         $mform->addElement('hidden', 'redirecturl', null);
00261         $mform->setType('redirecturl', PARAM_RAW);
00262 
00263         //-------------------------------------------------------------------------------
00264         $this->standard_coursemodule_elements();
00265         //-------------------------------------------------------------------------------
00266         // buttons
00267         $this->add_action_buttons();
00268     }
00269 
00270     function data_preprocessing(&$default_values) {
00271         global $COURSE;
00272 
00273         if (isset($default_values['popup']) && ($default_values['popup'] == 1) && isset($default_values['options'])) {
00274             if (!empty($default_values['options'])) {
00275                 $options = explode(',', $default_values['options']);
00276                 foreach ($options as $option) {
00277                     list($element, $value) = explode('=', $option);
00278                     $element = trim($element);
00279                     $default_values[$element] = trim($value);
00280                 }
00281             }
00282         }
00283         if (isset($default_values['grademethod'])) {
00284             $default_values['grademethod'] = intval($default_values['grademethod']);
00285         }
00286         if (isset($default_values['width']) && (strpos($default_values['width'], '%') === false) && ($default_values['width'] <= 100)) {
00287             $default_values['width'] .= '%';
00288         }
00289         if (isset($default_values['width']) && (strpos($default_values['height'], '%') === false) && ($default_values['height'] <= 100)) {
00290             $default_values['height'] .= '%';
00291         }
00292         $scorms = get_all_instances_in_course('scorm', $COURSE);
00293         $coursescorm = current($scorms);
00294 
00295         $draftitemid = file_get_submitted_draft_itemid('packagefile');
00296         file_prepare_draft_area($draftitemid, $this->context->id, 'mod_scorm', 'package', 0);
00297         $default_values['packagefile'] = $draftitemid;
00298 
00299         if (($COURSE->format == 'scorm') && ((count($scorms) == 0) || ($default_values['instance'] == $coursescorm->id))) {
00300             $default_values['redirect'] = 'yes';
00301             $default_values['redirecturl'] = '../course/view.php?id='.$default_values['course'];
00302         } else {
00303             $default_values['redirect'] = 'no';
00304             $default_values['redirecturl'] = '../mod/scorm/view.php?id='.$default_values['coursemodule'];
00305         }
00306         if (isset($default_values['version'])) {
00307             $default_values['pkgtype'] = (substr($default_values['version'], 0, 5) == 'SCORM') ? 'scorm':'aicc';
00308         }
00309         if (isset($default_values['instance'])) {
00310             $default_values['datadir'] = $default_values['instance'];
00311         }
00312         if (empty($default_values['timeopen'])) {
00313             $default_values['timeopen'] = 0;
00314         }
00315         if (empty($default_values['timeclose'])) {
00316             $default_values['timeclose'] = 0;
00317         }
00318     }
00319 
00320     function validation($data, $files) {
00321         global $CFG;
00322         $errors = parent::validation($data, $files);
00323 
00324         $type = $data['scormtype'];
00325 
00326         if ($type === SCORM_TYPE_LOCAL) {
00327             if (!empty($data['update'])) {
00328                 //ok, not required
00329 
00330             } else if (empty($data['packagefile'])) {
00331                 $errors['packagefile'] = get_string('required');
00332 
00333             } else {
00334                 $files = $this->get_draft_files('packagefile');
00335                 if (count($files)<1) {
00336                     $errors['packagefile'] = get_string('required');
00337                     return $errors;
00338                 }
00339                 $file = reset($files);
00340                 $filename = $CFG->tempdir.'/scormimport/scrom_'.time();
00341                 make_temp_directory('scormimport');
00342                 $file->copy_content_to($filename);
00343 
00344                 $packer = get_file_packer('application/zip');
00345 
00346                 $filelist = $packer->list_files($filename);
00347                 if (!is_array($filelist)) {
00348                     $errors['packagefile'] = 'Incorrect file package - not an archive'; //TODO: localise
00349                 } else {
00350                     $manifestpresent = false;
00351                     $aiccfound       = false;
00352                     foreach ($filelist as $info) {
00353                         if ($info->pathname == 'imsmanifest.xml') {
00354                             $manifestpresent = true;
00355                             break;
00356                         }
00357                         if (preg_match('/\.cst$/', $info->pathname)) {
00358                             $aiccfound = true;
00359                             break;
00360                         }
00361                     }
00362                     if (!$manifestpresent and !$aiccfound) {
00363                         $errors['packagefile'] = 'Incorrect file package - missing imsmanifest.xml or AICC structure'; //TODO: localise
00364                     }
00365                 }
00366                 unlink($filename);
00367             }
00368 
00369         } else if ($type === SCORM_TYPE_EXTERNAL) {
00370             $reference = $data['packageurl'];
00371             if (!preg_match('/(http:\/\/|https:\/\/|www).*\/imsmanifest.xml$/i', $reference)) {
00372                 $errors['packageurl'] = get_string('invalidurl', 'scorm');
00373             }
00374 
00375         } else if ($type === 'packageurl') {
00376             $reference = $data['reference'];
00377             if (!preg_match('/(http:\/\/|https:\/\/|www).*(\.zip|\.pif)$/i', $reference)) {
00378                 $errors['packageurl'] = get_string('invalidurl', 'scorm');
00379             }
00380 
00381         } else if ($type === SCORM_TYPE_IMSREPOSITORY) {
00382             $reference = $data['packageurl'];
00383             if (stripos($reference, '#') !== 0) {
00384                 $errors['packageurl'] = get_string('invalidurl', 'scorm');
00385             }
00386         } else if ($type === SCORM_TYPE_AICCURL) {
00387             $reference = $data['packageurl'];
00388             if (!preg_match('/(http:\/\/|https:\/\/|www).*/', $reference)) {
00389                 $errors['packageurl'] = get_string('invalidurl', 'scorm');
00390             }
00391         }
00392 
00393         return $errors;
00394     }
00395 
00396     //need to translate the "options" and "reference" field.
00397     function set_data($default_values) {
00398         $default_values = (array)$default_values;
00399 
00400         if (isset($default_values['scormtype']) and isset($default_values['reference'])) {
00401             switch ($default_values['scormtype']) {
00402                 case SCORM_TYPE_LOCALSYNC :
00403                 case SCORM_TYPE_EXTERNAL:
00404                 case SCORM_TYPE_IMSREPOSITORY:
00405                 case SCORM_TYPE_AICCURL:
00406                     $default_values['packageurl'] = $default_values['reference'];
00407             }
00408         }
00409         unset($default_values['reference']);
00410 
00411         if (!empty($default_values['options'])) {
00412             $options = explode(',', $default_values['options']);
00413             foreach ($options as $option) {
00414                 $opt = explode('=', $option);
00415                 if (isset($opt[1])) {
00416                     $default_values[$opt[0]] = $opt[1];
00417                 }
00418             }
00419         }
00420 
00421         $this->data_preprocessing($default_values);
00422         parent::set_data($default_values);
00423     }
00424 }
 All Data Structures Namespaces Files Functions Variables Enumerations