From: stronk7 Date: Sun, 20 Apr 2008 02:03:00 +0000 (+0000) Subject: Restore of blogs in SITE page added. MDL-9089 ; merged from 19_STABLE X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=8b6ccde7b06b2b993354303fc734d7b88e87bbe5;p=moodle.git Restore of blogs in SITE page added. MDL-9089 ; merged from 19_STABLE --- diff --git a/backup/restore_check.html b/backup/restore_check.html index 1151e8ccab..ae992d12d1 100644 --- a/backup/restore_check.html +++ b/backup/restore_check.html @@ -98,7 +98,9 @@ $restore_gradebook_history = required_param('restore_gradebook_history', PARAM_INT); //restore_messages $restore_messages = required_param('restore_messages', PARAM_INT); - + //restore_blogs + $restore_blogs = required_param('restore_blogs', PARAM_INT); + //Check we've selected a course to restore to $course_id = optional_param('course_id', 0, PARAM_INT); @@ -134,6 +136,7 @@ $restore->course_files=$restore_course_files; $restore->site_files=$restore_site_files; $restore->messages=$restore_messages; + $restore->blogs=$restore_blogs; $restore->restore_gradebook_history=$restore_gradebook_history; $restore->course_id=$course_id; //add new vars to restore object @@ -283,8 +286,8 @@ $changed = true; } } - //If we have selected user files or messages, then users must be restored too - if ($restore->user_files || $restore->messages) { + //If we have selected user files or messages or blogs, then users must be restored too + if ($restore->user_files || $restore->messages || $restore->blogs) { $changed = 1; } if ($changed) { diff --git a/backup/restore_form.html b/backup/restore_form.html index aeb7651fbc..ce89b3a71d 100644 --- a/backup/restore_form.html +++ b/backup/restore_form.html @@ -103,7 +103,11 @@ if (!isset($restore_messages)) { $restore_messages = 1; - } + } + + if (!isset($restore_blogs)) { + $restore_blogs = 1; + } if (!isset($restore_restoreto)) { if (!user_can_create_courses()) { @@ -545,12 +549,12 @@ function selectItemInCheckboxByName(formId, checkName, checked ) { } else { $hidden_options .= ''; } - //This tr is slighty different. Everything becomes hidden if //we haven't messages is the backup, to avoid confusions to users. //If messages are in the backup file, show menu, else fixed to no and show nothing - if (isset($info->backup_messages) && $info->backup_messages == "true") { + //Also, messaging must be enabled in the destination site + if (isset($info->backup_messages) && $info->backup_messages == "true" && !empty($CFG->messaging)) { echo ""; echo ""; echo ''; @@ -563,7 +567,25 @@ function selectItemInCheckboxByName(formId, checkName, checked ) { } else { $hidden_options .= ''; } - + + //This tr is slighty different. Everything becomes hidden if + //we haven't blogs is the backup, to avoid confusions to users. + //If blogs are in the backup file, show menu, else fixed to no and show nothing + //Also, blogs must be enabled in the destination site + if (isset($info->backup_blogs) && $info->backup_blogs == "true" && !empty($CFG->bloglevel)) { + echo ""; + echo ""; + echo ''; + echo ""; + $blog_options = array(); + $blog_options[0] = get_string("no"); + $blog_options[1] = get_string("yes"); + choose_from_menu($blog_options, "restore_blogs", $restore_blogs, ""); + echo ""; + } else { + $hidden_options .= ''; + } + } ?> diff --git a/backup/restorelib.php b/backup/restorelib.php index d20491c972..b2ddf34e52 100644 --- a/backup/restorelib.php +++ b/backup/restorelib.php @@ -325,6 +325,16 @@ define('RESTORE_GROUPS_GROUPINGS', 3); return $info; } + //This function read the xml file and store its data from the blogs in + //backup_ids->blog and backup_ids->blog_tag and db (and their counters in info) + function restore_read_xml_blogs ($restore,$xml_file) { + + //We call the main read_xml function, with todo = BLOGS + $info = restore_read_xml ($xml_file,"BLOGS",$restore); + + return $info; + } + //This function read the xml file and store its data from the questions in //backup_ids->info db (and category's id in $info) @@ -541,6 +551,15 @@ define('RESTORE_GROUPS_GROUPINGS', 3); } else { //Do nothing } + $elem++; + //Blogs info (only showed if present) + if (isset($info->backup_blogs) && $info->backup_blogs == 'true') { + $tab[$elem][0] = "".get_string('blogs','blog').":"; + $tab[$elem][1] = get_string('yes'); + $elem++; + } else { + //Do nothing + } $table->data = $tab; //Print title print_heading(get_string("backupdetails").":"); @@ -2933,6 +2952,127 @@ define('RESTORE_GROUPS_GROUPINGS', 3); return $status; } + //This function creates all the structures for blogs and blog tags + function restore_create_blogs($restore,$xml_file) { + + global $CFG; + + $status = true; + //Check it exists + if (!file_exists($xml_file)) { + $status = false; + } + //Get info from xml + if ($status) { + //info will contain the number of blogs in the backup file + //in backup_ids->info will be the real info (serialized) + $info = restore_read_xml_blogs($restore,$xml_file); + + //If we have info, then process blogs & blog_tags + if ($info > 0) { + //Count how many we have + $blogcount = count_records ('backup_ids', 'backup_code', $restore->backup_unique_code, 'table_name', 'blog'); + if ($blogcount) { + //Number of records to get in every chunk + $recordset_size = 4; + + //Process blog + if ($blogcount) { + $counter = 0; + while ($counter < $blogcount) { + //Fetch recordset_size records in each iteration + $recs = get_records_select("backup_ids","table_name = 'blog' AND backup_code = '$restore->backup_unique_code'","old_id","old_id",$counter,$recordset_size); + if ($recs) { + foreach ($recs as $rec) { + //Get the full record from backup_ids + $data = backup_getid($restore->backup_unique_code,"blog",$rec->old_id); + if ($data) { + //Now get completed xmlized object + $info = $data->info; + //traverse_xmlize($info); //Debug + //print_object ($GLOBALS['traverse_array']); //Debug + //$GLOBALS['traverse_array']=""; //Debug + //Now build the BLOG record structure + $dbrec = new object(); + $dbrec->module = backup_todb($info['BLOG']['#']['MODULE']['0']['#']); + $dbrec->userid = backup_todb($info['BLOG']['#']['USERID']['0']['#']); + $dbrec->courseid = backup_todb($info['BLOG']['#']['COURSEID']['0']['#']); + $dbrec->groupid = backup_todb($info['BLOG']['#']['GROUPID']['0']['#']); + $dbrec->moduleid = backup_todb($info['BLOG']['#']['MODULEID']['0']['#']); + $dbrec->coursemoduleid = backup_todb($info['BLOG']['#']['COURSEMODULEID']['0']['#']); + $dbrec->subject = backup_todb($info['BLOG']['#']['SUBJECT']['0']['#']); + $dbrec->summary = backup_todb($info['BLOG']['#']['SUMMARY']['0']['#']); + $dbrec->content = backup_todb($info['BLOG']['#']['CONTENT']['0']['#']); + $dbrec->uniquehash = backup_todb($info['BLOG']['#']['UNIQUEHASH']['0']['#']); + $dbrec->rating = backup_todb($info['BLOG']['#']['RATING']['0']['#']); + $dbrec->format = backup_todb($info['BLOG']['#']['FORMAT']['0']['#']); + $dbrec->attachment = backup_todb($info['BLOG']['#']['ATTACHMENT']['0']['#']); + $dbrec->publishstate = backup_todb($info['BLOG']['#']['PUBLISHSTATE']['0']['#']); + $dbrec->lastmodified = backup_todb($info['BLOG']['#']['LASTMODIFIED']['0']['#']); + $dbrec->created = backup_todb($info['BLOG']['#']['CREATED']['0']['#']); + $dbrec->usermodified = backup_todb($info['BLOG']['#']['USERMODIFIED']['0']['#']); + + //We have to recode the userid field + $user = backup_getid($restore->backup_unique_code,"user",$dbrec->userid); + if ($user) { + //echo "User ".$dbrec->userid." to user ".$user->new_id."
"; //Debug + $dbrec->userid = $user->new_id; + } + + //Check if the record doesn't exist in DB! + $exist = get_record('post','userid', $dbrec->userid, + 'subject', $dbrec->subject, + 'created', $dbrec->created); + $newblogid = 0; + if (!$exist) { + //Not exist. Insert + $newblogid = insert_record('post',$dbrec); + } + + //Going to restore related tags. Check they are enabled and we have inserted a blog + if ($CFG->usetags && $newblogid) { + //Look for tags in this blog + if (isset($info['BLOG']['#']['BLOG_TAGS']['0']['#']['BLOG_TAG'])) { + $tagsarr = $info['BLOG']['#']['BLOG_TAGS']['0']['#']['BLOG_TAG']; + //Iterate over tags + $tags = array(); + for($i = 0; $i < sizeof($tagsarr); $i++) { + $tag_info = $tagsarr[$i]; + ///traverse_xmlize($tag_info); //Debug + ///print_object ($GLOBALS['traverse_array']); //Debug + ///$GLOBALS['traverse_array']=""; //Debug + + $name = backup_todb($tag_info['#']['NAME']['0']['#']); + $rawname = backup_todb($tag_info['#']['RAWNAME']['0']['#']); + + $tags[] = $rawname; //Rawname is all we need + } + tag_set('post', $newblogid, $tags); //Add all the tags in one API call + } + } + } + //Do some output + $counter++; + if ($counter % 10 == 0) { + if (!defined('RESTORE_SILENTLY')) { + echo "."; + if ($counter % 200 == 0) { + echo "
"; + } + } + backup_flush(300); + } + } + } + } + } + } + } + } + + return $status; + } + //This function creates all the categories and questions //from xml function restore_create_questions($restore,$xml_file) { @@ -4466,7 +4606,31 @@ define('RESTORE_GROUPS_GROUPINGS', 3); //If we are under a MESSAGE tag under a MESSAGES zone, accumule it if (isset($this->tree[4]) and isset($this->tree[3])) { - if (($this->tree[4] == "MESSAGE" || $this->tree[5] == "CONTACT" ) and ($this->tree[3] == "MESSAGES")) { + if (($this->tree[4] == "MESSAGE" || (isset($this->tree[5]) && $this->tree[5] == "CONTACT" )) and ($this->tree[3] == "MESSAGES")) { + if (!isset($this->temp)) { + $this->temp = ""; + } + $this->temp .= "<".$tagName.">"; + } + } + } + + //This is the startTag handler we use where we are reading the blogs zone (todo="BLOGS") + function startElementBlogs($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 BLOGS zone + //if ($this->tree[3] == "BLOGS") //Debug + // echo $this->level.str_repeat(" ",$this->level*2)."<".$tagName.">
\n"; //Debug + + //If we are under a BLOG tag under a BLOGS zone, accumule it + if (isset($this->tree[4]) and isset($this->tree[3])) { + if ($this->tree[4] == "BLOG" and $this->tree[3] == "BLOGS") { if (!isset($this->temp)) { $this->temp = ""; } @@ -4474,6 +4638,7 @@ define('RESTORE_GROUPS_GROUPINGS', 3); } } } + //This is the startTag handler we use where we are reading the questions zone (todo="QUESTIONS") function startElementQuestions($parser, $tagName, $attrs) { //Refresh properties @@ -4769,6 +4934,9 @@ define('RESTORE_GROUPS_GROUPINGS', 3); case "MESSAGES": $this->info->backup_messages = $this->getContents(); break; + case "BLOGS": + $this->info->backup_blogs = $this->getContents(); + break; case 'BLOCKFORMAT': $this->info->backup_block_format = $this->getContents(); break; @@ -6399,6 +6567,58 @@ define('RESTORE_GROUPS_GROUPINGS', 3); } + //This is the endTag handler we use where we are reading the blogs zone (todo="BLOGS") + function endElementBlogs($parser, $tagName) { + //Check if we are into BLOGS zone + if ($this->tree[3] == "BLOGS") { + //if (trim($this->content)) //Debug + // echo "C".str_repeat(" ",($this->level+2)*2).$this->getContents()."
\n"; //Debug + //echo $this->level.str_repeat(" ",$this->level*2)."</".$tagName.">
\n";//Debug + //Acumulate data to info (content + close tag) + //Reconvert: strip htmlchars again and trim to generate xml data + if (!isset($this->temp)) { + $this->temp = ""; + } + $this->temp .= htmlspecialchars(trim($this->content)).""; + //If we've finished a blog, xmlize it an save to db + if (($this->level == 4) and ($tagName == "BLOG")) { + //Prepend XML standard header to info gathered + $xml_data = "\n".$this->temp; + //Call to xmlize for this portion of xml data (one BLOG) + //echo "-XMLIZE: ".strftime ("%X",time()),"-"; //Debug + $data = xmlize($xml_data,0); + //echo strftime ("%X",time())."

