info)) { error( 'info object missing from session' ); } if (!($course_header = $SESSION->course_header)) { error( 'course_header object missing from session' ); } $restore_gradebook_history = optional_param('restore_gradebook_history', 0, PARAM_INT); //Check that we have all we need //backup_unique_code $backup_unique_code = required_param( 'backup_unique_code' ); //file $file = required_param( 'file' ); //Check login require_login(); //Init restoreuserinfo $restoreuserinfo = false; //Check admin if (!empty($id)) { if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))) { error("You need to be a teacher or admin user to use this page.", "$CFG->wwwroot/login/index.php"); } $restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_COURSE, $id)); } else { if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM))) { error("You need to be an admin user to use this page.", "$CFG->wwwroot/login/index.php"); } $restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_SYSTEM)); } //Check site if (!$site = get_site()) { error("Site not found!"); } //Checks for the required files/functions to restore every mod $count = 0; if ($allmods = get_records("modules") ) { foreach ($allmods as $mod) { $modname = $mod->name; $modfile = "$CFG->dirroot/mod/$modname/restorelib.php"; $modrestore = $modname."_restore_mods"; if (file_exists($modfile)) { include_once($modfile); if (function_exists($modrestore)) { $var = "exists_".$modname; $$var = true; $count++; } } //Check data //Check module info $var = "restore_".$modname; if (!isset($$var)) { $$var = 1; } //Check include user info $var = "restore_user_info_".$modname; if (!isset($$var) && $restoreuserinfo) { $$var = 1; } else { $$var = 0; } } } //Check other parameters if (!isset($restore_metacourse)) { $restore_metacourse = 1; } if (!isset($restore_users)) { $restore_users = 1; } if (!isset($restore_groups)) { if (empty($CFG->enablegroupings)) { $restore_groups = RESTORE_GROUPS_ONLY; } else { $restore_groups = RESTORE_GROUPS_GROUPINGS; } } if (!isset($restore_logs)) { $restore_logs = 1; } if (!isset($restore_user_files)) { $restore_user_files = 1; } if (!isset($restore_course_files)) { $restore_course_files = 1; } if (!isset($restore_site_files)) { $restore_site_files = 1; } if (!isset($restore_messages)) { $restore_messages = 1; } if (!isset($restore_blogs)) { $restore_blogs = 1; } $cancreatecourses = user_can_create_courses(); if (!isset($restore_restoreto)) { if (!$cancreatecourses) { $restore_restoreto = RESTORETO_CURRENT_ADDING; } else { $restore_restoreto = RESTORETO_NEW_COURSE; } } if (!isset($course_header->category->id)) { $course_header->category->id = 0; } if(!isset($form1->startdate)) { $form1->startdate = $course_header->course_startdate; //$course_header->course_startdate; } if (empty($form1->shortname)) { $form1->shortname = $course_header->course_shortname; //'_shortname'; //$course_header->course_shortname; } if (empty($form1->fullname)) { $form1->fullname = $course_header->course_fullname; // '_fullname'; //$course_header->course_fullname; } if ($count == 0) { notice("No restorable modules are installed!"); } ?>
"; echo ""; if ($cancreatecourses) { //display these fields conditionally // find the list of cates user can edit echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; } else { // nothing to show here if the user cannot create users } // If user can roll dates (in any course is enough for now) show the roll dates option. // Important: The final restore check step will validate, once we know the final category/course // where the restore is happening, if the user is really capable of rolling dates there, noticing // and disabling roll if not allowed. if (restore_user_can_roll_dates()) { echo " "; echo ""; } else { /// If user lacks the moodle/restore:rolldates completely, prevent any change in startyear/month/day (so restore won't perform any roll) echo ''; echo ''; echo ''; } //Line echo ""; //Now, check modules and info and show posibilities if ($allmods = get_records("modules") ) { //Print option to select/deselect everything with 1 click. echo ""; echo ""; if ($restoreuserinfo) { echo ""; } else { echo ""; } echo ""; echo ""; $currentrow = 0; $nonrestmod = ''; foreach ($allmods as $mod) { $modname = $mod->name; $modrestore = $modname."_restore_mods"; //If exists the lib & function $exist = "exists_".$modname; $restore_var = "restore_".$modname; $user_info_var = "restore_user_info_".$modname; if (isset($$exist)) { if ($$exist) { //Now check that we have that module info in the backup file if (isset($info->mods[$modname]) && $info->mods[$modname]->backup == "true") { //Print the full tr echo ""; echo ""; if (isset($info->mods[$modname]->instances)) { $instances = $info->mods[$modname]->instances; } if (!empty($instances) && is_array($instances)) { echo ''; } } else { //Module isn't restorable $nonrestmod .= ""; $nonrestmod .= ""; } } else { //Module isn't restorable $nonrestmod .= ""; $nonrestmod .= ""; } } else { //Module isn't restorable $nonrestmod .= ""; $nonrestmod .= ""; } $currentrow = ($currentrow + 1) % 2; } //Line echo ""; //Now print the Metacourse tr echo ""; echo ""; //Now print the Users tr echo ""; echo ""; //Now print the Groups tr (assume there is no $info->backup_groups) echo ""; echo ""; //Now print the Logs tr echo ""; echo ""; //Now print the User Files tr echo ""; echo ""; //Now print the Course Files tr echo ""; echo ""; //Now print the Site Files tr echo ""; echo ""; // do you want grade histories to be restored? if (empty($CFG->disablegradehistory) and $restoreuserinfo) { echo ""; echo ""; } else { $hidden_options .= ''; } //This tr is slighty different. Everything becomes hidden if //we haven't messages is the backup, to avoid confusions to users. //If messages are in the backup file, show menu, else fixed to no and show nothing //Also, messaging must be enabled in the destination site if (isset($info->backup_messages) && $info->backup_messages == "true" && !empty($CFG->messaging) and $restoreuserinfo) { echo ""; echo ""; } else { $hidden_options .= ''; } //This tr is slighty different. Everything becomes hidden if //we haven't blogs is the backup, to avoid confusions to users. //If blogs are in the backup file, show menu, else fixed to no and show nothing //Also, blogs must be enabled in the destination site if (isset($info->backup_blogs) && $info->backup_blogs == "true" && !empty($CFG->bloglevel) and $restoreuserinfo) { echo ""; echo ""; } else { $hidden_options .= ''; } } ?>
"; echo ''; echo ""; echo ""; // permission should have been checked already // Non-cached - get accessinfo if (isset($USER->access)) { $accessinfo = $USER->access; } else { $accessinfo = get_user_access_sitewide($USER->id); } $mycourses = get_user_courses_bycap($USER->id, 'moodle/site:restore', $accessinfo, true); // if the user can restore to current course, grant the "current" options if (has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))){ $restore_restoreto_options[RESTORETO_CURRENT_DELETING] = get_string("currentcoursedeleting"); $restore_restoreto_options[RESTORETO_CURRENT_ADDING] = get_string("currentcourseadding"); } // if user can create any course, grant the "new course" option if ($cancreatecourses) { $restore_restoreto_options[RESTORETO_NEW_COURSE] = get_string("newcourse"); } // if the user can restore to 2 or more courses (or to just 1 but different from current), grant the "existing" options if (count($mycourses) > 1 || (count($mycourses) == 1 && $mycourses[0]->id != $id)) { $restore_restoreto_options[RESTORETO_EXISTING_DELETING] = get_string("existingcoursedeleting"); $restore_restoreto_options[RESTORETO_EXISTING_ADDING] = get_string("existingcourseadding"); } /// Acummulator for hidden options and proper XHTML output $hidden_options = ''; choose_from_menu($restore_restoreto_options, "restore_restoreto", $restore_restoreto, ""); echo "
"; echo ''; echo ""; // Get the list of categories where the user can create courses make_categories_list($categories, $parents, 'moodle/course:create'); $category_default = null; // Best default 1: restoring in same site, use category of original course if available if (backup_is_same_site($info) && !empty($course_header->category->id) && array_key_exists($course_header->category->id, $categories)) { $category_default = $course_header->category->id; // Best default 2: restore to the category of the course we are restoring from if available } else { $fromcat = get_field('course', 'category', 'id', $id); if (!empty($fromcat) && array_key_exists($fromcat, $categories)) { $category_default = $fromcat; } } choose_from_menu($categories, 'restore_restorecatto', $category_default, ""); echo "
"; echo ''; echo "shortname)."\" alt=\"".get_string("shortname")."\" />" ; helpbutton("courseshortname", get_string("shortname")) ; if (isset($err["shortname"])) formerr($err["shortname"]); echo "
"; echo ''; echo "fullname)."\" alt=\" ".get_string("fullname")."\" />" ; helpbutton("coursefullname", get_string("fullname")) ; if (isset($err["fullname"])) formerr($err["fullname"]); echo"
"; print_string("startdate"); echo ""; /// Show the roll dates option only if the backup course has a start date /// (some formats like main page, social..., haven't it and rolling dates /// from 0 produces crazy dates. MDL-10125 if ($form1->startdate) { print_date_selector("startday", "startmonth", "startyear", $form1->startdate); helpbutton("coursestartdate", get_string("startdate")); } else { print_string('notavailable'); echo ''; echo ''; echo ''; } echo "

