diff --git a/backup/restore.php b/backup/restore.php index 2bb1be7aed8..cbd2cf0d58c 100644 --- a/backup/restore.php +++ b/backup/restore.php @@ -150,7 +150,7 @@ include_once("restore_check.html"); //To avoid multiple restore executions... $SESSION->cancontinue = true; - } else if ($launch == "execute") { + } else if ($launch == "execute") { //Prevent multiple restore executions... if (empty($SESSION->cancontinue)) { error("Multiple restore execution not allowed!"); diff --git a/backup/restore_execute.html b/backup/restore_execute.html index 161e260d725..758635c525f 100644 --- a/backup/restore_execute.html +++ b/backup/restore_execute.html @@ -42,6 +42,7 @@ error("Site not found!"); } $errorstr = ''; + $status = restore_execute($restore,$info,$course_header,$errorstr); if (!$status) { diff --git a/backup/restore_form.html b/backup/restore_form.html index 364dd8181b1..ade43092687 100644 --- a/backup/restore_form.html +++ b/backup/restore_form.html @@ -39,7 +39,7 @@ //Checks for the required files/functions to restore every mod $count = 0; - if ($allmods = get_records("modules") ) { + if ($allmods = get_records("modules") ) { foreach ($allmods as $mod) { $modname = $mod->name; $modfile = "$CFG->dirroot/mod/$modname/restorelib.php"; diff --git a/backup/restorelib.php b/backup/restorelib.php index 334928c495c..e11bb3657d2 100644 --- a/backup/restorelib.php +++ b/backup/restorelib.php @@ -307,6 +307,13 @@ return $info; } + function restore_read_xml_roles ($restore,$xml_file) { + //We call the main read_xml function, with todo = ROLES + $info = restore_read_xml ($xml_file,"ROLES",$restore); + + return $info; + } + //This function prints the contents from the info parammeter passed function restore_print_info ($info) { @@ -3000,6 +3007,21 @@ // echo $this->level.str_repeat(" ",$this->level*2)."<".$tagName.">
\n"; //Debug } + //This is the startTag handler we use where we are reading the info zone (todo="INFO") + function startElementRoles($parser, $tagName, $attrs) { + //Refresh properties + $this->level++; + $this->tree[$this->level] = $tagName; + + //Output something to avoid browser timeouts... + backup_flush(); + + //Check if we are into INFO zone + //if ($this->tree[2] == "INFO") //Debug + // echo $this->level.str_repeat(" ",$this->level*2)."<".$tagName.">
\n"; //Debug + } + + //This is the startTag handler we use where we are reading the course header zone (todo="COURSE_HEADER") function startElementCourseHeader($parser, $tagName, $attrs) { //Refresh properties @@ -3398,7 +3420,82 @@ $this->level--; $this->content = ""; - } + } + + function endElementRoles($parser, $tagName) { + //Check if we are into INFO zone + if ($this->tree[2] == "ROLES") { + + if ($this->tree[3] == "ROLE") { + if ($this->level == 4) { + switch ($tagName) { + case "NAME": + $this->info->tempname = $this->getContents(); + + break; + case "SHORTNAME": + $this->info->tempshortname = $this->getContents(); + break; + } + } + if ($this->level == 6) { + switch ($tagName) { + case "NAME": + $this->info->roles[$this->info->tempshortname]->name = $this->info->tempname; + $this->info->roles[$this->info->tempshortname]->shortname = $this->info->tempshortname; + + $this->info->tempcapname = $this->getContents(); + $this->info->roles[$this->info->tempshortname]->capabilities[$this->info->tempcapname]->name = $this->getContents(); + break; + case "PERMISSION": + $this->info->roles[$this->info->tempshortname]->capabilities[$this->info->tempcapname]->permission = $this->getContents(); + break; + case "TIMEMODIFIED": + $this->info->roles[$this->info->tempshortname]->capabilities[$this->info->tempcapname]->timemodified = $this->getContents(); + break; + case "MODIFIERID": + $this->info->roles[$this->info->tempshortname]->capabilities[$this->info->tempcapname]->modifierid = $this->getContents(); + break; + } + } + } + } + + //Stop parsing if todo = INFO and tagName = INFO (en of the tag, of course) + //Speed up a lot (avoid parse all) + if ($tagName == "ROLES") { + $this->finished = true; + } + + //Clear things + $this->tree[$this->level] = ""; + $this->level--; + $this->content = ""; + + } + + + + + + + + + + + + + + + + + + + + + + + //This is the endTag handler we use where we are reading the course_header zone (todo="COURSE_HEADER") function endElementCourseHeader($parser, $tagName) { @@ -4535,6 +4632,9 @@ if ($todo == "INFO") { //Define handlers to that zone xml_set_element_handler($xml_parser, "startElementInfo", "endElementInfo"); + } else if ($todo == "ROLES") { + // Define handlers to that zone + xml_set_element_handler($xml_parser, "startElementRoles", "endElementRoles"); } else if ($todo == "COURSE_HEADER") { //Define handlers to that zone xml_set_element_handler($xml_parser, "startElementCourseHeader", "endElementCourseHeader"); @@ -4864,8 +4964,10 @@ } function restore_execute(&$restore,$info,$course_header,&$errorstr) { + global $CFG; - $status = true; + $status = true; + //Checks for the required files/functions to restore every module //and include them if ($allmods = get_records("modules") ) { @@ -4889,7 +4991,7 @@ } //Localtion of the xml file - $xml_file = $CFG->dataroot."/temp/backup/".$restore->backup_unique_code."/moodle.xml"; + $xml_file = $CFG->dataroot."/temp/backup/".$restore->backup_unique_code."/moodle.xml"; //If we've selected to restore into new course //create it (course) @@ -5371,13 +5473,21 @@ fix_course_sortorder(); //Make the user a teacher if the course hasn't teachers (bug 2381) if (!has_capability('moodle/site:restore', get_context_instance(CONTEXT_SYSTEM, SITEID))) { + /* this is not working if (!$checktea = get_records('user_teachers','course', $restore->course_id)) { //Add the teacher to the course $status = add_teacher($USER->id, $restore->course_id); - } + } */ } } + /******************************************************************************* + ************* Restore of Roles and Capabilities happens here ****************** + *******************************************************************************/ + restore_create_roles($restore, $xml_file); + restore_assign_roles($restore, $xml_file); + restore_override_roles($restore, $xml_file); + //Cleanup temps (files and db) if ($status) { if (!defined('RESTORE_SILENTLY')) { @@ -5434,7 +5544,7 @@ fwrite ($restorelog_file,"The Originating Courses Start Date was " .$date['weekday'].", ".$date['mday']." ".$date['month']." ".$date['year'].""); $startdate += $restore->course_startdateoffset; $date = usergetdate($startdate); - fwrite ($restorelog_file,"   This Courses Start Date is now " .$date['weekday'].", ".$date['mday']." ".$date['month']." ".$date['year']."