"; //Debug + //traverse_xmlize($data); //Debug + //print_object ($GLOBALS['traverse_array']); //Debug + //$GLOBALS['traverse_array']=""; //Debug + //Now, save data to db. We'll use it later + //Get id from data + $blog_id = $data["BLOG"]["#"]["ID"]["0"]["#"]; + $this->counter++; + //Save to db + $status = backup_putid($this->preferences->backup_unique_code, 'blog', $blog_id, + null,$data); + //Create returning info + $this->info = $this->counter; + //Reset temp + unset($this->temp); + } + } + + //Stop parsing if todo = BLOGS and tagName = BLOGS (end of the tag, of course) + //Speed up a lot (avoid parse all) + if ($tagName == "BLOGS" and $this->level == 3) { + $this->finished = true; + $this->counter = 0; + } + + //Clear things + $this->tree[$this->level] = ""; + $this->level--; + $this->content = ""; + + } + //This is the endTag handler we use where we are reading the questions zone (todo="QUESTIONS") function endElementQuestions($parser, $tagName) { //Check if we are into QUESTION_CATEGORIES zone @@ -6871,6 +7091,8 @@ define('RESTORE_GROUPS_GROUPINGS', 3); xml_set_element_handler($xml_parser, "startElementUsers", "endElementUsers"); } else if ($todo == "MESSAGES") { xml_set_element_handler($xml_parser, "startElementMessages", "endElementMessages"); + } else if ($todo == "BLOGS") { + xml_set_element_handler($xml_parser, "startElementBlogs", "endElementBlogs"); } else if ($todo == "QUESTIONS") { xml_set_element_handler($xml_parser, "startElementQuestions", "endElementQuestions"); } else if ($todo == "SCALES") { @@ -7624,6 +7846,24 @@ define('RESTORE_GROUPS_GROUPINGS', 3); } } + //Now create blogs as needed + if ($status and ($restore->blogs)) { + if (!defined('RESTORE_SILENTLY')) { + echo "

  • ".get_string("creatingblogsinfo"); + } + if (!$status = restore_create_blogs($restore,$xml_file)) { + if (!defined('RESTORE_SILENTLY')) { + notify("Could not restore blogs!"); + } else { + $errorstr = "Could not restore blogs!"; + return false; + } + } + if (!defined('RESTORE_SILENTLY')) { + echo "
  • "; + } + } + //Now create scales as needed if ($status) { if (!defined('RESTORE_SILENTLY')) {