info; $course_header = $SESSION->course_header; $restore = $SESSION->restore; } //Add info->original_wwwroot to $restore to be able to use it in all the restore process //(mainly when decoding internal links) $restore->original_wwwroot = $info->original_wwwroot; //Check login require_login(); //Check admin if (!empty($id)) { if (!isteacheredit($id)) { error("You need to be a teacher or admin user to use this page.", "$CFG->wwwroot/login/index.php"); } } else { if (!isadmin()) { error("You need to be an admin user to use this page.", "$CFG->wwwroot/login/index.php"); } } //Check site if (!$site = get_site()) { error("Site not found!"); } //Checks for the required files/functions to restore every module //and include them if ($allmods = get_records("modules") ) { foreach ($allmods as $mod) { $modname = $mod->name; $modfile = "$CFG->dirroot/mod/$modname/restorelib.php"; //If file exists and we have selected to restore that type of module if ((file_exists($modfile)) and ($restore->mods[$modname]->restore)) { include_once($modfile); } } } //Start the main table echo ""; echo ""; echo "
"; //Start the main ul echo "
    "; //Init status $status = true; //Localtion of the xml file $xml_file = $CFG->dataroot."/temp/backup/".$restore->backup_unique_code."/moodle.xml"; //If we've selected to restore into new course //create it (course) //Saving conversion id variables into backup_tables if ($restore->restoreto == 2) { echo "
  • ".get_string("creatingnewcourse"); $oldidnumber = $course_header->course_idnumber; if (!$status = restore_create_new_course($restore,$course_header)) { notify("Error while creating the new empty course."); } //Print course fullname and shortname and category if ($status) { echo "
      "; echo "
    • ".$course_header->course_fullname." (".$course_header->course_shortname.")"; echo "
    • ".get_string("category").": ".$course_header->category->name; if (!empty($oldidnumber)) { echo "
    • ".get_string("nomoreidnumber","moodle",$oldidnumber)."
    • "; } echo "
    "; //Put the destination course_id $restore->course_id = $course_header->course_id; } } else { $course = get_record("course","id",$restore->course_id); if ($course) { echo "
  • ".get_string("usingexistingcourse"); echo "
      "; echo "
    • ".get_string("from").": ".$course_header->course_fullname." (".$course_header->course_shortname.")"; echo "
    • ".get_string("to").": ".$course->fullname." (".$course->shortname.")"; if (($restore->deleting)) { echo "
    • ".get_string("deletingexistingcoursedata"); } else { echo "
    • ".get_string("addingdatatoexisting"); } echo "
    "; //If we have selected to restore deleting, we do it now. if ($restore->deleting) { echo "
  • ".get_string("deletingolddata"); $status = remove_course_contents($restore->course_id,false) and delete_dir_contents($CFG->dataroot."/".$restore->course_id,"backupdata"); if ($status) { //Now , this situation is equivalent to the "restore to new course" one (we //have a course record and nothing more), so define it as "to new course" $restore->restoreto = 2; } else { notify("An error occurred while deleting some of the course contents."); } } } else { notify("Error opening existing course."); $status = false; } } //Bring back the course blocks if($status) { echo '
  • '.get_string('creatingblocks'); //If we are deleting and bringing into a course or making a new course, same situation if($restore->restoreto == 0 || $restore->restoreto == 2) { delete_records('block_instance', 'pageid', $course_header->course_id, 'pagetype', MOODLE_PAGE_COURSE); if (empty($info->backup_block_format)) { // This is a backup from Moodle < 1.5 if (empty($course_header->blockinfo)) { // Looks like it's from Moodle < 1.3. Let's give the course default blocks... $newpage = page_create_object(MOODLE_PAGE_COURSE, $course_header->course_id); blocks_repopulate_page($newpage); } else { // We just have a blockinfo field, this is a legacy 1.4 or 1.3 backup $blockrecords = get_records_select('block', '', '', 'name, id'); $temp_blocks_l = array(); $temp_blocks_r = array(); @list($temp_blocks_l, $temp_blocks_r) = explode(':', $course_header->blockinfo); $temp_blocks = array(BLOCK_POS_LEFT => explode(',', $temp_blocks_l), BLOCK_POS_RIGHT => explode(',', $temp_blocks_r)); foreach($temp_blocks as $blockposition => $blocks) { $blockweight = 0; foreach($blocks as $blockname) { if(!isset($blockrecords[$blockname])) { // We don't know anything about this block! continue; } $blockinstance = new stdClass; // Remove any - prefix before doing the name-to-id mapping if(substr($blockname, 0, 1) == '-') { $blockname = substr($blockname, 1); $blockinstance->visible = 0; } else { $blockinstance->visible = 1; } $blockinstance->blockid = $blockrecords[$blockname]->id; $blockinstance->pageid = $course_header->course_id; $blockinstance->pagetype = MOODLE_PAGE_COURSE; $blockinstance->position = $blockposition; $blockinstance->weight = $blockweight; if(!$status = insert_record('block_instance', $blockinstance)) { notify('Error while creating the course blocks'); } ++$blockweight; } } } } else if($info->backup_block_format == 'instances') { if(!$status = restore_create_block_instances($restore,$xml_file)) { notify('Error while creating the course blocks'); } } } //Otherwise we are adding the backup into an existing course; do nothing else { } } //Now create the course_sections and their associated course_modules if ($status) { //Into new course if ($restore->restoreto == 2) { echo "
  • ".get_string("creatingsections"); if (!$status = restore_create_sections($restore,$xml_file)) { notify("Error creating sections in the existing course."); } //Into existing course } else if ($restore->restoreto == 0 or $restore->restoreto == 1) { echo "
  • ".get_string("checkingsections"); if (!$status = restore_create_sections($restore,$xml_file)) { notify("Error creating sections in the existing course."); } //Error } else { notify("Neither a new course or an existing one was specified."); $status = false; } } //Now create users as needed if ($status and ($restore->users == 0 or $restore->users == 1)) { echo "
  • ".get_string("creatingusers")."
    "; if (!$status = restore_create_users($restore,$xml_file)) { notify("Could not restore users."); } //Now print info about the work done if ($status) { $recs = get_records_sql("select old_id, new_id from {$CFG->prefix}backup_ids where backup_code = '$restore->backup_unique_code' and table_name = 'user'"); //We've records if ($recs) { $new_count = 0; $exists_count = 0; $student_count = 0; $teacher_count = 0; $counter = 0; //Iterate, filling counters foreach ($recs as $rec) { //Get full record, using backup_getids $record = backup_getid($restore->backup_unique_code,"user",$rec->old_id); if (strpos($record->info,"new") !== false) { $new_count++; } if (strpos($record->info,"exists") !== false) { $exists_count++; } if (strpos($record->info,"student") !== false) { $student_count++; } else if (strpos($record->info,"teacher") !== false) { $teacher_count++; } //Do some output $counter++; if ($counter % 10 == 0) { echo "."; if ($counter % 200 == 0) { echo "
    "; } backup_flush(300); } } //Now print information gathered echo " (".get_string("new").": ".$new_count.", ".get_string("existing").": ".$exists_count.")"; echo "
      "; echo "
    • ".get_string("students").": ".$student_count; echo "
    • ".get_string("teachers").": ".$teacher_count; echo "
    "; } else { notify("No users were found!"); } } } //Now create categories and questions as needed (STEP1) if ($status and ($restore->mods['quiz']->restore)) { echo "
  • ".get_string("creatingcategoriesandquestions")."
    "; if (!$status = restore_create_questions($restore,$xml_file)) { notify("Could not restore categories and questions!"); } } //Now create user_files as needed if ($status and ($restore->user_files)) { echo "
  • ".get_string("copyinguserfiles")."
    "; if (!$status = restore_user_files($restore)) { notify("Could not restore user files!"); } //If all is ok (and we have a counter) if ($status and ($status !== true)) { //Inform about user dirs created from backup echo "
      "; echo "
    • ".get_string("userzones").": ".$status; echo "
    "; } } //Now create course files as needed if ($status and ($restore->course_files)) { echo "
  • ".get_string("copyingcoursefiles")."
    "; if (!$status = restore_course_files($restore)) { notify("Could not restore course files!"); } //If all is ok (and we have a counter) if ($status and ($status !== true)) { //Inform about user dirs created from backup echo "
      "; echo "
    • ".get_string("filesfolders").": ".$status; echo "
    "; } } //Now create scales as needed if ($status) { echo "
  • ".get_string("creatingscales"); if (!$status = restore_create_scales($restore,$xml_file)) { notify("Could not restore custom scales!"); } } //Now create groups as needed if ($status) { echo "
  • ".get_string("creatinggroups"); if (!$status = restore_create_groups($restore,$xml_file)) { notify("Could not restore groups!"); } } //Now create events as needed if ($status) { echo "
  • ".get_string("creatingevents"); if (!$status = restore_create_events($restore,$xml_file)) { notify("Could not restore course events!"); } } //Now create course modules as needed if ($status) { echo "
  • ".get_string("creatingcoursemodules"); if (!$status = restore_create_modules($restore,$xml_file)) { notify("Could not restore modules!"); } } //Now create log entries as needed if ($status and ($restore->logs)) { echo "
  • ".get_string("creatinglogentries"); if (!$status = restore_create_logs($restore,$xml_file)) { notify("Could not restore logs!"); } } //Now, if all is OK, adjust the instance field in course_modules !! if ($status) { echo "
  • ".get_string("checkinginstances"); if (!$status = restore_check_instances($restore)) { notify("Could not adjust instances in course_modules!"); } } //Now, if all is OK, adjust activity events if ($status) { echo "
  • ".get_string("refreshingevents"); if (!$status = restore_refresh_events($restore)) { notify("Could not refresh events for activities!"); } } //Now, if all is OK, adjust inter-activity links if ($status) { echo "
  • ".get_string("decodinginternallinks"); if (!$status = restore_decode_content_links($restore)) { notify("Could not refresh events for activities!"); } } //Now if all is OK, update: // - course modinfo field // - categories table if ($status) { echo "
  • ".get_string("checkingcourse"); //modinfo field rebuild_course_cache($restore->course_id); //categories table $course = get_record("course","id",$restore->course_id); fix_course_sortorder(); } //Cleanup temps (files and db) if ($status) { echo "
  • ".get_string("cleaningtempdata"); if (!$status = clean_temp_data ($restore)) { notify("Could not clean up temporary data from files and database"); } } //End the main ul echo "
"; //End the main table echo "
"; if (!$status) { error ("An error has occurred and the restore could not be completed!"); } //Print final message print_simple_box(get_string("restorefinished"),"center"); print_continue("$CFG->wwwroot/course/view.php?id=".$restore->course_id); ?>