diff --git a/backup/moodle2/backup_hvp_activity_task.class.php b/backup/moodle2/backup_hvp_activity_task.class.php index ccf035c70df19761ed2650bc61f65d2703d94599..cb961f5b52f5b527066c746f7d36d03c5f9892a0 100644 --- a/backup/moodle2/backup_hvp_activity_task.class.php +++ b/backup/moodle2/backup_hvp_activity_task.class.php @@ -25,11 +25,11 @@ defined('MOODLE_INTERNAL') || die(); +require_once($CFG->dirroot . '/backup/moodle2/backup_stepslib.php'); require_once($CFG->dirroot . '/mod/hvp/backup/moodle2/backup_hvp_stepslib.php'); -require_once($CFG->dirroot . '/mod/hvp/backup/moodle2/backup_hvp_settingslib.php'); /** - * Provides the steps to perform one complete backup of the Choice instance + * Provides the steps to perform one complete backup of a H5P instance */ class backup_hvp_activity_task extends backup_activity_task { @@ -40,12 +40,12 @@ class backup_hvp_activity_task extends backup_activity_task { } /** - * Defines a backup step to store the instance data in the choice.xml file + * Defines a backup step to store the instance data in the hvp.xml file */ protected function define_my_steps() { - // $this->add_step(new backup_hvp_activity_structure_step('hvp_structure', 'hvp.xml')); + $this->add_step(new backup_hvp_activity_structure_step('hvp_structure', 'hvp.xml')); } - + /** * Encodes URLs to the index.php and view.php scripts * diff --git a/backup/moodle2/backup_hvp_stepslib.php b/backup/moodle2/backup_hvp_stepslib.php index a02ff4c5ee07102f3189fd038c30d6e5a68724be..30d5ecdbb2b5d18f569a45a65b97a2c38912ca74 100644 --- a/backup/moodle2/backup_hvp_stepslib.php +++ b/backup/moodle2/backup_hvp_stepslib.php @@ -15,68 +15,107 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * @package moodlecore - * @subpackage backup-moodle2 - * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @package mod_hvp + * @copyright 2016 Mediamaisteri Oy {@link http://www.mediamaisteri.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +require_once($CFG->dirroot . '/backup/moodle2/backup_activity_task.class.php'); + /** - * Define all the backup steps that will be used by the backup_choice_activity_task + * Define all the backup steps that will be used by the backup_hvp_activity_task */ /** - * Define the complete choice structure for backup, with file and id annotations + * Define the complete hvp structure for backup, with file and id annotations */ class backup_hvp_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 - $choice = new backup_nested_element('choice', array('id'), array( - 'name', 'intro', 'introformat', 'publish', - 'showresults', 'display', 'allowupdate', 'showunanswered', - 'limitanswers', 'timeopen', 'timeclose', 'timemodified', - 'completionsubmit')); - - $options = new backup_nested_element('options'); - - $option = new backup_nested_element('option', array('id'), array( - 'text', 'maxanswers', 'timemodified')); - - $answers = new backup_nested_element('answers'); - - $answer = new backup_nested_element('answer', array('id'), array( - 'userid', 'optionid', 'timemodified')); + $hvp = new backup_nested_element('hvp', array('id'), array( + 'course', + 'name', + 'json_content', + 'embed_type', + 'disable', + 'main_library_id', + 'content_type', + 'author', + 'license', + 'meta_keywords', + 'meta_description', + 'filtered', + 'slug', + 'timecreated', + 'timemodified', + )); + + $hvp_libraries = new backup_nested_element('libraries'); + $hvp_library = new backup_nested_element('library', null, array( + 'machine_name', + 'major_version', + 'minor_version', + 'patch_version', + 'dependency_type', + 'drop_css', + 'weight', + )); + + $content_user_data_entries = new backup_nested_element('content_user_data'); + $content_user_data = new backup_nested_element('entry', array('id'), array( + 'user_id', + 'hvp_id', + 'sub_content_id', + 'data_id', + 'data', + 'preloaded', + 'delete_on_content_change', + )); // Build the tree - $choice->add_child($options); - $options->add_child($option); + $hvp->add_child($content_user_data_entries); + $content_user_data_entries->add_child($content_user_data); - $choice->add_child($answers); - $answers->add_child($answer); + $hvp->add_child($hvp_libraries); + $hvp_libraries->add_child($hvp_library); // Define sources - $choice->set_source_table('choice', array('id' => backup::VAR_ACTIVITYID)); - - $option->set_source_table('choice_options', array('choiceid' => backup::VAR_PARENTID), 'id ASC'); + $hvp->set_source_table('hvp', array('id' => backup::VAR_ACTIVITYID)); + + $lib_sql = "SELECT + machine_name, + major_version, + minor_version, + patch_version, + dependency_type, + drop_css, + weight + FROM {hvp_libraries} hl + JOIN {hvp_contents_libraries} hcl + ON hl.id = hcl.library_id + JOIN {hvp} h + ON h.id = hcl.hvp_id + WHERE h.id = ?"; + + $hvp_library->set_source_sql($lib_sql, array(backup::VAR_ACTIVITYID)); // All the rest of elements only happen if we are including user info if ($userinfo) { - $answer->set_source_table('choice_answers', array('choiceid' => '../../id')); + $content_user_data->set_source_table('hvp_content_user_data', array('hvp_id' => backup::VAR_PARENTID), 'id ASC'); } // Define id annotations - $answer->annotate_ids('user', 'userid'); + $content_user_data->annotate_ids('user', 'user_id'); // Define file annotations - $choice->annotate_files('mod_choice', 'intro', null); // This file area hasn't itemid + $hvp->annotate_files('mod_hvp', 'content', null); - // Return the root element (choice), wrapped into standard activity structure - return $this->prepare_activity_structure($choice); - */ + // Return the root element (hvp), wrapped into standard activity structure + return $this->prepare_activity_structure($hvp); } } diff --git a/backup/moodle2/restore_hvp_activity_task.class.php b/backup/moodle2/restore_hvp_activity_task.class.php index 16b7f27343f619004b84fe4f69f10cb4f3c49af5..f99315084a919209fe11a40d2bd82423aa5b0bf6 100644 --- a/backup/moodle2/restore_hvp_activity_task.class.php +++ b/backup/moodle2/restore_hvp_activity_task.class.php @@ -15,9 +15,8 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * @package moodlecore - * @subpackage backup-moodle2 - * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @package mod_hvp + * @copyright 2016 Mediamaisteri Oy {@link http://www.mediamaisteri.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -26,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/mod/hvp/backup/moodle2/restore_hvp_stepslib.php'); // Because it exists (must). /** - * choice restore task that provides all the settings and steps to perform one + * hvp restore task that provides all the settings and steps to perform one * complete restore of the activity */ class restore_hvp_activity_task extends restore_activity_task { @@ -42,8 +41,7 @@ class restore_hvp_activity_task extends restore_activity_task { * Define (add) particular steps this activity can have */ protected function define_my_steps() { - // Choice only has one structure step. - // $this->add_step(new restore_choice_activity_structure_step('choice_structure', 'choice.xml')); + $this->add_step(new restore_hvp_activity_structure_step('hvp_structure', 'hvp.xml')); } /** @@ -53,7 +51,7 @@ class restore_hvp_activity_task extends restore_activity_task { static public function define_decode_contents() { $contents = array(); - // $contents[] = new restore_decode_content('choice', array('intro'), 'choice'); + //$contents[] = new restore_decode_content('hvp', array('intro'), 'hvp'); return $contents; } @@ -65,29 +63,30 @@ class restore_hvp_activity_task extends restore_activity_task { static public function define_decode_rules() { $rules = array(); - // $rules[] = new restore_decode_rule('CHOICEVIEWBYID', '/mod/choice/view.php?id=$1', 'course_module'); - // $rules[] = new restore_decode_rule('CHOICEINDEX', '/mod/choice/index.php?id=$1', 'course'); + //$rules[] = new restore_decode_rule('CHOICEVIEWBYID', '/mod/hvp/view.php?id=$1', 'course_module'); + //$rules[] = new restore_decode_rule('CHOICEINDEX', '/mod/hvp/index.php?id=$1', 'course'); return $rules; - } /** * Define the restore log rules that will be applied * by the {@link restore_logs_processor} when restoring - * choice logs. It must return one array + * hvp logs. It must return one array * of {@link restore_log_rule} objects */ static public function define_restore_log_rules() { $rules = array(); + /* - $rules[] = new restore_log_rule('choice', 'add', 'view.php?id={course_module}', '{choice}'); - $rules[] = new restore_log_rule('choice', 'update', 'view.php?id={course_module}', '{choice}'); - $rules[] = new restore_log_rule('choice', 'view', 'view.php?id={course_module}', '{choice}'); - $rules[] = new restore_log_rule('choice', 'choose', 'view.php?id={course_module}', '{choice}'); - $rules[] = new restore_log_rule('choice', 'choose again', 'view.php?id={course_module}', '{choice}'); - $rules[] = new restore_log_rule('choice', 'report', 'report.php?id={course_module}', '{choice}'); + $rules[] = new restore_log_rule('hvp', 'add', 'view.php?id={course_module}', '{hvp}'); + $rules[] = new restore_log_rule('hvp', 'update', 'view.php?id={course_module}', '{hvp}'); + $rules[] = new restore_log_rule('hvp', 'view', 'view.php?id={course_module}', '{hvp}'); + $rules[] = new restore_log_rule('hvp', 'choose', 'view.php?id={course_module}', '{hvp}'); + $rules[] = new restore_log_rule('hvp', 'choose again', 'view.php?id={course_module}', '{hvp}'); + $rules[] = new restore_log_rule('hvp', 'report', 'report.php?id={course_module}', '{hvp}'); */ + return $rules; } @@ -105,10 +104,11 @@ class restore_hvp_activity_task extends restore_activity_task { $rules = array(); /* // Fix old wrong uses (missing extension) - $rules[] = new restore_log_rule('choice', 'view all', 'index?id={course}', null, + $rules[] = new restore_log_rule('hvp', 'view all', 'index?id={course}', null, null, null, 'index.php?id={course}'); - $rules[] = new restore_log_rule('choice', 'view all', 'index.php?id={course}', null); + $rules[] = new restore_log_rule('hvp', 'view all', 'index.php?id={course}', null); */ + return $rules; } } diff --git a/backup/moodle2/restore_hvp_stepslib.php b/backup/moodle2/restore_hvp_stepslib.php index 27a324740c640d0bebf2df6c675d2b7cd22e8da9..5bd2f57aaffc9b33f2fa4c859519020c51ebdf6c 100644 --- a/backup/moodle2/restore_hvp_stepslib.php +++ b/backup/moodle2/restore_hvp_stepslib.php @@ -15,84 +15,107 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * @package moodlecore - * @subpackage backup-moodle2 - * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @package mod_hvp + * @copyright 2016 Mediamaisteri Oy {@link http://www.mediamaisteri.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ /** - * Define all the restore steps that will be used by the restore_choice_activity_task + * Define all the restore steps that will be used by the restore_hvp_activity_task */ /** - * Structure step to restore one choice activity + * Structure step to restore one H5P activity */ class restore_hvp_activity_structure_step extends restore_activity_structure_step { - /* + protected function define_structure() { $paths = array(); $userinfo = $this->get_setting_value('userinfo'); - $paths[] = new restore_path_element('choice', '/activity/choice'); - $paths[] = new restore_path_element('choice_option', '/activity/choice/options/option'); + $paths[] = new restore_path_element('hvp', '/activity/hvp'); + $paths[] = new restore_path_element('library', '/activity/hvp/libraries/library'); + if ($userinfo) { - $paths[] = new restore_path_element('choice_answer', '/activity/choice/answers/answer'); + $paths[] = new restore_path_element('content_user_data', '/activity/hvp/content_user_data/entry'); } // Return the paths wrapped into standard activity structure return $this->prepare_activity_structure($paths); } - protected function process_choice($data) { + protected function process_hvp($data) { global $DB; $data = (object)$data; $oldid = $data->id; $data->course = $this->get_courseid(); - $data->timeopen = $this->apply_date_offset($data->timeopen); - $data->timeclose = $this->apply_date_offset($data->timeclose); + $data->timecreated = $this->apply_date_offset($data->timecreated); $data->timemodified = $this->apply_date_offset($data->timemodified); - // insert the choice record - $newitemid = $DB->insert_record('choice', $data); + // insert the hvp record + $newitemid = $DB->insert_record('hvp', $data); // immediately after inserting "activity" record, call this $this->apply_activity_instance($newitemid); } - protected function process_choice_option($data) { + /** + * Connects the restored H5P content to content libraries + * + * This assumes that the libraries have already been installed + * into the system. + * + * @param array $data Library dependency defitinions of the content + */ + protected function process_library($data) { global $DB; $data = (object)$data; - $oldid = $data->id; - - $data->choiceid = $this->get_new_parentid('choice'); - $data->timemodified = $this->apply_date_offset($data->timemodified); + //$oldid = $data->id; + + // TODO Cache a list of existing libraries somewhere, so we won't + // have to check them multiple times in case restoring more than + // one H5P activity. + $library = $DB->get_record('hvp_libraries', array( + 'machine_name' => $data->machine_name, + 'major_version' => $data->major_version, + 'minor_version' => $data->minor_version, + 'patch_version' => $data->patch_version, + )); + + if (empty($library)) { + // TODO What to do now? It isn't possible to continue restoring + // the activity without the needed libraries. + + print_error("Your system is missing the library {$data->machine_name} version {$data->major_version}.{$data->minor_version}.{$data->patch_version}"); + } - $newitemid = $DB->insert_record('choice_options', $data); - $this->set_mapping('choice_option', $oldid, $newitemid); + $content_library = (object) array( + 'id' => null, + 'hvp_id' => $this->get_new_parentid('hvp'), // From hvp table + 'library_id' => $library->id, // From hvp_libraries table + 'dependency_type' => $data->dependency_type, + 'drop_css' => $data->drop_css, + 'weight' => $data->weight, + ); + + // Note that we're not in fact adding a new library but a connection + // between the restored H5P activity and an existing library. + $newitemid = $DB->insert_record('hvp_contents_libraries', $content_library); + + // TODO + // $this->set_mapping('hvp_todo', $oldid, $newitemid); } - protected function process_choice_answer($data) { - global $DB; - - $data = (object)$data; - - $data->choiceid = $this->get_new_parentid('choice'); - $data->optionid = $this->get_mappingid('choice_option', $data->optionid); - $data->userid = $this->get_mappingid('user', $data->userid); - $data->timemodified = $this->apply_date_offset($data->timemodified); + protected function process_content_user_data($data) { - $newitemid = $DB->insert_record('choice_answers', $data); - // No need to save this mapping as far as nothing depend on it - // (child paths, file areas nor links decoder) } protected function after_execute() { - // Add choice related files, no need to match by itemname (just internally handled context) - $this->add_related_files('mod_choice', 'intro', null); + // TODO + // Add hvp related files, no need to match by itemname (just internally handled context) + $this->add_related_files('mod_hvp', 'content', 'id'); } - */ }