MDL-21235 more conversion to new select
[moodle.git] / backup / restore_form.html
1 <?php
2     //This page prints the restore form to select everything yo want
3     //to restore. Form is dinamically buid, depending of "info" object
4     //that contains the backup contents and depending of every mod
5     //capabilities.
7     global $DB;
9     //Get objects from session
10     if (!($info = $SESSION->info)) {
11       print_error('sessionmissing' ,'debug', '', 'info');
12     }
13     if (!($course_header = $SESSION->course_header)) {
14       print_error('sessionmissing' ,'debug', '', 'course_header');
15     }
17     $restore_gradebook_history =  optional_param('restore_gradebook_history', 0, PARAM_INT);
19     //Check that we have all we need
20     //backup_unique_code
21     $backup_unique_code = required_param('backup_unique_code', PARAM_INT);
22     //file
23     $file = required_param('file', PARAM_PATH);
25     //Check login
26     require_login();
28     $loginurl = get_login_url();
30     //Init restoreuserinfo
31     $restoreuserinfo = false;
33     //Check admin
34     if (!empty($id)) {
35         if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))) {
36             print_error('cannotuseadminadminorteacher', '', $loginurl);
37         }
38         $restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_COURSE, $id));
39     } else {
40         if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM))) {
41             print_error('cannotuseadmin', '', $loginurl);
42         }
43         $restoreuserinfo = has_capability('moodle/restore:userinfo', get_context_instance(CONTEXT_SYSTEM));
44     }
46     //Check site
47     $site = get_site();
49     //Checks for the required files/functions to restore every mod
50     $count = 0;
51     if ($allmods = $DB->get_records("modules") ) {
52         foreach ($allmods as $mod) {
53             $modname = $mod->name;
54             $modfile = "$CFG->dirroot/mod/$modname/restorelib.php";
55             $modrestore = $modname."_restore_mods";
56             if (file_exists($modfile)) {
57                include_once($modfile);
58                if (function_exists($modrestore)) {
59                    $var = "exists_".$modname;
60                    $$var = true;
61                    $count++;
62                }
63             }
64             //Check data
65             //Check module info
66             $var = "restore_".$modname;
67             if (!isset($$var)) {
68                 $$var = 1;
69             }
70             //Check include user info
71             $var = "restore_user_info_".$modname;
72             if (!isset($$var) && $restoreuserinfo) {
73                 $$var = 1;
74             } else {
75                 $$var = 0;
76             }
77         }
78     }
80     //Check other parameters
81     if (!isset($restore_metacourse)) {
82         $restore_metacourse = 1;
83     }
85     if (!isset($restore_users)) {
86         $restore_users = 1;
87     }
89     if (!isset($restore_groups)) {
90         if (empty($CFG->enablegroupings)) {
91             $restore_groups = RESTORE_GROUPS_ONLY;
92         } else {
93             $restore_groups = RESTORE_GROUPS_GROUPINGS;
94         }
95     }
97     if (!isset($restore_logs)) {
98         $restore_logs = 1;
99     }
101     if (!isset($restore_user_files)) {
102         $restore_user_files = 1;
103     }
105     if (!isset($restore_course_files)) {
106         $restore_course_files = 1;
107     }
109     if (!isset($restore_site_files)) {
110         $restore_site_files = 1;
111     }
113     if (!isset($restore_messages)) {
114         $restore_messages = 1;
115     }
117     if (!isset($restore_blogs)) {
118         $restore_blogs = 1;
119     }
121     $cancreatecourses = user_can_create_courses();
122     if (!isset($restore_restoreto)) {
123         if (!$cancreatecourses) {
124             $restore_restoreto = RESTORETO_CURRENT_ADDING;
125         } else {
126             $restore_restoreto = RESTORETO_NEW_COURSE;
127         }
128     }
130     if (!isset($course_header->category->id)) {
131         $course_header->category->id = 0;
132     }
134     if(!isset($form1->startdate)) {
135         $form1->startdate = $course_header->course_startdate; //$course_header->course_startdate;
136     }
138     if (empty($form1->shortname)) {
139        $form1->shortname = $course_header->course_shortname; //'_shortname'; //$course_header->course_shortname;
140     }
142     if (empty($form1->fullname)) {
143       $form1->fullname = $course_header->course_fullname; // '_fullname';   //$course_header->course_fullname;
144     }
146     if ($count == 0) {
147         notice("No restorable modules are installed!");
148     }
150 ?>
152 <script type="text/javascript">
153 <!--
154 function selectItemInMenuByName(formId, menuName, selectIndex ) {
155     myForm = document.getElementById(formId)
156     for (i=0,n=myForm.elements.length;i<n;i++) {
157         myLen = menuName.length;
158         myName = myForm.elements[i].name;
159         myType = myForm.elements[i].type;
160         if (myName.substring(0,myLen) == menuName && myType == "select-one") {
161             myForm.elements[i].options[selectIndex].selected = true;
162         }
163     }
166 function selectItemInRadioByName(formId, radioName, selectIndex ) {
167     myForm = document.getElementById(formId)
168     for (i=0,n=myForm.elements.length;i<n;i++) {
169         myLen = radioName.length;
170         myName = myForm.elements[i].name;
171         myType = myForm.elements[i].type;
172         if (myName.substring(0,myLen) == radioName && myType == "radio") {
173             myRadioGroup = myForm.elements[myName];
174             myRadioGroup[selectIndex].checked = true;
175         }
176     }
179 function selectItemInCheckboxByName(formId, checkName, checked ) {
180     myForm = document.getElementById(formId)
181     for (i=0,n=myForm.elements.length;i<n;i++) {
182         myLen = checkName.length;
183         myName = myForm.elements[i].name;
184         myType = myForm.elements[i].type;
185         if (myName.substring(0,myLen) == checkName && myType == "checkbox") {
186             myForm.elements[i].checked = checked;
187         }
188     }
190 -->
191 </script>
193 <form id="form1" method="post" action="restore.php">
194 <div>
195 <table cellpadding="5" class="boxaligncenter">
196 <?php
198     //First, course destination
199     //Print the full tr
200     echo "<tr>";
201     echo "<td align=\"right\"><b>";
202     echo '<label for="menurestore_restoreto">'.get_string ('restoreto').'</label>';
203     echo "</b>";
204     echo "</td><td colspan=\"3\">";
206     // permission should have been checked already
208     // Non-cached - get accessinfo
209     if (isset($USER->access)) {
210         $accessinfo = $USER->access;
211     } else {
212         $accessinfo = get_user_access_sitewide($USER->id);
213     }
215     $mycourses = get_user_courses_bycap($USER->id, 'moodle/site:restore', $accessinfo, true);
217     // if the user can restore to current course, grant the "current" options
218     if (has_capability('moodle/site:restore', get_context_instance(CONTEXT_COURSE, $id))){
219         $restore_restoreto_options[RESTORETO_CURRENT_DELETING] = get_string("currentcoursedeleting");
220         $restore_restoreto_options[RESTORETO_CURRENT_ADDING] = get_string("currentcourseadding");
221     }
223     // if user can create any course, grant the "new course" option
224     if ($cancreatecourses) {
225         $restore_restoreto_options[RESTORETO_NEW_COURSE] = get_string("newcourse");
226     }
228     // if the user can restore to 2 or more courses (or to just 1 but different from current), grant the "existing" options
229     if (count($mycourses) > 1 || (count($mycourses) == 1 && $mycourses[0]->id != $id)) {
230         $restore_restoreto_options[RESTORETO_EXISTING_DELETING] = get_string("existingcoursedeleting");
231         $restore_restoreto_options[RESTORETO_EXISTING_ADDING] = get_string("existingcourseadding");
232     }
234 /// Acummulator for hidden options and proper XHTML output
235     $hidden_options = '';
237     echo html_writer::input_select($restore_restoreto_options, "restore_restoreto", $restore_restoreto, false);
238     echo "</td></tr>";
239     if ($cancreatecourses) {  //display these fields conditionally
241         // find the list of cates user can edit
242         echo "<tr valign=\"top\" >";
243         echo "<td align=\"right\">";
244         echo '<label for="menurestore_restorecatto">'.get_string ('category').'</label>';
245         echo "</td>";
246         echo "<td>";
247         // Get the list of categories where the user can create courses
248         make_categories_list($categories, $parents, 'moodle/course:create');
249         $category_default = null;
250         // Best default 1: restoring in same site, use category of original course if available
251         if (backup_is_same_site($info) &&
252             !empty($course_header->category->id) &&
253             array_key_exists($course_header->category->id, $categories)) {
254             $category_default = $course_header->category->id;
255         // Best default 2: restore to the category of the course we are restoring from if available
256         } else {
257             $fromcat = $DB->get_field('course', 'category', array('id' => $id));
258             if (!empty($fromcat) &&
259                 array_key_exists($fromcat, $categories)) {
260                 $category_default = $fromcat;
261             }
262         }
263         echo html_writer::input_select($categories, 'restore_restorecatto', $category_default, false);
264         echo "</td>";
265         echo "</tr>";
267         echo "<tr valign=\"top\" >";
268         echo "<td align=\"right\">";
269         echo '<label for="shortnamefield">'.get_string ('shortname').'</label>';
270         echo "</td>";
271         echo "<td><input type=\"text\" id=\"shortnamefield\" name=\"shortname\" maxlength=\"100\"  size=\"20\" value=\"".s($form1->shortname)."\" alt=\"".get_string("shortname")."\"  />" ;
272         echo $OUTPUT->help_icon("courseshortname", get_string("shortname"));
273         if (isset($err["shortname"])) echo $OUTPUT->error_text($err["shortname"]);
274         echo "</td>";
275         echo "</tr>";
276         echo "<tr valign=\"top\" >";
277         echo "<td align=\"right\">";
278         echo '<label for="fullnamefield">'.get_string ('fullname').'</label>';
279         echo "</td>";
280         echo "<td><input type=\"text\" id=\"fullnamefield\" name=\"fullname\" maxlength=\"254\" size=\"50\" value=\"".s($form1->fullname)."\" alt=\" ".get_string("fullname")."\"  />" ;
281         echo $OUTPUT->help_icon("coursefullname", get_string("fullname"));
282         if (isset($err["fullname"])) echo $OUTPUT->error_text($err["fullname"]);
283         echo"</td></tr>";
284     } else {
285         // nothing to show here if the user cannot create users
286     }
288     // If user can roll dates (in any course is enough for now) show the roll dates option.
289     // Important: The final restore check step will validate, once we know the final category/course
290     // where the restore is happening, if the user is really capable of rolling dates there, noticing
291     // and disabling roll if not allowed.
292     if (restore_user_can_roll_dates()) {
293         echo "<tr valign=\"top\"> ";
294         echo "<td align=\"right\"> ";
295         print_string("startdate");
296         echo "</td><td>";
297     /// Show the roll dates option only if the backup course has a start date
298     /// (some formats like main page, social..., haven't it and rolling dates
299     /// from 0 produces crazy dates. MDL-10125
300         if ($form1->startdate) {
301             $dayselector = html_select::make_time_selector('days', "startday", $form1->startdate);
302             $monthselector = html_select::make_time_selector('months', "startmonth", $form1->startdate);
303             $yearselector = html_select::make_time_selector('years', "startyear", $form1->startdate);
305             echo $OUTPUT->select($dayselector) . $OUTPUT->select($monthselector) . $OUTPUT->select($yearselector);
306             echo $OUTPUT->help_icon("coursestartdate", get_string("startdate"));
307         } else {
308             print_string('notavailable');
309             echo '<input type="hidden" name="startyear" value="0" />';
310             echo '<input type="hidden" name="startmonth" value="0" />';
311             echo '<input type="hidden" name="startday" value="0" />';
312         }
313         echo "</td></tr>";
314     } else {
315     /// If user lacks the moodle/restore:rolldates completely, prevent any change in startyear/month/day (so restore won't perform any roll)
316         echo '<input type="hidden" name="startyear" value="0" />';
317         echo '<input type="hidden" name="startmonth" value="0" />';
318         echo '<input type="hidden" name="startday" value="0" />';
319     }
320     //Line
321     echo "<tr><td colspan=\"4\"><hr /></td></tr>";
322     //Now, check modules and info and show posibilities
323     if ($allmods = $DB->get_records("modules") ) {
324         //Print option to select/deselect everything with 1 click.
325         echo "<tr>";
326         echo "<td align=\"right\">";
327         echo '<b>'.get_string("include")."</b>";
328         echo "</td><td>";
329         echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', true);\">".
330              get_string("all")."</a>/";
331         echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', false);\">".
332              get_string("none")."</a>";
333         echo "</td>";
334         if ($restoreuserinfo) {
335             echo "<td align=\"right\">";
336             echo '<b>&nbsp;</b>';
337             echo "</td><td>";
338             echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', true);\">".
339                  get_string("all")."</a>/";
340             echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', false);\">".
341                  get_string("none")."</a>";
342             echo "</td>";
343         } else {
344             echo "<td colspan=\"2\">&nbsp;</td>";
345         }
346         echo "</tr>";
347         echo "<tr><td colspan=\"4\"><hr /></td></tr>";
348         $currentrow = 0;
349         $nonrestmod = '';
350         foreach ($allmods as $mod) {
351             $modname = $mod->name;
352             $modrestore = $modname."_restore_mods";
353             //If exists the lib & function
354             $exist = "exists_".$modname;
355             $restore_var = "restore_".$modname;
356             $user_info_var = "restore_user_info_".$modname;
357             if (isset($$exist)) {
358                 if ($$exist) {
359                     //Now check that we have that module info in the backup file
360                     if (isset($info->mods[$modname]) && $info->mods[$modname]->backup == "true") {
361                         //Print the full tr
362                         echo "<tr class=\"r".$currentrow."\">";
363                         echo "<td align=\"right\">&nbsp;";
364                         echo "</td><td>";
365                         $restore_options[1] = get_string("yes");
366                         $restore_options[0] = get_string("no");
367                         //Print the checkbox
368                         print_checkbox($restore_var, $$restore_var, $$restore_var, get_string("modulenameplural",$modname),'','selectItemInCheckboxByName(\'form1\',\'restore_'.$modname.'\',this.checked)');
369                         //If backup contains user data, then show menu, else fix it to
370                         //without user data
371                         echo "</td><td align=\"right\">&nbsp;";
372                         echo "</td><td>";
373                         if ($info->mods[$modname]->userinfo == "true" && $restoreuserinfo) {
374                             $restore_user_options[1] = get_string("yes");
375                             $restore_user_options[0] = get_string("no");
376                             print_checkbox($user_info_var, $$user_info_var, $$user_info_var, get_string("userdata"),'','selectItemInCheckboxByName(\'form1\',\'restore_user_info_'.$modname.'\',this.checked)');
377                         } else {
378                             //Module haven't userdata
379                             echo get_string("withoutuserdata");
380                             echo "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
381                         }
382                         echo "</td></tr>";
383                         if (isset($info->mods[$modname]->instances)) {
384                             $instances = $info->mods[$modname]->instances;
385                         }
386                         if (!empty($instances) && is_array($instances)) {
387                             echo '<tr><td></td><td colspan="3"><table class="restore-form-instances">';
388                             foreach ($instances as $instance) {
389                                 echo '<tr><td>';
390                                 $var = 'restore_'.$modname.'_instance_'.$instance->id;
391                                 $$var = optional_param($var,1, PARAM_CLEAN);
392                                 print_checkbox($var,$$var,$$var,$instance->name,$instance->name,'this.form.elements[\'restore_'.$modname.'\'].checked=1;');
393                                 echo '</td><td align="right">&nbsp;';
394                                 $var = 'restore_user_info_'.$modname.'_instance_'.$instance->id;
395                                 $$var = optional_param($var,1, PARAM_CLEAN);
396                                 if (!empty($info->mods[$modname]->instances) && ($info->mods[$modname]->instances[$instance->id]->userinfo == 'true') && $restoreuserinfo) {
397                                     print_checkbox($var,$$var,$$var,get_string('userdata'),'','this.form.elements[\'restore_user_info_'.$modname.'\'].checked=1;');
398                                 } else {
399                                     echo '<input type="hidden" name="'.$var.'" value="0" />';
400                                 }
401                                 echo '</td></tr>';
402                             }
403                             echo '</table></td></tr>';
404                         }
405                     } else {
406                         //Module isn't restorable
407                         $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
408                         $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
409                     }
410                 } else {
411                     //Module isn't restorable
412                     $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
413                     $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
414                 }
415             } else {
416                 //Module isn't restorable
417                 $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
418                 $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
419             }
420             $currentrow = ($currentrow + 1) % 2;
421         }
422         //Line
423         echo "<tr><td colspan=\"4\">$nonrestmod<hr /></td></tr>";
425         //Now print the Metacourse tr
426         echo "<tr>";
427         echo "<td align=\"right\" colspan=\"2\"><b>";
428         echo '<label for="menurestore_metacourse">'.get_string ("metacourse").'</label>';
429         echo "</b></td><td colspan=\"2\">";
430         //If metacourse are in the backup file, show menu, else fixed to no
431         if ($info->backup_metacourse == "true") {
432             $metacourse_options = array();
433             $metacourse_options[0] = get_string("no");
434             $metacourse_options[1] = get_string("yes");
435             echo html_writer::input_select($metacourse_options, "restore_metacourse", $restore_metacourse, false);
436         } else {
437             echo get_string("no");
438             echo "<input type=\"hidden\" id=\"menurestore_metacourse\" name=\"restore_metacourse\" value=\"0\" />";
439         }
440         echo "</td></tr>";
441         //Now print the Users tr
442         echo "<tr>";
443         echo "<td align=\"right\" colspan=\"2\"><b>";
444         echo '<label for="menurestore_users">'.get_string ("users").'</label>';
445         echo "</b></td><td colspan=\"2\">";
446         //If some user is present in the backup file
447         if (($info->backup_users == "all" or $info->backup_users == "course") and $restoreuserinfo) {
448             $user_options = array();
449             //If all users are in the backup file and user has 'moodle/site:restore' at system level
450             if ($info->backup_users == "all" and has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM))) {
451                 $user_options[0] = get_string("all");
452             }
453             $user_options[1] = get_string("course");
454             $user_options[2] = get_string("none");
455             echo html_writer::input_select($user_options, "restore_users", $restore_users, false);
456         } else {
457             echo get_string("none");
458             echo "<input type=\"hidden\" id=\"menurestore_users\" name=\"restore_users\" value=\"2\" />";
460         }
461         echo "</td></tr>";
463         //Now print the Groups tr (assume there is no $info->backup_groups)
464         echo "<tr>";
465         echo "<td align=\"right\" colspan=\"2\"><b>";
466         $helplink = $OUTPUT->help_icon('grouprestore', get_string('groups'));
467         echo '<label for="menurestore_groups">'.get_string ("groups").'</label>'.$helplink;
468         echo "</b></td><td colspan=\"2\">";
469         if (empty($CFG->enablegroupings)) {
470             $group_options[RESTORE_GROUPS_NONE] = get_string('no');
471             $group_options[RESTORE_GROUPS_ONLY] = get_string('yes');
472         } else {
473             $group_options[RESTORE_GROUPS_NONE] = get_string('none');
474             $group_options[RESTORE_GROUPS_ONLY] = get_string('groupsonly', 'group');
475             $group_options[RESTORE_GROUPINGS_ONLY] = get_string('groupingsonly', 'group');
476             $group_options[RESTORE_GROUPS_GROUPINGS] = get_string('groupsgroupings', 'group'); //all.
477         }
478         echo html_writer::input_select($group_options, 'restore_groups', $restore_groups, false);
479         echo "</td></tr>";
481         //Now print the Logs tr
482         echo "<tr>";
483         echo "<td align=\"right\" colspan=\"2\"><b>";
484         echo '<label for="menurestore_logs">'.get_string ("logs").'</label>';
485         echo "</b></td><td colspan=\"2\">";
486         //If logs are in the backup file, show menu, else fixed to no
487         if ($info->backup_logs == "true" and $restoreuserinfo) {
488             $log_options = array();
489             $log_options[0] = get_string("no");
490             $log_options[1] = get_string("yes");
491             echo html_writer::input_select($log_options, "restore_logs", $restore_logs, false);
492         } else {
493             echo get_string("no");
494             echo "<input type=\"hidden\" id=\"menurestore_logs\" name=\"restore_logs\" value=\"0\" />";
495         }
496         echo "</td></tr>";
498         //Now print the User Files tr
499         echo "<tr>";
500         echo "<td align=\"right\" colspan=\"2\"><b>";
501         echo '<label for="menurestore_user_files">'.get_string ("userfiles").'</label>';
502         echo "</b></td><td colspan=\"2\">";
503         //If user files are in the backup file, show menu, else fixed to no
504         if ($info->backup_user_files == "true" and $restoreuserinfo) {
505             $user_file_options = array();
506             $user_file_options[0] = get_string("no");
507             $user_file_options[1] = get_string("yes");
508             echo html_writer::input_select($user_file_options, "restore_user_files", $restore_user_files, false);
509         } else {
510             echo get_string("no");
511             echo "<input type=\"hidden\" id=\"menurestore_user_files\" name=\"restore_user_files\" value=\"0\" />";
512         }
513         echo "</td></tr>";
515         //Now print the Course Files tr
516         echo "<tr>";
517         echo "<td align=\"right\" colspan=\"2\"><b>";
518         echo '<label for="menurestore_course_files">'.get_string ("coursefiles").'</label>';
519         echo "</b></td><td colspan=\"2\">";
520         echo "<input type=\"hidden\" name=\"backup_unique_code\" value=\"$backup_unique_code\" />";
521         echo "<input type=\"hidden\" name=\"file\" value=\"$file\" />";
522         //If course files are in the backup file, show menu, else fixed to no
523         if ($info->backup_course_files == "true") {
524             $course_file_options = array();
525             $course_file_options[0] = get_string("no");
526             $course_file_options[1] = get_string("yes");
527             echo html_writer::input_select($course_file_options, "restore_course_files", $restore_course_files, false);
528         } else {
529             echo get_string("no");
530             echo "<input type=\"hidden\" id=\"menurestore_course_files\" name=\"restore_course_files\" value=\"0\" />";
531         }
532         echo "</td></tr>";
535         //Now print the Site Files tr
536         echo "<tr>";
537         echo "<td align=\"right\" colspan=\"2\"><b>";
538         echo '<label for="menurestore_site_files">'.get_string ("sitefiles").'</label>';
539         echo "</b></td><td colspan=\"2\">";
540         //If site files are in the backup file, show menu, else fixed to no
541         if (isset($info->backup_site_files) && $info->backup_site_files == "true") {
542             $site_file_options = array();
543             $site_file_options[0] = get_string("no");
544             $site_file_options[1] = get_string("yes");
545             echo html_writer::input_select($site_file_options, "restore_site_files", $restore_site_files, false);
546         } else {
547             echo get_string("no");
548             echo "<input type=\"hidden\" id=\"menurestore_site_files\" name=\"restore_site_files\" value=\"0\" />";
549         }
550         echo "</td></tr>";
552         // do you want grade histories to be restored?
553         if (empty($CFG->disablegradehistory) and $restoreuserinfo) {
554             echo "<tr>";
555             echo "<td align=\"right\" colspan=\"2\"><b>";
556             echo '<label for="menurestore_gradebook_history">'.get_string ('gradebookhistories', 'grades').'</label>';
557             echo "</b></td><td colspan=\"2\">";
558             if (isset($info->gradebook_histories) && $info->gradebook_histories == "true") {
559                 $gradebook_history_options = array();
560                 $gradebook_history_options[0] = get_string("no");
561                 $gradebook_history_options[1] = get_string("yes");
562                 echo html_writer::input_select($gradebook_history_options, "restore_gradebook_history", $restore_gradebook_history, false);
563             } else {
564                 echo get_string("no");
565                 echo "<input type=\"hidden\" id=\"menurestore_gradebook_history\" name=\"restore_gradebook_history\" value=\"0\" />";
566             }
567             echo "</td></tr>";
568         } else {
569             $hidden_options .= '<input type="hidden" name="restore_gradebook_history" value="0" />';
570         }
572         //This tr is slighty different. Everything becomes hidden if
573         //we haven't messages is the backup, to avoid confusions to users.
574         //If messages are in the backup file, show menu, else fixed to no and show nothing
575         //Also, messaging must be enabled in the destination site
576         if (isset($info->backup_messages) && $info->backup_messages == "true" && !empty($CFG->messaging) and $restoreuserinfo) {
577             echo "<tr>";
578             echo "<td align=\"right\" colspan=\"2\"><b>";
579             echo '<label for="menurestore_messages">'.get_string ('messages', 'message').'</label>';
580             echo "</b></td><td colspan=\"2\">";
581             $message_options = array();
582             $message_options[0] = get_string("no");
583             $message_options[1] = get_string("yes");
584             echo html_writer::input_select($message_options, "restore_messages", $restore_messages, false);
585             echo "</td></tr>";
586         } else {
587             $hidden_options .= '<input type="hidden" name="restore_messages" value="0" />';
588         }
590         //This tr is slighty different. Everything becomes hidden if
591         //we haven't blogs is the backup, to avoid confusions to users.
592         //If blogs are in the backup file, show menu, else fixed to no and show nothing
593         //Also, blogs must be enabled in the destination site
594         if (isset($info->backup_blogs) && $info->backup_blogs == "true" && !empty($CFG->bloglevel) and $restoreuserinfo) {
595             echo "<tr>";
596             echo "<td align=\"right\" colspan=\"2\"><b>";
597             echo '<label for="menurestore_blogs">'.get_string ('blogs', 'blog').'</label>';
598             echo "</b></td><td colspan=\"2\">";
599             $blog_options = array();
600             $blog_options[0] = get_string("no");
601             $blog_options[1] = get_string("yes");
602             echo html_writer::input_select($blog_options, "restore_blogs", $restore_blogs, false);
603             echo "</td></tr>";
604         } else {
605             $hidden_options .= '<input type="hidden" name="restore_blogs" value="0" />';
606         }
608     }
609 ?>
610 </table>
612 <hr />
613 <?php
614 // Only show the roles mapping if restore of user info is allowed
615 if ($restoreuserinfo) {
616     echo $OUTPUT->heading(get_string('rolemappings'));
617     $xml_file  = $CFG->dataroot."/temp/backup/".$backup_unique_code."/moodle.xml";
619     $info = restore_read_xml_info($xml_file);
621     // fix for MDL-9068, front page course is just a normal course
622     $siterolesarray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "shortname", ROLENAME_ORIGINAL);
623     $siterolesnamearray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "name", ROLENAME_ORIGINAL);
624     $allroles = get_records('role');
626     echo ('<table width="100%" class="restore-form-instances">');
627     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>');
629     if ($info->backup_moodle_version < 2006092801) {
630         // 1.6 and below backup
632         /// Editting teacher
633         echo ('<tr><td align="right">');
634         echo '<label for="menudefaultteacheredit">'.get_string ('defaultcourseteacher').'</label>';
635         echo ('</td><td algin="left">');
637         // get the first teacheredit legacy
638         $roles = get_roles_with_capability('moodle/legacy:editingteacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM));
640         $editteacher = reset($roles);
641         echo $OUTPUT->select(html_select::make ($siterolesarray, "defaultteacheredit", $editteacher->id, 'new role'));
642         echo ('</td></tr>');
644         /// Non-editting teacher
645         echo ('<tr><td align="right">');
646         echo '<label for="menudefaultteacher">'.get_string ('noneditingteacher').'</label>';
647         print_string('noneditingteacher');
648         echo ('</td><td algin="left">');
650         // get the first teacheredit legacy
651         $roles = get_roles_with_capability('moodle/legacy:teacher', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM));
652         $teacher = reset($roles);
654         echo $OUTPUT->select(html_select::make ($siterolesarray, "defaultteacher", $teacher->id, 'new role'));
655         echo ('</td></tr>');
658         /// Student
659         echo ('<tr><td align="right">');
660         echo '<label for="menudefaultstudent">'.get_string ('defaultcoursestudent').'</label>';
661         echo ('</td><td algin="left">');
663         // get the first teacheredit legacy
664         $roles = get_roles_with_capability('moodle/legacy:student', CAP_ALLOW, get_context_instance(CONTEXT_SYSTEM));
665         $studentrole = array_shift($roles);
667         echo $OUTPUT->select(html_select::make ($siterolesarray, "defaultstudent", $studentrole->id, 'new role'));
668         echo ('</td></tr>');
670     } else {
671         // 1.7 and above backup
672         $roles = restore_read_xml_roles($xml_file);
674         if (!empty($roles->roles)) { // possible to have course with no roles
675             foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
676                 $siteroleschoicearray[$siteroleid] = $siterolesnamearray[$siteroleid]." (". $siterolesarray[$siteroleid].")";
677             }
679             foreach ($roles->roles as $roleid=>$role) {
681                 $mappableroles = $siteroleschoicearray;
683                 echo ('<tr><td align="right">');
684                 echo '<label for="menuroles_'.$roleid.'">'.format_string($role->name)." (".($role->shortname).")".'</label>';
685                 echo ('</td><td align="left">');
687                 /// first, we see if any exact role definition is found
688                 /// if found, that is the only option of restoring to
690                 if ($samerole = restore_samerole($roleid, $role)) {
691                     $matchrole = $samerole->id;
692                     // if an exact role is found, it does not matter whether this user can assign this role or not,
693                     // this will be presented as a valid option regardless
694                     $mappableroles[$samerole->id] = format_string($allroles[$samerole->id]->name)." (". $allroles[$samerole->id]->shortname.")";
695                 } else {
696                     // no exact role found, let's try to match shortname
697                     // this is useful in situations where basic roles differ slightly in definition
698                     $matchrole = 0;
699                     foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
700                         if ($siteroleshortname == $role->shortname) {
701                             $matchrole = $siteroleid;
702                             break;
703                         }
704                     }
705                 }
706                 echo $OUTPUT->select(html_select::make ($mappableroles, "roles_".$roleid, $matchrole, 'new role'));
707                 echo ('</td></tr>');
708             }
709         }
711     } // end else
712     echo ('</table>'); // end of role mappings table
715 ?>
716 <br />
717 <div style="text-align:center">
718 <?php
719 /// Print captured hidden options, now that we have closed the table
720     echo $hidden_options;
721 ?>
722 <input type="hidden" name="id"     value="<?php  p($id) ?>" />
723 <input type="hidden" name="launch" value="check" />
724 <input type="hidden" name="fromform" value="1" />
725 <input type="submit" value="<?php  print_string("continue") ?>" />
726 <input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
727 </div>
728 </div>
729 </form>
731 <?php
733 /**
734  *
735  * @param integer $roleid the id that the role in the backup files had on the old server.
736  * @param object $role the rest of the definition of the role from the backup file.
737  */
738 function restore_samerole($roleid, $rolefromxml) {
739     global $CFG, $DB;
741     // First we try some intelligent guesses, then, if none of those work, we do a more extensive
742     // search.
744     // First guess, try let's use the id
745     if (restore_is_samerole($roleid, $rolefromxml)) {
746         return $DB->get_record('role', array('id'=>$roleid));
747     }
749     // Second guess, try the shortname
750     $testroleid = $DB->get_field('role', 'id', array('shortname'=>$rolefromxml->shortname));
751     if ($testroleid && restore_is_samerole($testroleid, $rolefromxml)) {
752         return $DB->get_record('role', array('id'=>$testroleid));
753     }
755     // Finally, search all other roles. In orter to speed things up, we exclude the ones we have
756     // already tested, and we only search roles with the same number of capabilities set in their
757     // definition.
758     $extracondition = '';
759     if ($testroleid) {
760         $extracondition = "AND roleid <> $testroleid";
761     }
762     $candidateroleids = $DB->get_records_sql(
763         "SELECT roleid
764            FROM {role_capabilities}
765           WHERE roleid <> $roleid $extracondition
766        GROUP BY roleid
767          HAVING COUNT(capability) = ".count($rolefromxml->capabilities));
768     if (!empty($candidateroleids)) {
769         foreach ($candidateroleids as $testroleid => $notused) {
770             if (restore_is_samerole($testroleid, $rolefromxml)) {
771                 return $DB->get_record('role', array('id'=>$testroleid));
772             }
773         }
774     }
776     return false;
779 /**
780  * Compare a role in the database with one loaded from the backup file, and determine whether
781  * they have identical permissions for each capability.
782  * @param integer $testroleid the id of the role from the database to test against.
783  * @param object $rolefromxml the role definition loaded from the backup file.
784  * @return boolean true if the two roles are identical.
785  */
786 function restore_is_samerole($testroleid, $rolefromxml) {
787     global $DB;
789     // Load the role definition from the databse.
790     $rolefromdb = $DB->get_records('role_capabilities', array('roleid'=>$testroleid), '', 'capability,permission');
791     if (!$rolefromdb) {
792         return false;
793     }
795     // Quick check, do they have the permissions on the same number of capabilities?
796     if (count($rolefromdb) != count($rolefromxml->capabilities)) {
797         return false;
798     }
800     // If they do, check each one.
801     foreach ($rolefromdb as $capability => $permissions) {
802         if (!isset($rolefromxml->capabilities[$capability]) ||
803                 $permissions->permission != $rolefromxml->capabilities[$capability]->permission) {
804             return false;
805         }
806     }
807     return true;