<?php //$Id$ //This page prints the restore form to select everything yo want //to restore. Form is dinamically buid, depending of "info" object //that contains the backup contents and depending of every mod //capabilities. global $DB; //Get objects from session if (!($info = $SESSION->info)) { print_error('sessionmissing' ,'debug', '', 'info'); } if (!($course_header = $SESSION->course_header)) { print_error('sessionmissing' ,'debug', '', 'course_header'); } $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(); $loginurl = get_login_url(); //Check admin if (!empty($id)) { if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))) { print_error('cannotuseadminadminorteacher', '', $loginurl); } } else { if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM))) { print_error('cannotuseadmin', '', $loginurl); } } //Check site if (!$site = get_site()) { print_error("siteisnotdefined", 'debug'); } //Checks for the required files/functions to restore every mod $count = 0; if ($allmods = $DB->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)) { $$var = 1; } } } //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!"); } ?> <script type="text/javascript"> <!-- function selectItemInMenuByName(formId, menuName, selectIndex ) { myForm = document.getElementById(formId) for (i=0,n=myForm.elements.length;i<n;i++) { myLen = menuName.length; myName = myForm.elements[i].name; myType = myForm.elements[i].type; if (myName.substring(0,myLen) == menuName && myType == "select-one") { myForm.elements[i].options[selectIndex].selected = true; } } } function selectItemInRadioByName(formId, radioName, selectIndex ) { myForm = document.getElementById(formId) for (i=0,n=myForm.elements.length;i<n;i++) { myLen = radioName.length; myName = myForm.elements[i].name; myType = myForm.elements[i].type; if (myName.substring(0,myLen) == radioName && myType == "radio") { myRadioGroup = myForm.elements[myName]; myRadioGroup[selectIndex].checked = true; } } } function selectItemInCheckboxByName(formId, checkName, checked ) { myForm = document.getElementById(formId) for (i=0,n=myForm.elements.length;i<n;i++) { myLen = checkName.length; myName = myForm.elements[i].name; myType = myForm.elements[i].type; if (myName.substring(0,myLen) == checkName && myType == "checkbox") { myForm.elements[i].checked = checked; } } } --> </script> <form id="form1" method="post" action="restore.php"> <div> <table cellpadding="5" class="boxaligncenter"> <?php //First, course destination //Print the full tr echo "<tr>"; echo "<td align=\"right\"><b>"; echo '<label for="menurestore_restoreto">'.get_string ('restoreto').'</label>'; echo "</b>"; echo "</td><td colspan=\"3\">"; // 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 "</td></tr>"; if ($cancreatecourses) { //display these fields conditionally // find the list of cates user can edit echo "<tr valign=\"top\" >"; echo "<td align=\"right\">"; echo '<label for="menurestore_restorecatto">'.get_string ('category').'</label>'; echo "</td>"; echo "<td>"; // 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 = $DB->get_field('course', 'category', array('id' => $id)); if (!empty($fromcat) && array_key_exists($fromcat, $categories)) { $category_default = $fromcat; } } choose_from_menu($categories, 'restore_restorecatto', $category_default, ""); echo "</td>"; echo "</tr>"; echo "<tr valign=\"top\" >"; echo "<td align=\"right\">"; echo '<label for="shortnamefield">'.get_string ('shortname').'</label>'; echo "</td>"; echo "<td><input type=\"text\" id=\"shortnamefield\" name=\"shortname\" maxlength=\"100\" size=\"20\" value=\"".s($form1->shortname)."\" alt=\"".get_string("shortname")."\" />" ; helpbutton("courseshortname", get_string("shortname")) ; if (isset($err["shortname"])) formerr($err["shortname"]); echo "</td>"; echo "</tr>"; echo "<tr valign=\"top\" >"; echo "<td align=\"right\">"; echo '<label for="fullnamefield">'.get_string ('fullname').'</label>'; echo "</td>"; echo "<td><input type=\"text\" id=\"fullnamefield\" name=\"fullname\" maxlength=\"254\" size=\"50\" value=\"".s($form1->fullname)."\" alt=\" ".get_string("fullname")."\" />" ; helpbutton("coursefullname", get_string("fullname")) ; if (isset($err["fullname"])) formerr($err["fullname"]); echo"</td></tr>"; echo "<tr valign=\"top\"> "; echo "<td align=\"right\"> "; print_string("startdate"); echo "</td><td>"; /// 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 '<input type="hidden" name="startyear" value="0" />'; echo '<input type="hidden" name="startmonth" value="0" />'; echo '<input type="hidden" name="startday" value="0" />'; } echo "</td></tr>"; } else { /// If user cannot create course, prevent any change in startyear/month/day (so restore wont calculate any roll. MDL-12922 echo '<input type="hidden" name="startyear" value="0" />'; echo '<input type="hidden" name="startmonth" value="0" />'; echo '<input type="hidden" name="startday" value="0" />'; } //Line echo "<tr><td colspan=\"4\"><hr /></td></tr>"; //Now, check modules and info and show posibilities if ($allmods = $DB->get_records("modules") ) { //Print option to select/deselect everything with 1 click. echo "<tr>"; echo "<td align=\"right\">"; echo '<b>'.get_string("include")."</b>"; echo "</td><td>"; echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', true);\">". get_string("all")."</a>/"; echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', false);\">". get_string("none")."</a>"; echo "</td>"; echo "<td align=\"right\">"; echo '<b> </b>'; echo "</td><td>"; echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', true);\">". get_string("all")."</a>/"; echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', false);\">". get_string("none")."</a>"; echo "</td>"; echo "</tr>"; echo "<tr><td colspan=\"4\"><hr /></td></tr>"; $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 "<tr class=\"r".$currentrow."\">"; echo "<td align=\"right\"> "; echo "</td><td>"; $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 "</td><td align=\"right\"> "; echo "</td><td>"; if ($info->mods[$modname]->userinfo == "true") { $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 "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />"; } echo "</td></tr>"; if (isset($info->mods[$modname]->instances)) { $instances = $info->mods[$modname]->instances; } if (!empty($instances) && is_array($instances)) { echo '<tr><td></td><td colspan="3"><table class="restore-form-instances">'; foreach ($instances as $instance) { echo '<tr><td>'; $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 '</td><td align="right"> '; $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')) { print_checkbox($var,$$var,$$var,get_string('userdata'),'','this.form.elements[\'restore_user_info_'.$modname.'\'].checked=1;'); } else { echo '<input type="hidden" name="'.$var.'" value="0" />'; } echo '</td></tr>'; } echo '</table></td></tr>'; } } else { //Module isn't restorable $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />"; $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />"; } } else { //Module isn't restorable $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />"; $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />"; } } else { //Module isn't restorable $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />"; $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />"; } $currentrow = ($currentrow + 1) % 2; } //Line echo "<tr><td colspan=\"4\">$nonrestmod<hr /></td></tr>"; //Now print the Metacourse tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_metacourse">'.get_string ("metacourse").'</label>'; echo "</b></td><td colspan=\"2\">"; //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 "<input type=\"hidden\" id=\"menurestore_metacourse\" name=\"restore_metacourse\" value=\"0\" />"; } echo "</td></tr>"; //Now print the Users tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_users">'.get_string ("users").'</label>'; echo "</b></td><td colspan=\"2\">"; //If some user is present in the backup file if ($info->backup_users == "all" or $info->backup_users == "course") { $user_options = array(); //If all users are in the backup file if ($info->backup_users == "all") { $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 "<input type=\"hidden\" id=\"menurestore_users\" name=\"restore_users\" value=\"2\" />"; } echo "</td></tr>"; //Now print the Groups tr (assume there is no $info->backup_groups) echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; $helplink = helpbutton('grouprestore', get_string('groups'), '', true, false, '', true); if (empty($CFG->enablegroupings)) { echo '<label for="menurestore_groups">'.get_string ("groups").'</label>'.$helplink; echo "</b></td><td colspan=\"2\">"; $group_options[RESTORE_GROUPS_NONE] = get_string('no'); $group_options[RESTORE_GROUPS_ONLY] = get_string('yes'); } else { echo '<label for="menurestore_groups">'.get_string ('groupsgroupings', 'group').'</label>'.$helplink; echo "</b></td><td colspan=\"2\">"; $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. } /*else { echo get_string('none'); echo "<input type=\"hidden\" name=\"restore_groups\" value=\"2\" />"; }*/ choose_from_menu($group_options, 'restore_groups', $restore_groups, ''); echo "</td></tr>"; //Now print the Logs tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_logs">'.get_string ("logs").'</label>'; echo "</b></td><td colspan=\"2\">"; //If logs are in the backup file, show menu, else fixed to no if ($info->backup_logs == "true") { $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 "<input type=\"hidden\" id=\"menurestore_logs\" name=\"restore_logs\" value=\"0\" />"; } echo "</td></tr>"; //Now print the User Files tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_user_files">'.get_string ("userfiles").'</label>'; echo "</b></td><td colspan=\"2\">"; //If user files are in the backup file, show menu, else fixed to no if ($info->backup_user_files == "true") { $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 "<input type=\"hidden\" id=\"menurestore_user_files\" name=\"restore_user_files\" value=\"0\" />"; } echo "</td></tr>"; //Now print the Course Files tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_course_files">'.get_string ("coursefiles").'</label>'; echo "</b></td><td colspan=\"2\">"; echo "<input type=\"hidden\" name=\"backup_unique_code\" value=\"$backup_unique_code\" />"; echo "<input type=\"hidden\" name=\"file\" value=\"$file\" />"; //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 "<input type=\"hidden\" id=\"menurestore_course_files\" name=\"restore_course_files\" value=\"0\" />"; } echo "</td></tr>"; //Now print the Site Files tr echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_site_files">'.get_string ("sitefiles").'</label>'; echo "</b></td><td colspan=\"2\">"; //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 "<input type=\"hidden\" id=\"menurestore_site_files\" name=\"restore_site_files\" value=\"0\" />"; } echo "</td></tr>"; // do you want grade histories to be restored? if (empty($CFG->disablegradehistory)) { echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_gradebook_history">'.get_string ('gradebookhistories', 'grades').'</label>'; echo "</b></td><td colspan=\"2\">"; 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 "<input type=\"hidden\" id=\"menurestore_gradebook_history\" name=\"restore_gradebook_history\" value=\"0\" />"; } echo "</td></tr>"; } else { $hidden_options .= '<input type="hidden" name="restore_gradebook_history" value="0" />'; } //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)) { echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_messages">'.get_string ('messages', 'message').'</label>'; echo "</b></td><td colspan=\"2\">"; $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 "</td></tr>"; } else { $hidden_options .= '<input type="hidden" name="restore_messages" value="0" />'; } //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)) { echo "<tr>"; echo "<td align=\"right\" colspan=\"2\"><b>"; echo '<label for="menurestore_blogs">'.get_string ('blogs', 'blog').'</label>'; echo "</b></td><td colspan=\"2\">"; $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 "</td></tr>"; } else { $hidden_options .= '<input type="hidden" name="restore_blogs" value="0" />'; } } ?> </table> <hr /> <?php print_heading(get_string('rolemappings')); $xml_file = $CFG->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), ROLENAME_ORIGINALANDSHORT); $allroles = get_all_roles(); echo ('<table width="100%" class="restore-form-instances">'); echo ('<tr><td align="right" style="width:50%"><b>'.get_string('sourcerole').'</b></td><td align="left" style="width:50%"><b>'.get_string('targetrole').'</b></td></tr>'); if ($info->backup_moodle_version < 2006092801) { // 1.6 and below backup /// Editting teacher echo ('<tr><td align="right">'); echo '<label for="menudefaultteacheredit">'.get_string ('defaultcourseteacher').'</label>'; echo ('</td><td algin="left">'); // 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 ('</td></tr>'); /// Non-editting teacher echo ('<tr><td align="right">'); echo '<label for="menudefaultteacher">'.get_string ('noneditingteacher').'</label>'; print_string('noneditingteacher'); echo ('</td><td algin="left">'); // 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 ('</td></tr>'); /// Student echo ('<tr><td align="right">'); echo '<label for="menudefaultstudent">'.get_string ('defaultcoursestudent').'</label>'; echo ('</td><td algin="left">'); // 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 ('</td></tr>'); } 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 ($roles->roles as $roleid=>$role) { $mappableroles = $siterolesarray; echo ('<tr><td align="right">'); echo '<label for="menuroles_'.$roleid.'">'.format_string($role->name)." (".($role->shortname).")".'</label>'; echo ('</td><td align="left">'); /// 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 => $notused) { if ($siteroleshortname == $allroles[$siteroleid]->shortname) { $matchrole = $siteroleid; break; } } } choose_from_menu ($mappableroles, "roles_".$roleid, $matchrole, 'new role', '', '0'); echo ('</td></tr>'); } } } // end else echo ('</table>'); // end of role mappings table ?> <br /> <div style="text-align:center"> <?php /// Print captured hidden options, now that we have closed the table echo $hidden_options; ?> <input type="hidden" name="id" value="<?php p($id) ?>" /> <input type="hidden" name="launch" value="check" /> <input type="hidden" name="fromform" value="1" /> <input type="submit" value="<?php print_string("continue") ?>" /> <input type="submit" name="cancel" value="<?php print_string("cancel") ?>" /> </div> </div> </form> <?php /** * Look for a role in the database with exactly the same definition as the one in the backup file. * * @param integer $roleid the id that the role in the backup files had on the old server. * @param object $role the rest of the definition of the role from the backup file. */ function restore_samerole($roleid, $rolefromxml) { global $CFG, $DB; // First we try some intelligent guesses, then, if none of those work, we do a more extensive // search. // First guess, try let's use the id if (restore_is_samerole($roleid, $rolefromxml)) { return $DB->get_record('role', array('id'=>$roleid)); } // Second guess, try the shortname $testroleid = $DB->get_field('role', 'id', array('shortname'=>$rolefromxml->shortname)); if ($testroleid && restore_is_samerole($testroleid, $rolefromxml)) { return $DB->get_record('role', array('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 = $DB->get_records_sql( "SELECT roleid FROM {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 $DB->get_record('role', array('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) { global $DB; // Load the role definition from the databse. $rolefromdb = $DB->get_records('role_capabilities', array('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; } ?>