diff --git a/mod/scorm/backup/moodle1/lib.php b/mod/scorm/backup/moodle1/lib.php new file mode 100644 index 00000000000..ce7ca859923 --- /dev/null +++ b/mod/scorm/backup/moodle1/lib.php @@ -0,0 +1,143 @@ +. + +/** + * Provides support for the conversion of moodle1 backup to the moodle2 format + * + * @package mod + * @subpackage scorm + * @copyright 2011 Aparup Banerjee + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Scorm conversion handler + */ +class moodle1_mod_scorm_handler extends moodle1_mod_handler { + + /** + * Declare the paths in moodle.xml we are able to convert + * + * The method returns list of {@link convert_path} instances. + * For each path returned, the corresponding conversion method must be + * defined. + * + * Note that the path /MOODLE_BACKUP/COURSE/MODULES/MOD/SCORM does not + * actually exist in the file. The last element with the module name was + * appended by the moodle1_converter class. + * + * @return array of {@link convert_path} instances + */ + public function get_paths() { + return array( + new convert_path('scorm', '/MOODLE_BACKUP/COURSE/MODULES/MOD/SCORM', + array( + 'newfields' => array( + 'whatgrade' => 0, + 'scormtype' => 'local', + 'sha1hash' => null, + 'revision' => '0', + 'forcecompleted' => 1, + 'forcenewattempt' => 0, + 'lastattemptlock' => 0, + 'displayattemptstatus' => 1, + 'displaycoursestructure' => 1, + 'timeopen' => '0', + 'timeclose' => '0', + 'introformat' => '0', + 'launch' => null, + ), + 'renamefields' => array( + 'summary' => 'intro' + ) + ) + ), + new convert_path('scorm_sco', '/MOODLE_BACKUP/COURSE/MODULES/MOD/SCORM/SCOES/SCO') + ); + } + + /** + * This is executed every time we have one /MOODLE_BACKUP/COURSE/MODULES/MOD/SCORM + * data available + */ + public function process_scorm($data) { + global $CFG; + // get the course module id and context id + $instanceid = $data['id']; + $cminfo = $this->get_cminfo($instanceid); + $moduleid = $cminfo['id']; + $contextid = $this->converter->get_contextid(CONTEXT_MODULE, $moduleid); + + // conditionally migrate to html format in intro + if ($CFG->texteditors !== 'textarea' && $data['introformat'] == FORMAT_MOODLE ) { + $data['intro'] = text_to_html($data['intro'], false, false, true); + $data['introformat'] = FORMAT_HTML; + } + + // check 1.9 version where backup was created + $backupinfo = $this->converter->get_stash('backup_info'); + if ($backupinfo['moodle_version'] < 2007110503) { + // as we have no module version data, assume $currmodule->version <= $module->version + // - fix data as the source 1.9 build hadn't yet at time of backing up. + $data['grademethod'] = $data['grademethod']%10; + } + + // update scormtype (logic is consistent as done in scorm/db/upgrade.php) + $ismanifest = preg_match('/imsmanifest\.xml$/', $data['reference']); + $iszippif = preg_match('/.(zip|pif)$/', $data['reference']); + $isurl = preg_match('/^((http|https):\/\/|www\.)/', $data['reference']); + if ($isurl) { + if ($ismanifest) { + $data['scormtype'] = 'external'; + } else if ($iszippif) { + $data['scormtype'] = 'localtype'; + } + } + // @todo upgrade to new file storage? re: $data['reference'] file + + // we now have all information needed to start writing into the file + $this->open_xml_writer("activities/scorm_{$moduleid}/scorm.xml"); + $this->xmlwriter->begin_tag('activity', array('id' => $instanceid, 'moduleid' => $moduleid, + 'modulename' => 'scorm', 'contextid' => $contextid)); + $this->xmlwriter->begin_tag('scorm', array('id' => $instanceid)); + + unset($data['id']); // we already write it as attribute, do not repeat it as child element + foreach ($data as $field => $value) { + $this->xmlwriter->full_tag($field, $value); + } + $this->xmlwriter->begin_tag('scoes'); + } + /** + * This is executed every time we have one /MOODLE_BACKUP/COURSE/MODULES/MOD/SCORM/SCOES/SCO + * data available + */ + public function process_scorm_sco($data) { + $this->write_xml('sco', $data, array('/sco/id')); + } + + /** + * This is executed when we reach the closing tag of our 'scorm' path + */ + public function on_scorm_end() { + $this->xmlwriter->end_tag('scoes'); + $this->xmlwriter->end_tag('scorm'); + $this->xmlwriter->end_tag('activity'); + $this->close_xml_writer(); + } +} \ No newline at end of file