9d8a5b76a690458e8ef718ce1f4b461d075817bb
[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/restore:restorecourse', 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/restore:restorecourse', 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     if (!isset($restore_users)) {
81         $restore_users = 1;
82     }
84     if (!isset($restore_groups)) {
85         $restore_groups = RESTORE_GROUPS_GROUPINGS;
86     }
88     if (!isset($restore_logs)) {
89         $restore_logs = 1;
90     }
92     if (!isset($restore_user_files)) {
93         $restore_user_files = 1;
94     }
96     if (!isset($restore_course_files)) {
97         $restore_course_files = 1;
98     }
100     if (!isset($restore_site_files)) {
101         $restore_site_files = 1;
102     }
104     if (!isset($restore_messages)) {
105         $restore_messages = 1;
106     }
108     if (!isset($restore_blogs)) {
109         $restore_blogs = 1;
110     }
112     $cancreatecourses = user_can_create_courses();
113     if (!isset($restore_restoreto)) {
114         if (!$cancreatecourses) {
115             $restore_restoreto = RESTORETO_CURRENT_ADDING;
116         } else {
117             $restore_restoreto = RESTORETO_NEW_COURSE;
118         }
119     }
121     if (!isset($course_header->category->id)) {
122         $course_header->category->id = 0;
123     }
125     if(!isset($form1->startdate)) {
126         $form1->startdate = $course_header->course_startdate; //$course_header->course_startdate;
127     }
129     if (empty($form1->shortname)) {
130        $form1->shortname = $course_header->course_shortname; //'_shortname'; //$course_header->course_shortname;
131     }
133     if (empty($form1->fullname)) {
134       $form1->fullname = $course_header->course_fullname; // '_fullname';   //$course_header->course_fullname;
135     }
137     if ($count == 0) {
138         notice("No restorable modules are installed!");
139     }
141 ?>
143 <script type="text/javascript">
144 <!--
145 function selectItemInMenuByName(formId, menuName, selectIndex ) {
146     myForm = document.getElementById(formId)
147     for (i=0,n=myForm.elements.length;i<n;i++) {
148         myLen = menuName.length;
149         myName = myForm.elements[i].name;
150         myType = myForm.elements[i].type;
151         if (myName.substring(0,myLen) == menuName && myType == "select-one") {
152             myForm.elements[i].options[selectIndex].selected = true;
153         }
154     }
157 function selectItemInRadioByName(formId, radioName, selectIndex ) {
158     myForm = document.getElementById(formId)
159     for (i=0,n=myForm.elements.length;i<n;i++) {
160         myLen = radioName.length;
161         myName = myForm.elements[i].name;
162         myType = myForm.elements[i].type;
163         if (myName.substring(0,myLen) == radioName && myType == "radio") {
164             myRadioGroup = myForm.elements[myName];
165             myRadioGroup[selectIndex].checked = true;
166         }
167     }
170 function selectItemInCheckboxByName(formId, checkName, checked ) {
171     myForm = document.getElementById(formId)
172     for (i=0,n=myForm.elements.length;i<n;i++) {
173         myLen = checkName.length;
174         myName = myForm.elements[i].name;
175         myType = myForm.elements[i].type;
176         if (myName.substring(0,myLen) == checkName && myType == "checkbox") {
177             myForm.elements[i].checked = checked;
178         }
179     }
181 -->
182 </script>
184 <form id="form1" method="post" action="restore.php">
185 <div>
186 <table cellpadding="5" class="boxaligncenter">
187 <?php
189     //First, course destination
190     //Print the full tr
191     echo "<tr>";
192     echo "<td align=\"right\"><b>";
193     echo '<label for="menurestore_restoreto">'.get_string ('restoreto').'</label>';
194     echo "</b>";
195     echo "</td><td colspan=\"3\">";
197     // permission should have been checked already
199     //TODO: use better function which includes all courses for admins
200     $mycourses = get_user_courses_bycap($USER->id, 'moodle/restore:restorecourse');
202     // if the user can restore to current course, grant the "current" options
203     if (has_capability('moodle/restore:restorecourse', get_context_instance(CONTEXT_COURSE, $id))){
204         $restore_restoreto_options[RESTORETO_CURRENT_DELETING] = get_string("currentcoursedeleting");
205         $restore_restoreto_options[RESTORETO_CURRENT_ADDING] = get_string("currentcourseadding");
206     }
208     // if user can create any course, grant the "new course" option
209     if ($cancreatecourses) {
210         $restore_restoreto_options[RESTORETO_NEW_COURSE] = get_string("newcourse");
211     }
213     // if the user can restore to 2 or more courses (or to just 1 but different from current), grant the "existing" options
214     if (count($mycourses) > 1 || (count($mycourses) == 1 && $mycourses[0]->id != $id)) {
215         $restore_restoreto_options[RESTORETO_EXISTING_DELETING] = get_string("existingcoursedeleting");
216         $restore_restoreto_options[RESTORETO_EXISTING_ADDING] = get_string("existingcourseadding");
217     }
219 /// Acummulator for hidden options and proper XHTML output
220     $hidden_options = '';
222     echo html_writer::select($restore_restoreto_options, "restore_restoreto", $restore_restoreto, false);
223     echo "</td></tr>";
224     if ($cancreatecourses) {  //display these fields conditionally
226         // find the list of cates user can edit
227         echo "<tr valign=\"top\" >";
228         echo "<td align=\"right\">";
229         echo '<label for="menurestore_restorecatto">'.get_string ('category').'</label>';
230         echo "</td>";
231         echo "<td>";
232         // Get the list of categories where the user can create courses
233         make_categories_list($categories, $parents, 'moodle/course:create');
234         $category_default = null;
235         // Best default 1: restoring in same site, use category of original course if available
236         if (backup_is_same_site($info) &&
237             !empty($course_header->category->id) &&
238             array_key_exists($course_header->category->id, $categories)) {
239             $category_default = $course_header->category->id;
240         // Best default 2: restore to the category of the course we are restoring from if available
241         } else {
242             $fromcat = $DB->get_field('course', 'category', array('id' => $id));
243             if (!empty($fromcat) &&
244                 array_key_exists($fromcat, $categories)) {
245                 $category_default = $fromcat;
246             }
247         }
248         echo html_writer::select($categories, 'restore_restorecatto', $category_default, false);
249         echo "</td>";
250         echo "</tr>";
252         echo "<tr valign=\"top\" >";
253         echo "<td align=\"right\">";
254         echo '<label for="shortnamefield">'.get_string ('shortname').'</label>';
255         echo "</td>";
256         echo "<td><input type=\"text\" id=\"shortnamefield\" name=\"shortname\" maxlength=\"100\"  size=\"20\" value=\"".s($form1->shortname)."\" alt=\"".get_string("shortname")."\"  />" ;
257         echo $OUTPUT->help_icon('shortnamecourse'));
258         if (isset($err["shortname"])) echo $OUTPUT->error_text($err["shortname"]);
259         echo "</td>";
260         echo "</tr>";
261         echo "<tr valign=\"top\" >";
262         echo "<td align=\"right\">";
263         echo '<label for="fullnamefield">'.get_string ('fullname').'</label>';
264         echo "</td>";
265         echo "<td><input type=\"text\" id=\"fullnamefield\" name=\"fullname\" maxlength=\"254\" size=\"50\" value=\"".s($form1->fullname)."\" alt=\" ".get_string("fullname")."\"  />" ;
266         echo $OUTPUT->help_icon('fullnamecourse');
267         if (isset($err["fullname"])) echo $OUTPUT->error_text($err["fullname"]);
268         echo"</td></tr>";
269     } else {
270         // nothing to show here if the user cannot create users
271     }
273     // If user can roll dates (in any course is enough for now) show the roll dates option.
274     // Important: The final restore check step will validate, once we know the final category/course
275     // where the restore is happening, if the user is really capable of rolling dates there, noticing
276     // and disabling roll if not allowed.
277     if (restore_user_can_roll_dates()) {
278         echo "<tr valign=\"top\"> ";
279         echo "<td align=\"right\"> ";
280         print_string("startdate");
281         echo "</td><td>";
282     /// Show the roll dates option only if the backup course has a start date
283     /// (some formats like main page, social..., haven't it and rolling dates
284     /// from 0 produces crazy dates. MDL-10125
285         if ($form1->startdate) {
286             $dayselector = html_writer::select_time('days', "startday", $form1->startdate);
287             $monthselector = html_writer::select_time('months', "startmonth", $form1->startdate);
288             $yearselector = html_writer::select_time('years', "startyear", $form1->startdate);
290             echo $dayselector . $monthselector . $yearselector;
291             echo $OUTPUT->help_icon('startdate'));
292         } else {
293             print_string('notavailable');
294             echo '<input type="hidden" name="startyear" value="0" />';
295             echo '<input type="hidden" name="startmonth" value="0" />';
296             echo '<input type="hidden" name="startday" value="0" />';
297         }
298         echo "</td></tr>";
299     } else {
300     /// If user lacks the moodle/restore:rolldates completely, prevent any change in startyear/month/day (so restore won't perform any roll)
301         echo '<input type="hidden" name="startyear" value="0" />';
302         echo '<input type="hidden" name="startmonth" value="0" />';
303         echo '<input type="hidden" name="startday" value="0" />';
304     }
305     //Line
306     echo "<tr><td colspan=\"4\"><hr /></td></tr>";
307     //Now, check modules and info and show posibilities
308     if ($allmods = $DB->get_records("modules") ) {
309         //Print option to select/deselect everything with 1 click.
310         echo "<tr>";
311         echo "<td align=\"right\">";
312         echo '<b>'.get_string("include")."</b>";
313         echo "</td><td>";
314         echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', true);\">".
315              get_string("all")."</a>/";
316         echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_', false);\">".
317              get_string("none")."</a>";
318         echo "</td>";
319         if ($restoreuserinfo) {
320             echo "<td align=\"right\">";
321             echo '<b>&nbsp;</b>';
322             echo "</td><td>";
323             echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', true);\">".
324                  get_string("all")."</a>/";
325             echo "<a href=\"javascript:void(0);\" onclick=\"selectItemInCheckboxByName('form1', 'restore_user_info_', false);\">".
326                  get_string("none")."</a>";
327             echo "</td>";
328         } else {
329             echo "<td colspan=\"2\">&nbsp;</td>";
330         }
331         echo "</tr>";
332         echo "<tr><td colspan=\"4\"><hr /></td></tr>";
333         $currentrow = 0;
334         $nonrestmod = '';
335         foreach ($allmods as $mod) {
336             $modname = $mod->name;
337             $modrestore = $modname."_restore_mods";
338             //If exists the lib & function
339             $exist = "exists_".$modname;
340             $restore_var = "restore_".$modname;
341             $user_info_var = "restore_user_info_".$modname;
342             if (isset($$exist)) {
343                 if ($$exist) {
344                     //Now check that we have that module info in the backup file
345                     if (isset($info->mods[$modname]) && $info->mods[$modname]->backup == "true") {
346                         //Print the full tr
347                         echo "<tr class=\"r".$currentrow."\">";
348                         echo "<td align=\"right\">&nbsp;";
349                         echo "</td><td>";
350                         $restore_options[1] = get_string("yes");
351                         $restore_options[0] = get_string("no");
352                         //Print the checkbox
353                         print_checkbox($restore_var, $$restore_var, $$restore_var, get_string("modulenameplural",$modname),'','selectItemInCheckboxByName(\'form1\',\'restore_'.$modname.'\',this.checked)');
354                         //If backup contains user data, then show menu, else fix it to
355                         //without user data
356                         echo "</td><td align=\"right\">&nbsp;";
357                         echo "</td><td>";
358                         if ($info->mods[$modname]->userinfo == "true" && $restoreuserinfo) {
359                             $restore_user_options[1] = get_string("yes");
360                             $restore_user_options[0] = get_string("no");
361                             print_checkbox($user_info_var, $$user_info_var, $$user_info_var, get_string("userdata"),'','selectItemInCheckboxByName(\'form1\',\'restore_user_info_'.$modname.'\',this.checked)');
362                         } else {
363                             //Module haven't userdata
364                             echo get_string("withoutuserdata");
365                             echo "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
366                         }
367                         echo "</td></tr>";
368                         if (isset($info->mods[$modname]->instances)) {
369                             $instances = $info->mods[$modname]->instances;
370                         }
371                         if (!empty($instances) && is_array($instances)) {
372                             echo '<tr><td></td><td colspan="3"><table class="restore-form-instances">';
373                             foreach ($instances as $instance) {
374                                 echo '<tr><td>';
375                                 $var = 'restore_'.$modname.'_instance_'.$instance->id;
376                                 $$var = optional_param($var,1, PARAM_CLEAN);
377                                 print_checkbox($var,$$var,$$var,$instance->name,$instance->name,'this.form.elements[\'restore_'.$modname.'\'].checked=1;');
378                                 echo '</td><td align="right">&nbsp;';
379                                 $var = 'restore_user_info_'.$modname.'_instance_'.$instance->id;
380                                 $$var = optional_param($var,1, PARAM_CLEAN);
381                                 if (!empty($info->mods[$modname]->instances) && ($info->mods[$modname]->instances[$instance->id]->userinfo == 'true') && $restoreuserinfo) {
382                                     print_checkbox($var,$$var,$$var,get_string('userdata'),'','this.form.elements[\'restore_user_info_'.$modname.'\'].checked=1;');
383                                 } else {
384                                     echo '<input type="hidden" name="'.$var.'" value="0" />';
385                                 }
386                                 echo '</td></tr>';
387                             }
388                             echo '</table></td></tr>';
389                         }
390                     } else {
391                         //Module isn't restorable
392                         $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
393                         $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
394                     }
395                 } else {
396                     //Module isn't restorable
397                     $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
398                     $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
399                 }
400             } else {
401                 //Module isn't restorable
402                 $nonrestmod .= "<input type=\"hidden\" name=\"$restore_var\" value=\"0\" />";
403                 $nonrestmod .= "<input type=\"hidden\" name=\"$user_info_var\" value=\"0\" />";
404             }
405             $currentrow = ($currentrow + 1) % 2;
406         }
407         //Line
408         echo "<tr><td colspan=\"4\">$nonrestmod<hr /></td></tr>";
410         //Now print the Users tr
411         echo "<tr>";
412         echo "<td align=\"right\" colspan=\"2\"><b>";
413         echo '<label for="menurestore_users">'.get_string ("users").'</label>';
414         echo "</b></td><td colspan=\"2\">";
415         //If some user is present in the backup file
416         if (($info->backup_users == "all" or $info->backup_users == "course") and $restoreuserinfo) {
417             $user_options = array();
418             //If all users are in the backup file and user has 'moodle/restore:restorecourse' at system level
419             if ($info->backup_users == "all" and has_capability('moodle/restore:restorecourse', get_context_instance(CONTEXT_SYSTEM))) {
420                 $user_options[0] = get_string("all");
421             }
422             $user_options[1] = get_string("course");
423             $user_options[2] = get_string("none");
424             echo html_writer::select($user_options, "restore_users", $restore_users, false);
425         } else {
426             echo get_string("none");
427             echo "<input type=\"hidden\" id=\"menurestore_users\" name=\"restore_users\" value=\"2\" />";
429         }
430         echo "</td></tr>";
432         //Now print the Groups tr (assume there is no $info->backup_groups)
433         echo "<tr>";
434         echo "<td align=\"right\" colspan=\"2\"><b>";
435         echo '<label for="menurestore_groups">'.get_string ("groups").'</label>'.$helplink;
436         echo "</b></td><td colspan=\"2\">";
437         $group_options[RESTORE_GROUPS_NONE] = get_string('none');
438         $group_options[RESTORE_GROUPS_ONLY] = get_string('groupsonly', 'group');
439         $group_options[RESTORE_GROUPINGS_ONLY] = get_string('groupingsonly', 'group');
440         $group_options[RESTORE_GROUPS_GROUPINGS] = get_string('groupsgroupings', 'group'); //all.
441         echo html_writer::select($group_options, 'restore_groups', $restore_groups, false);
442         echo "</td></tr>";
444         //Now print the Logs tr
445         echo "<tr>";
446         echo "<td align=\"right\" colspan=\"2\"><b>";
447         echo '<label for="menurestore_logs">'.get_string ("logs").'</label>';
448         echo "</b></td><td colspan=\"2\">";
449         //If logs are in the backup file, show menu, else fixed to no
450         if ($info->backup_logs == "true" and $restoreuserinfo) {
451             $log_options = array();
452             $log_options[0] = get_string("no");
453             $log_options[1] = get_string("yes");
454             echo html_writer::select($log_options, "restore_logs", $restore_logs, false);
455         } else {
456             echo get_string("no");
457             echo "<input type=\"hidden\" id=\"menurestore_logs\" name=\"restore_logs\" value=\"0\" />";
458         }
459         echo "</td></tr>";
461         //Now print the User Files tr
462         echo "<tr>";
463         echo "<td align=\"right\" colspan=\"2\"><b>";
464         echo '<label for="menurestore_user_files">'.get_string ("userfiles").'</label>';
465         echo "</b></td><td colspan=\"2\">";
466         //If user files are in the backup file, show menu, else fixed to no
467         if ($info->backup_user_files == "true" and $restoreuserinfo) {
468             $user_file_options = array();
469             $user_file_options[0] = get_string("no");
470             $user_file_options[1] = get_string("yes");
471             echo html_writer::select($user_file_options, "restore_user_files", $restore_user_files, false);
472         } else {
473             echo get_string("no");
474             echo "<input type=\"hidden\" id=\"menurestore_user_files\" name=\"restore_user_files\" value=\"0\" />";
475         }
476         echo "</td></tr>";
478         //Now print the Course Files tr
479         echo "<tr>";
480         echo "<td align=\"right\" colspan=\"2\"><b>";
481         echo '<label for="menurestore_course_files">'.get_string ("coursefiles").'</label>';
482         echo "</b></td><td colspan=\"2\">";
483         echo "<input type=\"hidden\" name=\"backup_unique_code\" value=\"$backup_unique_code\" />";
484         echo "<input type=\"hidden\" name=\"file\" value=\"$file\" />";
485         //If course files are in the backup file, show menu, else fixed to no
486         if ($info->backup_course_files == "true") {
487             $course_file_options = array();
488             $course_file_options[0] = get_string("no");
489             $course_file_options[1] = get_string("yes");
490             echo html_writer::select($course_file_options, "restore_course_files", $restore_course_files, false);
491         } else {
492             echo get_string("no");
493             echo "<input type=\"hidden\" id=\"menurestore_course_files\" name=\"restore_course_files\" value=\"0\" />";
494         }
495         echo "</td></tr>";
498         //Now print the Site Files tr
499         echo "<tr>";
500         echo "<td align=\"right\" colspan=\"2\"><b>";
501         echo '<label for="menurestore_site_files">'.get_string ("sitefiles").'</label>';
502         echo "</b></td><td colspan=\"2\">";
503         //If site files are in the backup file, show menu, else fixed to no
504         if (isset($info->backup_site_files) && $info->backup_site_files == "true") {
505             $site_file_options = array();
506             $site_file_options[0] = get_string("no");
507             $site_file_options[1] = get_string("yes");
508             echo html_writer::select($site_file_options, "restore_site_files", $restore_site_files, false);
509         } else {
510             echo get_string("no");
511             echo "<input type=\"hidden\" id=\"menurestore_site_files\" name=\"restore_site_files\" value=\"0\" />";
512         }
513         echo "</td></tr>";
515         // do you want grade histories to be restored?
516         if (empty($CFG->disablegradehistory) and $restoreuserinfo) {
517             echo "<tr>";
518             echo "<td align=\"right\" colspan=\"2\"><b>";
519             echo '<label for="menurestore_gradebook_history">'.get_string ('gradebookhistories', 'grades').'</label>';
520             echo "</b></td><td colspan=\"2\">";
521             if (isset($info->gradebook_histories) && $info->gradebook_histories == "true") {
522                 $gradebook_history_options = array();
523                 $gradebook_history_options[0] = get_string("no");
524                 $gradebook_history_options[1] = get_string("yes");
525                 echo html_writer::select($gradebook_history_options, "restore_gradebook_history", $restore_gradebook_history, false);
526             } else {
527                 echo get_string("no");
528                 echo "<input type=\"hidden\" id=\"menurestore_gradebook_history\" name=\"restore_gradebook_history\" value=\"0\" />";
529             }
530             echo "</td></tr>";
531         } else {
532             $hidden_options .= '<input type="hidden" name="restore_gradebook_history" value="0" />';
533         }
535         //This tr is slighty different. Everything becomes hidden if
536         //we haven't messages is the backup, to avoid confusions to users.
537         //If messages are in the backup file, show menu, else fixed to no and show nothing
538         //Also, messaging must be enabled in the destination site
539         if (isset($info->backup_messages) && $info->backup_messages == "true" && !empty($CFG->messaging) and $restoreuserinfo) {
540             echo "<tr>";
541             echo "<td align=\"right\" colspan=\"2\"><b>";
542             echo '<label for="menurestore_messages">'.get_string ('messages', 'message').'</label>';
543             echo "</b></td><td colspan=\"2\">";
544             $message_options = array();
545             $message_options[0] = get_string("no");
546             $message_options[1] = get_string("yes");
547             echo html_writer::select($message_options, "restore_messages", $restore_messages, false);
548             echo "</td></tr>";
549         } else {
550             $hidden_options .= '<input type="hidden" name="restore_messages" value="0" />';
551         }
553         //This tr is slighty different. Everything becomes hidden if
554         //we haven't blogs is the backup, to avoid confusions to users.
555         //If blogs are in the backup file, show menu, else fixed to no and show nothing
556         //Also, blogs must be enabled in the destination site
557         if (isset($info->backup_blogs) && $info->backup_blogs == "true" && !empty($CFG->bloglevel) and $restoreuserinfo) {
558             echo "<tr>";
559             echo "<td align=\"right\" colspan=\"2\"><b>";
560             echo '<label for="menurestore_blogs">'.get_string ('blogs', 'blog').'</label>';
561             echo "</b></td><td colspan=\"2\">";
562             $blog_options = array();
563             $blog_options[0] = get_string("no");
564             $blog_options[1] = get_string("yes");
565             echo html_writer::select($blog_options, "restore_blogs", $restore_blogs, false);
566             echo "</td></tr>";
567         } else {
568             $hidden_options .= '<input type="hidden" name="restore_blogs" value="0" />';
569         }
571     }
572 ?>
573 </table>
575 <hr />
576 <?php
577 // Only show the roles mapping if restore of user info is allowed
578 if ($restoreuserinfo) {
579     echo $OUTPUT->heading(get_string('rolemappings'));
580     $xml_file  = $CFG->dataroot."/temp/backup/".$backup_unique_code."/moodle.xml";
582     $info = restore_read_xml_info($xml_file);
584     // fix for MDL-9068, front page course is just a normal course
585     $siterolesarray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "shortname", ROLENAME_ORIGINAL);
586     $siterolesnamearray = get_assignable_roles (get_context_instance(CONTEXT_COURSE, $course->id), "name", ROLENAME_ORIGINAL);
587     $allroles = get_records('role');
589     echo ('<table width="100%" class="restore-form-instances">');
591     if ($info->backup_moodle_version < 2006092801) {
592         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>');
594         // 1.6 and below backup
596         /// Editting teacher
597         echo ('<tr><td align="right">');
598         echo '<label for="menudefaultteacheredit">'.get_string ('defaultcourseteacher').'</label>';
599         echo ('</td><td algin="left">');
601         // get the first teacheredit legacy
602         $roles = get_archetype_roles('editingteacher');
604         $editteacher = reset($roles);
605         echo html_writer::select($siterolesarray, "defaultteacheredit", $editteacher->id, array(''=>'new role'));
606         echo ('</td></tr>');
608         /// Non-editting teacher
609         echo ('<tr><td align="right">');
610         echo '<label for="menudefaultteacher">'.get_string ('noneditingteacher').'</label>';
611         print_string('noneditingteacher');
612         echo ('</td><td algin="left">');
614         // get the first teacheredit legacy
615         $roles = get_archetype_roles('teacher');
616         $teacher = reset($roles);
618         echo html_writer::select($siterolesarray, "defaultteacher", $teacher->id, array(''=>'new role'));
619         echo ('</td></tr>');
622         /// Student
623         echo ('<tr><td align="right">');
624         echo '<label for="menudefaultstudent">'.get_string ('defaultcoursestudent').'</label>';
625         echo ('</td><td algin="left">');
627         // get the first teacheredit legacy
628         $roles = get_archetype_roles('student');
629         $studentrole = array_shift($roles);
631         echo html_writer::select($siterolesarray, "defaultstudent", $studentrole->id, array(''=>'new role'));
632         echo ('</td></tr>');
634     } else {
635         // 1.7 and above backup
636         $roles = restore_read_xml_roles($xml_file);
638         // Calculate if any role can be mapped
639         $str_new = '';
640         $canmaproles = false;
641         if (has_capability('moodle/role:manage', get_context_instance(CONTEXT_SYSTEM))) {
642             $str_new = 'new role';
643             $canmaproles = true;
644         } else if (!empty($siterolesarray)) {
645             $canmaproles = true;
646         }
648         if ($canmaproles) {
649             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>');
650         }
652         if (!empty($roles->roles)) { // possible to have course with no roles
653             foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
654                 $siteroleschoicearray[$siteroleid] = $siterolesnamearray[$siteroleid]." (". $siterolesarray[$siteroleid].")";
655             }
657             foreach ($roles->roles as $roleid=>$role) {
659                 if (!$canmaproles) { // User cannot map roles at all, add hidden element and continue
660                     echo "<tr><td colspan=\"2\"><input type=\"hidden\" name=\"roles_{$roleid}\" value=\"0\" /></td></tr>";
661                     continue;
662                 }
664                 $mappableroles = !empty($siteroleschoicearray) ? $siteroleschoicearray : array();
666                 echo ('<tr><td align="right">');
667                 echo '<label for="menuroles_'.$roleid.'">'.format_string($role->name)." (".($role->shortname).")".'</label>';
668                 echo ('</td><td align="left">');
670                 /// first, we see if any exact role definition is found
671                 /// if found, that is the only option of restoring to
673                 if ($samerole = restore_samerole($roleid, $role)) {
674                     $matchrole = $samerole->id;
675                     // if an exact role is found, it does not matter whether this user can assign this role or not,
676                     // this will be presented as a valid option regardless
677                     $mappableroles[$samerole->id] = format_string($allroles[$samerole->id]->name)." (". $allroles[$samerole->id]->shortname.")";
678                 } else {
679                     // no exact role found, let's try to match shortname
680                     // this is useful in situations where basic roles differ slightly in definition
681                     $matchrole = 0;
682                     foreach ($siterolesarray as $siteroleid=>$siteroleshortname) {
683                         if ($siteroleshortname == $role->shortname) {
684                             $matchrole = $siteroleid;
685                             break;
686                         }
687                     }
688                     // Hack a bit, so, if role continues unmatched, and was "editingteacher", and "teacher" is available
689                     // preselect it as fallback matching (can happen a lot)
690                     if ($matchrole == 0 && $role->shortname == 'editingteacher' && in_array('teacher', $siterolesarray)) {
691                         $matchrole = array_search('teacher', $siterolesarray);
692                     }
694                     // If arrived here, role continues unmatched and the user lacks the 'moodle/role:manage' capability
695                     // perform automatic matching to site defaultcourseroleid (only if available in the list)
696                     if ($matchrole == 0 && !has_capability('moodle/role:manage', get_context_instance(CONTEXT_SYSTEM))) {
697                         if (array_key_exists($CFG->defaultcourseroleid, $siterolesarray)) {
698                             $matchrole = $CFG->defaultcourseroleid;
699                         }
700                     }
701                 }
702                 echo html_writer::select($mappableroles, "roles_".$roleid, $matchrole, array('' => $str_new));
703                 echo ('</td></tr>');
704             }
705         }
707     } // end else
708     echo ('</table>'); // end of role mappings table
711 ?>
712 <br />
713 <div style="text-align:center">
714 <?php
715 /// Print captured hidden options, now that we have closed the table
716     echo $hidden_options;
717 ?>
718 <input type="hidden" name="id"     value="<?php  p($id) ?>" />
719 <input type="hidden" name="launch" value="check" />
720 <input type="hidden" name="fromform" value="1" />
721 <input type="submit" value="<?php  print_string("continue") ?>" />
722 <input type="submit" name="cancel" value="<?php  print_string("cancel") ?>" />
723 </div>
724 </div>
725 </form>
727 <?php
729 /**
730  *
731  * @param integer $roleid the id that the role in the backup files had on the old server.
732  * @param object $role the rest of the definition of the role from the backup file.
733  */
734 function restore_samerole($roleid, $rolefromxml) {
735     global $CFG, $DB;
737     // First we try some intelligent guesses, then, if none of those work, we do a more extensive
738     // search.
740     // First guess, try let's use the id
741     if (restore_is_samerole($roleid, $rolefromxml)) {
742         return $DB->get_record('role', array('id'=>$roleid));
743     }
745     // Second guess, try the shortname
746     $testroleid = $DB->get_field('role', 'id', array('shortname'=>$rolefromxml->shortname));
747     if ($testroleid && restore_is_samerole($testroleid, $rolefromxml)) {
748         return $DB->get_record('role', array('id'=>$testroleid));
749     }
751     // Finally, search all other roles. In orter to speed things up, we exclude the ones we have
752     // already tested, and we only search roles with the same number of capabilities set in their
753     // definition.
754     $extracondition = '';
755     if ($testroleid) {
756         $extracondition = "AND roleid <> $testroleid";
757     }
758     $candidateroleids = $DB->get_records_sql(
759         "SELECT roleid
760            FROM {role_capabilities}
761           WHERE roleid <> $roleid $extracondition
762        GROUP BY roleid
763          HAVING COUNT(capability) = ".count($rolefromxml->capabilities));
764     if (!empty($candidateroleids)) {
765         foreach ($candidateroleids as $testroleid => $notused) {
766             if (restore_is_samerole($testroleid, $rolefromxml)) {
767                 return $DB->get_record('role', array('id'=>$testroleid));
768             }
769         }
770     }
772     return false;
775 /**
776  * Compare a role in the database with one loaded from the backup file, and determine whether
777  * they have identical permissions for each capability.
778  * @param integer $testroleid the id of the role from the database to test against.
779  * @param object $rolefromxml the role definition loaded from the backup file.
780  * @return boolean true if the two roles are identical.
781  */
782 function restore_is_samerole($testroleid, $rolefromxml) {
783     global $DB;
785     // Load the role definition from the databse.
786     $rolefromdb = $DB->get_records('role_capabilities', array('roleid'=>$testroleid), '', 'capability,permission');
787     if (!$rolefromdb) {
788         return false;
789     }
791     // Quick check, do they have the permissions on the same number of capabilities?
792     if (count($rolefromdb) != count($rolefromxml->capabilities)) {
793         return false;
794     }
796     // If they do, check each one.
797     foreach ($rolefromdb as $capability => $permissions) {
798         if (!isset($rolefromxml->capabilities[$capability]) ||
799                 $permissions->permission != $rolefromxml->capabilities[$capability]->permission) {
800             return false;
801         }
802     }
803     return true;