"; echo ''.get_string("include").""; echo ""; echo "". get_string("all")."/"; echo "". get_string("none").""; echo ""; echo ' '; echo ""; echo "". get_string("all")."/"; echo "". get_string("none").""; echo " 

 "; echo ""; $restore_options[1] = get_string("yes"); $restore_options[0] = get_string("no"); //choose_from_menu($restore_options, $restore_var, $$restore_var, ""); //choose_from_radio($restore_options, $restore_var, $$restore_var); //Print the checkbox print_checkbox($restore_var, $$restore_var, $$restore_var, get_string("modulenameplural",$modname),'','selectItemInCheckboxByName(\'form1\',\'restore_'.$modname.'\',this.checked)'); //If backup contains user data, then show menu, else fix it to //without user data echo " "; echo ""; if ($info->mods[$modname]->userinfo == "true" && $restoreuserinfo) { $restore_user_options[1] = get_string("yes"); $restore_user_options[0] = get_string("no"); //choose_from_menu($restore_user_options, $user_info_var, $$user_info_var, ""); //choose_from_radio($restore_user_options, $user_info_var, $$user_info_var); print_checkbox($user_info_var, $$user_info_var, $$user_info_var, get_string("userdata"),'','selectItemInCheckboxByName(\'form1\',\'restore_user_info_'.$modname.'\',this.checked)'); } else { //Module haven't userdata echo get_string("withoutuserdata"); echo ""; } echo "
