moodle/backup/restore_form.html

575 lines
26 KiB
HTML

<?php
//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', PARAM_INT);
//file
$file = required_param('file', PARAM_PATH);
//Check login
require_login();
$loginurl = get_login_url();
//Init restoreuserinfo
$restoreuserinfo = false;
//Check admin
if (!empty($id)) {
if (!has_capability('moodle/restore:restorecourse', get_context_instance(CONTEXT_COURSE, $id))) {
print_error('cannotuseadminadminorteacher', '', $loginurl);
}
$restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_COURSE, $id));
} else {
if (!has_capability('moodle/restore:restorecourse', get_context_instance(CONTEXT_SYSTEM))) {
print_error('cannotuseadmin', '', $loginurl);
}
$restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_SYSTEM));
}
//Check site
$site = get_site();
//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) && $restoreuserinfo) {
$$var = 1;
} else {
$$var = 0;
}
}
}
if (!isset($restore_users)) {
$restore_users = 1;
}
if (!isset($restore_groups)) {
$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
//TODO: use better function which includes all courses for admins
$mycourses = get_user_courses_bycap($USER->id, 'moodle/restore:restorecourse');
// if the user can restore to current course, grant the "current" options
if (has_capability('moodle/restore:restorecourse', 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 = '';
echo html_writer::select($restore_restoreto_options, "restore_restoreto", $restore_restoreto, false);
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;
}
}
echo html_writer::select($categories, 'restore_restorecatto', $category_default, false);
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")."\" />" ;
echo $OUTPUT->help_icon('shortnamecourse'));
if (isset($err["shortname"])) echo $OUTPUT->error_text($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")."\" />" ;
echo $OUTPUT->help_icon('fullnamecourse');
if (isset($err["fullname"])) echo $OUTPUT->error_text($err["fullname"]);
echo"</td></tr>";
} 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 "<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) {
$dayselector = html_writer::select_time('days', "startday", $form1->startdate);
$monthselector = html_writer::select_time('months', "startmonth", $form1->startdate);
$yearselector = html_writer::select_time('years', "startyear", $form1->startdate);
echo $dayselector . $monthselector . $yearselector;
echo $OUTPUT->help_icon('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 lacks the moodle/restore:rolldates completely, prevent any change in startyear/month/day (so restore won't perform any roll)
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>";
if ($restoreuserinfo) {
echo "<td align=\"right\">";
echo '<b>&nbsp;</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>";
} else {
echo "<td colspan=\"2\">&nbsp;</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\">&nbsp;";
echo "</td><td>";
$restore_options[1] = get_string("yes");
$restore_options[0] = get_string("no");
//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\">&nbsp;";
echo "</td><td>";
if ($info->mods[$modname]->userinfo == "true" && $restoreuserinfo) {
$restore_user_options[1] = get_string("yes");
$restore_user_options[0] = get_string("no");
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, PARAM_CLEAN);
print_checkbox($var,$$var,$$var,$instance->name,$instance->name,'this.form.elements[\'restore_'.$modname.'\'].checked=1;');
echo '</td><td align="right">&nbsp;';
$var = 'restore_user_info_'.$modname.'_instance_'.$instance->id;
$$var = optional_param($var,1, PARAM_CLEAN);
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 '<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 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") and $restoreuserinfo) {
$user_options = array();
//If all users are in the backup file and user has 'moodle/restore:restorecourse' at system level
if ($info->backup_users == "all" and has_capability('moodle/restore:restorecourse', get_context_instance(CONTEXT_SYSTEM))) {
$user_options[0] = get_string("all");
}
$user_options[1] = get_string("course");
$user_options[2] = get_string("none");
echo html_writer::select($user_options, "restore_users", $restore_users, false);
} 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>";
echo '<label for="menurestore_groups">'.get_string ("groups").'</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.
echo html_writer::select($group_options, 'restore_groups', $restore_groups, false);
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" and $restoreuserinfo) {
$log_options = array();
$log_options[0] = get_string("no");
$log_options[1] = get_string("yes");
echo html_writer::select($log_options, "restore_logs", $restore_logs, false);
} 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" and $restoreuserinfo) {
$user_file_options = array();
$user_file_options[0] = get_string("no");
$user_file_options[1] = get_string("yes");
echo html_writer::select($user_file_options, "restore_user_files", $restore_user_files, false);
} 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");
echo html_writer::select($course_file_options, "restore_course_files", $restore_course_files, false);
} 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");
echo html_writer::select($site_file_options, "restore_site_files", $restore_site_files, false);
} 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) and $restoreuserinfo) {
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");
echo html_writer::select($gradebook_history_options, "restore_gradebook_history", $restore_gradebook_history, false);
} 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) and $restoreuserinfo) {
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");
echo html_writer::select($message_options, "restore_messages", $restore_messages, false);
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) and $restoreuserinfo) {
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");
echo html_writer::select($blog_options, "restore_blogs", $restore_blogs, false);
echo "</td></tr>";
} else {
$hidden_options .= '<input type="hidden" name="restore_blogs" value="0" />';
}
}
?>
</table>