From 02488b86a87e2c07ac39fda7edd1f33b796ff0a2 Mon Sep 17 00:00:00 2001 From: Eloy Lafuente Date: Mon, 3 May 2010 16:33:43 +0000 Subject: [PATCH] MDL-22151 backup - added scorm backup --- .../backup_scorm_activity_task.class.php | 67 ++++++++ .../backup/moodle2/backup_scorm_stepslib.php | 160 ++++++++++++++++++ mod/scorm/lib.php | 3 +- 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 mod/scorm/backup/moodle2/backup_scorm_activity_task.class.php create mode 100644 mod/scorm/backup/moodle2/backup_scorm_stepslib.php diff --git a/mod/scorm/backup/moodle2/backup_scorm_activity_task.class.php b/mod/scorm/backup/moodle2/backup_scorm_activity_task.class.php new file mode 100644 index 00000000000..3cfa348245c --- /dev/null +++ b/mod/scorm/backup/moodle2/backup_scorm_activity_task.class.php @@ -0,0 +1,67 @@ +. + +/** + * @package moodlecore + * @subpackage backup-moodle2 + * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once($CFG->dirroot . '/mod/scorm/backup/moodle2/backup_scorm_stepslib.php'); // Because it exists (must) + +/** + * scorm backup task that provides all the settings and steps to perform one + * complete backup of the activity + */ +class backup_scorm_activity_task extends backup_activity_task { + + /** + * Define (add) particular settings this activity can have + */ + protected function define_my_settings() { + // No particular settings for this activity + } + + /** + * Define (add) particular steps this activity can have + */ + protected function define_my_steps() { + // SCORM only has one structure step + $this->add_step(new backup_scorm_activity_structure_step('scorm_structure', 'scorm.xml')); + } + + /** + * Code the transformations to perform in the activity in + * order to get transportable (encoded) links + */ + static public function encode_content_links($content) { + global $CFG; + + $base = preg_quote($CFG->wwwroot,"/"); + + // Link to the list of scorms + $search="/(".$base."\/mod\/scorm\/index.php\?id\=)([0-9]+)/"; + $content= preg_replace($search, '$@SCORMINDEX*$2@$', $content); + + // Link to scorm view by moduleid + $search="/(".$base."\/mod\/scorm\/view.php\?id\=)([0-9]+)/"; + $content= preg_replace($search, '$@SCORMVIEWBYID*$2@$', $content); + + return $content; + } +} diff --git a/mod/scorm/backup/moodle2/backup_scorm_stepslib.php b/mod/scorm/backup/moodle2/backup_scorm_stepslib.php new file mode 100644 index 00000000000..ada5447cb54 --- /dev/null +++ b/mod/scorm/backup/moodle2/backup_scorm_stepslib.php @@ -0,0 +1,160 @@ +. + +/** + * @package moodlecore + * @subpackage backup-moodle2 + * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Define all the backup steps that will be used by the backup_scorm_activity_task + */ + +/** + * Define the complete scorm structure for backup, with file and id annotations + */ +class backup_scorm_activity_structure_step extends backup_activity_structure_step { + + protected function define_structure() { + + // To know if we are including userinfo + $userinfo = $this->get_setting_value('userinfo'); + + // Define each element separated + $scorm = new backup_nested_element('scorm', array('id'), array( + 'name', 'scormtype', 'reference', 'intro', + 'introformat', 'version', 'maxgrade', 'grademethod', + 'whatgrade', 'maxattempt', 'forcecompleted', 'forcenewattempt', + 'lastattemptlock', 'displayattemptstatus', 'displaycoursestructure', 'updatefreq', + 'sha1hash', 'md5hash', 'revision', 'launch', + 'skipview', 'hidebrowse', 'hidetoc', 'hidenav', + 'auto', 'popup', 'options', 'width', + 'height', 'timeopen', 'timeclose', 'timemodified')); + + $scoes = new backup_nested_element('scoes'); + + $sco = new backup_nested_element('sco', array('id'), array( + 'manifest', 'organization', 'parent', 'identifier', + 'launch', 'scormtype', 'title')); + + $scodatas = new backup_nested_element('sco_datas'); + + $scodata = new backup_nested_element('sco_data', array('id'), array( + 'name', 'value')); + + $seqruleconds = new backup_nested_element('seq_ruleconds'); + + $seqrulecond = new backup_nested_element('seq_rulecond', array('id'), array( + 'conditioncombination', 'ruletype', 'action')); + + $seqrulecondsdatas = new backup_nested_element('seq_rulecond_datas'); + + $seqrulecondsdata = new backup_nested_element('seq_rulecond_data', array('id'), array( + 'refrencedobjective', 'measurethreshold', 'operator', 'cond')); + + $seqrolluprules = new backup_nested_element('seq_rolluprules'); + + $seqrolluprule = new backup_nested_element('seq_rolluprule', array('id'), array( + 'childactivityset', 'minimumcount', 'minimumpercent', 'conditioncombination', + 'action')); + + $seqrollupruleconds = new backup_nested_element('seq_rollupruleconds'); + + $seqrolluprulecond = new backup_nested_element('seq_rolluprulecond', array('id'), array( + 'cond', 'operator')); + + $seqobjectives = new backup_nested_element('seq_objectives'); + + $seqobjective = new backup_nested_element('seq_objective', array('id'), array( + 'primaryobj', 'objectiveid', 'satisfiedbymeasure', 'minnormalizedmeasure')); + + $seqmapinfo = new backup_nested_element('seq_mapinfo'); + + $seqmapinf = new backup_nested_element('seq_mapinf', array('id'), array( + 'targetobjectiveid', 'readsatisfiedstatus', 'readnormalizedmeasure', 'writesatisfiedstatus', + 'writenormalizedmeasure')); + + $scotracks = new backup_nested_element('sco_tracks'); + + $scotrack = new backup_nested_element('sco_track', array('id'), array( + 'userid', 'attempt', 'element', 'value', + 'timemodified')); + + // Build the tree + $scorm->add_child($scoes); + $scoes->add_child($sco); + + $sco->add_child($scodatas); + $scodatas->add_child($scodata); + + $sco->add_child($seqruleconds); + $seqruleconds->add_child($seqrulecond); + + $seqrulecond->add_child($seqrulecondsdatas); + $seqrulecondsdatas->add_child($seqrulecondsdata); + + $sco->add_child($seqrolluprules); + $seqrolluprules->add_child($seqrolluprule); + + $seqrolluprule->add_child($seqrollupruleconds); + $seqrollupruleconds->add_child($seqrolluprulecond); + + $sco->add_child($seqobjectives); + $seqobjectives->add_child($seqobjective); + + $seqobjective->add_child($seqmapinfo); + $seqmapinfo->add_child($seqmapinf); + + $sco->add_child($scotracks); + $scotracks->add_child($scotrack); + + // Define sources + $scorm->set_source_table('scorm', array('id' => backup::VAR_ACTIVITYID)); + + $sco->set_source_table('scorm_scoes', array('scorm' => backup::VAR_PARENTID)); + + $scodata->set_source_table('scorm_scoes_data', array('scoid' => backup::VAR_PARENTID)); + + $seqrulecond->set_source_table('scorm_seq_ruleconds', array('scoid' => backup::VAR_PARENTID)); + + $seqrulecondsdata->set_source_table('scorm_seq_rulecond', array('ruleconditionsid' => backup::VAR_PARENTID)); + + $seqrolluprule->set_source_table('scorm_seq_rolluprule', array('scoid' => backup::VAR_PARENTID)); + + $seqrolluprulecond->set_source_table('scorm_seq_rolluprulecond', array('rollupruleid' => backup::VAR_PARENTID)); + + $seqobjective->set_source_table('scorm_seq_objective', array('scoid' => backup::VAR_PARENTID)); + + $seqmapinf->set_source_table('scorm_seq_mapinfo', array('objectiveid' => backup::VAR_PARENTID)); + + // All the rest of elements only happen if we are including user info + if ($userinfo) { + $scotrack->set_source_table('scorm_scoes_track', array('scoid' => backup::VAR_PARENTID)); + } + + // Define id annotations + $scotrack->annotate_ids('user', 'userid'); + + // Define file annotations + $scorm->annotate_files(array('scorm_intro', 'scorm_content'), null); // This file area hasn't itemid + + // Return the root element (scorm), wrapped into standard activity structure + return $this->prepare_activity_structure($scorm); + } +} diff --git a/mod/scorm/lib.php b/mod/scorm/lib.php index 323ee86d3ec..8659e2c90c2 100755 --- a/mod/scorm/lib.php +++ b/mod/scorm/lib.php @@ -931,6 +931,7 @@ function scorm_supports($feature) { case FEATURE_COMPLETION_TRACKS_VIEWS: return true; case FEATURE_GRADE_HAS_GRADE: return true; case FEATURE_GRADE_OUTCOMES: return true; + case FEATURE_BACKUP_MOODLE2: return true; default: return null; } @@ -954,4 +955,4 @@ function scorm_extend_navigation($navigation, $course, $module, $cm) { * you content. */ $navigation->nodetype = navigation_node::NODETYPE_LEAF; -} \ No newline at end of file +}