"); + fwrite ($restorelog_file,"   This Courses Start Date is now " .$date['weekday'].", ".$date['mday']." ".$date['month']." ".$date['year']."

"); if ($status) { return $restorelog_file; @@ -5465,5 +5575,36 @@ return false; } } + /* This function should check for duplicate roles first + It isn't now, just overwriting + */ + function restore_create_roles($restore, $xmlfile) { + /* + $info = restore_read_xml_roles($restore, $xmlfile); + + $sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID); + foreach ($info->roles as $rolename=>$roledata) { + $newroleid = create_role($roledata->name.'XYZ',$roledata->shortname.'XYZ',''); + foreach ($roledata->capabilities as $capability) { + + $roleinfo = new object(); + $roleinfo = (object)$capability; + $roleinfo->contextid = $sitecontext->id; + $roleinfo->capability = $capability->name; + $roleinfo->roleid = $newroleid; + + insert_record('role_capabilities', $roleinfo); + } + }*/ + } + + function restore_assign_roles($restore, $xmlfile) { + // data pulls from course, mod, user, and blocks + $course = restore_read_xml_course_header($xmlfile); + print_object($course); + } + function restore_override_roles($restore, $xmlfile) { + // data pulls from course, mod, user, and blocks + } ?> \ No newline at end of file