'; foreach ($instances as $instance) { echo ''; } echo '
'; $var = 'restore_'.$modname.'_instance_'.$instance->id; $$var = optional_param($var,1); print_checkbox($var,$$var,$$var,$instance->name,$instance->name,'this.form.elements[\'restore_'.$modname.'\'].checked=1;'); echo ' '; $var = 'restore_user_info_'.$modname.'_instance_'.$instance->id; $$var = optional_param($var,1); if (!empty($info->mods[$modname]->instances) && ($info->mods[$modname]->instances[$instance->id]->userinfo == 'true') && $restoreuserinfo) { print_checkbox($var,$$var,$$var,get_string('userdata'),'','this.form.elements[\'restore_user_info_'.$modname.'\'].checked=1;'); } else { echo ''; } echo '
$nonrestmod
"; echo ''; echo ""; //If metacourse are in the backup file, show menu, else fixed to no if ($info->backup_metacourse == "true") { $metacourse_options = array(); $metacourse_options[0] = get_string("no"); $metacourse_options[1] = get_string("yes"); choose_from_menu($metacourse_options, "restore_metacourse", $restore_metacourse, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; //If some user is present in the backup file if (($info->backup_users == "all" or $info->backup_users == "course") and $restoreuserinfo) { $user_options = array(); //If all users are in the backup file and user has 'moodle/site:restore' at system level if ($info->backup_users == "all" and has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM))) { $user_options[0] = get_string("all"); } $user_options[1] = get_string("course"); $user_options[2] = get_string("none"); choose_from_menu($user_options, "restore_users", $restore_users, ""); } else { echo get_string("none"); echo ""; } echo "
"; $helplink = helpbutton('grouprestore', get_string('groups'), '', true, false, '', true); echo ''.$helplink; echo ""; if (empty($CFG->enablegroupings)) { $group_options[RESTORE_GROUPS_NONE] = get_string('no'); $group_options[RESTORE_GROUPS_ONLY] = get_string('yes'); } else { $group_options[RESTORE_GROUPS_NONE] = get_string('none'); $group_options[RESTORE_GROUPS_ONLY] = get_string('groupsonly', 'group'); $group_options[RESTORE_GROUPINGS_ONLY] = get_string('groupingsonly', 'group'); $group_options[RESTORE_GROUPS_GROUPINGS] = get_string('groupsgroupings', 'group'); //all. } choose_from_menu($group_options, 'restore_groups', $restore_groups, ''); echo "
"; echo ''; echo ""; //If logs are in the backup file, show menu, else fixed to no if ($info->backup_logs == "true" and $restoreuserinfo) { $log_options = array(); $log_options[0] = get_string("no"); $log_options[1] = get_string("yes"); choose_from_menu($log_options, "restore_logs", $restore_logs, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; //If user files are in the backup file, show menu, else fixed to no if ($info->backup_user_files == "true" and $restoreuserinfo) { $user_file_options = array(); $user_file_options[0] = get_string("no"); $user_file_options[1] = get_string("yes"); choose_from_menu($user_file_options, "restore_user_files", $restore_user_files, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; echo ""; echo ""; //If course files are in the backup file, show menu, else fixed to no if ($info->backup_course_files == "true") { $course_file_options = array(); $course_file_options[0] = get_string("no"); $course_file_options[1] = get_string("yes"); choose_from_menu($course_file_options, "restore_course_files", $restore_course_files, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; //If site files are in the backup file, show menu, else fixed to no if (isset($info->backup_site_files) && $info->backup_site_files == "true") { $site_file_options = array(); $site_file_options[0] = get_string("no"); $site_file_options[1] = get_string("yes"); choose_from_menu($site_file_options, "restore_site_files", $restore_site_files, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; if (isset($info->gradebook_histories) && $info->gradebook_histories == "true") { $gradebook_history_options = array(); $gradebook_history_options[0] = get_string("no"); $gradebook_history_options[1] = get_string("yes"); choose_from_menu($gradebook_history_options, "restore_gradebook_history", $restore_gradebook_history, ""); } else { echo get_string("no"); echo ""; } echo "
"; echo ''; echo ""; $message_options = array(); $message_options[0] = get_string("no"); $message_options[1] = get_string("yes"); choose_from_menu($message_options, "restore_messages", $restore_messages, ""); echo "
"; echo ''; echo ""; $blog_options = array(); $blog_options[0] = get_string("no"); $blog_options[1] = get_string("yes"); choose_from_menu($blog_options, "restore_blogs", $restore_blogs, ""); echo "

dataroot."/temp/backup/".$backup_unique_code."/moodle.xml"; $info = restore_read_xml_info($xml_file); // fix for MDL-9068, front page course is just a normal course $siterolesarray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "shortname", ROLENAME_ORIGINAL); $siterolesnamearray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "name", ROLENAME_ORIGINAL); $allroles = get_records('role'); echo (''); echo (''); if ($info->backup_moodle_version < 2006092801) { // 1.6 and below backup /// Editting teacher echo (''); /// Non-editting teacher echo (''); /// Student echo (''); } else { // 1.7 and above backup $roles = restore_read_xml_roles($xml_file); if (!empty($roles->roles)) { // possible to have course with no roles foreach ($siterolesarray as $siteroleid=>$siteroleshortname) { $siteroleschoicearray[$siteroleid] = $siterolesnamearray[$siteroleid]." (". $siterolesarray[$siteroleid].")"; } foreach ($roles->roles as $roleid=>$role) { $mappableroles = $siteroleschoicearray; echo (''); } } } // end else echo ('
'.get_string('sourcerole').''.get_string('targetrole').'
'); echo ''; echo (''); // get the first teacheredit legacy $roles = get_roles_with_capability('moodle/legacy:editingteacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM)); $editteacher = reset($roles); choose_from_menu ($siterolesarray, "defaultteacheredit", $editteacher->id, 'new role', '', '0'); echo ('
'); echo ''; print_string('noneditingteacher'); echo (''); // get the first teacheredit legacy $roles = get_roles_with_capability('moodle/legacy:teacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM)); $teacher = reset($roles); choose_from_menu ($siterolesarray, "defaultteacher", $teacher->id, 'new role', '', '0'); echo ('
'); echo ''; echo (''); // get the first teacheredit legacy $roles = get_roles_with_capability('moodle/legacy:student', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM)); $studentrole = array_shift($roles); choose_from_menu ($siterolesarray, "defaultstudent", $studentrole->id, 'new role', '', '0'); echo ('
'); echo ''; echo (''); /// first, we see if any exact role definition is found /// if found, that is the only option of restoring to if ($samerole = restore_samerole($roleid, $role)) { $matchrole = $samerole->id; // if an exact role is found, it does not matter whether this user can assign this role or not, // this will be presented as a valid option regardless $mappableroles[$samerole->id] = format_string($allroles[$samerole->id]->name)." (". $allroles[$samerole->id]->shortname.")"; } else { // no exact role found, let's try to match shortname // this is useful in situations where basic roles differ slightly in definition $matchrole = 0; foreach ($siterolesarray as $siteroleid=>$siteroleshortname) { if ($siteroleshortname == $role->shortname) { $matchrole = $siteroleid; break; } } } choose_from_menu ($mappableroles, "roles_".$roleid, $matchrole, 'new role', '', '0'); echo ('
'); // end of role mappings table } ?>
" /> " />
shortname); if ($testroleid && restore_is_samerole($testroleid, $rolefromxml)) { return get_record('role', 'id', $testroleid); } // Finally, search all other roles. In orter to speed things up, we exclude the ones we have // already tested, and we only search roles with the same number of capabilities set in their // definition. $extracondition = ''; if ($testroleid) { $extracondition = "AND roleid <> $testroleid"; } $candidateroleids = get_records_sql("SELECT roleid FROM {$CFG->prefix}role_capabilities WHERE roleid <> $roleid $extracondition GROUP BY roleid HAVING COUNT(capability) = ".count($rolefromxml->capabilities)); if (!empty($candidateroleids)) { foreach ($candidateroleids as $testroleid => $notused) { if (restore_is_samerole($testroleid, $rolefromxml)) { return get_record('role', 'id', $testroleid); } } } return false; } /** * Compare a role in the database with one loaded from the backup file, and determine whether * they have identical permissions for each capability. * @param integer $testroleid the id of the role from the database to test against. * @param object $rolefromxml the role definition loaded from the backup file. * @return boolean true if the two roles are identical. */ function restore_is_samerole($testroleid, $rolefromxml) { // Load the role definition from the databse. $rolefromdb = get_records('role_capabilities', 'roleid', $testroleid, '', 'capability,permission'); if (!$rolefromdb) { return false; } // Quick check, do they have the permissions on the same number of capabilities? if (count($rolefromdb) != count($rolefromxml->capabilities)) { return false; } // If they do, check each one. foreach ($rolefromdb as $capability => $permissions) { if (!isset($rolefromxml->capabilities[$capability]) || $permissions->permission != $rolefromxml->capabilities[$capability]->permission) { return false; } } return true; } ?>