diff --git a/mod/quiz/backuplib.php b/mod/quiz/backuplib.php index ef943090d0e..28b92831230 100644 --- a/mod/quiz/backuplib.php +++ b/mod/quiz/backuplib.php @@ -121,7 +121,7 @@ g.question = t.id",false); //Now, foreach detected category, we look for their parents upto 0 (top category) - $categories = get_records_sql("SELECT old_id, old_id + $categories = get_records_sql("SELECT old_id, old_id FROM {$CFG->prefix}backup_ids WHERE backup_code = $backup_unique_code AND table_name = 'quiz_categories'"); @@ -190,7 +190,7 @@ } } } - + //Delete category ids from backup_ids table function delete_category_ids ($backup_unique_code) { global $CFG; @@ -459,7 +459,7 @@ foreach ($numericals as $numerical) { $status =fwrite ($bf,start_tag("NUMERICAL",$level,true)); //Print numerical contents - fwrite ($bf,full_tag("ANSWERS",$level+1,false,$numerical->answers)); + fwrite ($bf,full_tag("ANSWER",$level+1,false,$numerical->answer)); fwrite ($bf,full_tag("TOLERANCE",$level+1,false,$numerical->tolerance)); //Now backup numerical_units $status = quiz_backup_numerical_units($bf,$preferences,$question,7); @@ -491,21 +491,8 @@ $status =fwrite ($bf,start_tag("MULTIANSWER",7,true)); //Print multianswer contents fwrite ($bf,full_tag("ID",8,false,$multianswer->id)); - fwrite ($bf,full_tag("ANSWERS",8,false,$multianswer->answers)); - fwrite ($bf,full_tag("POSITIONKEY",8,false,$multianswer->positionkey)); - fwrite ($bf,full_tag("ANSWERTYPE",8,false,$multianswer->answertype)); - fwrite ($bf,full_tag("NORM",8,false,$multianswer->norm)); - //Depending of the ANSWERTYPE, we must encode different info - //to be able to re-create records in quiz_shortanswer, quiz_multichoice and - //quiz_numerical - if ($multianswer->answertype == "1") { - $status = quiz_backup_shortanswer($bf,$preferences,$question,8,false); - } else if ($multianswer->answertype == "3") { - $status = quiz_backup_multichoice($bf,$preferences,$question,8,false); - } else if ($multianswer->answertype == "8") { - $status = quiz_backup_numerical($bf,$preferences,$question,8,false); - } - + fwrite ($bf,full_tag("QUESTION",8,false,$multianswer->question)); + fwrite ($bf,full_tag("SEQUENCE",8,false,$multianswer->sequence)); $status =fwrite ($bf,end_tag("MULTIANSWER",7,true)); } //Print multianswers footer diff --git a/mod/quiz/questiontypes/multianswer/questiontype.php b/mod/quiz/questiontypes/multianswer/questiontype.php index 07861b3a241..c587292bfc3 100644 --- a/mod/quiz/questiontypes/multianswer/questiontype.php +++ b/mod/quiz/questiontypes/multianswer/questiontype.php @@ -37,8 +37,8 @@ class quiz_embedded_cloze_qtype extends quiz_default_questiontype { foreach ($wrappedquestions as $wrapped) { if (!$QUIZ_QTYPES[$wrapped->qtype] ->get_question_options($wrapped)) { - error("Unable to recognized questiontype " . - $wrapped->qtype); + notify("Unable to get options for questiontype + {$wrapped->qtype} (id={$wrapped->id})"); } $wrapped->maxgrade = $wrapped->defaultgrade; $question->options->questions[$sequence[$wrapped->id]] = clone($wrapped); diff --git a/mod/quiz/restorelib.php b/mod/quiz/restorelib.php index 9ea3c04aa17..890dbfacecd 100644 --- a/mod/quiz/restorelib.php +++ b/mod/quiz/restorelib.php @@ -4,9 +4,9 @@ // Todo: // the restoration of the parent and sortorder fields in the category table needs - // a lot more thought. We should probably use a library function to add the category + // a lot more thought. We should probably use a library function to add the category // rather than just writing it to the database - + // whereever it says "/// We have to recode the .... field" we should put in a check // to see if the recoding was successful and throw an appropriate error otherwise @@ -135,7 +135,7 @@ $quiz_cat->parent = backup_todb($info['QUESTION_CATEGORY']['#']['PARENT']['0']['#']); $quiz_cat->sortorder = backup_todb($info['QUESTION_CATEGORY']['#']['SORTORDER']['0']['#']); - if ($catfound = restore_get_best_quiz_category($quiz_cat, $restore->course)) { + if ($catfound = restore_get_best_quiz_category($quiz_cat, $restore->course)) { $newid = $catfound; } else { if (!$quiz_cat->stamp) { @@ -175,6 +175,7 @@ global $CFG; $status = true; + $restored_questions = array(); //Get the questions array $questions = $info['QUESTION_CATEGORY']['#']['QUESTIONS']['0']['#']['QUESTION']; @@ -206,7 +207,7 @@ ////We have to recode the parent field // This should work alright because we ordered the questions appropriately during backup so that - // questions that can be parents are restored first + // questions that can be parents are restored first if ($question->parent and $parent = backup_getid($restore->backup_unique_code,"quiz_questions",$question->parent)) { $question->parent = $parent->new_id; } @@ -227,22 +228,32 @@ $creatingnewquestion = true; } - //Do some output - if (($i+1) % 2 == 0) { - echo "."; - if (($i+1) % 40 == 0) { - echo "
"; - } - backup_flush(300); - } //Save newid to backup tables if ($newid) { //We have the newid, update backup_ids backup_putid($restore->backup_unique_code,"quiz_questions",$oldid, $newid); } + + $restored_questions[$i] = new stdClass; + $restored_questions[$i]->newid = $newid; + $restored_questions[$i]->oldid = $oldid; + $restored_questions[$i]->qtype = $question->qtype; + $restored_questions[$i]->is_new = $creatingnewquestion; + } + + // Loop again, now all the question id mappings exist, so everything can + // be restored. + for($i = 0; $i < sizeof($questions); $i++) { + $que_info = $questions[$i]; + + $newid = $restored_questions[$i]->newid; + $oldid = $restored_questions[$i]->oldid; + $question->qtype = $restored_questions[$i]->qtype; + + //If it's a new question in the DB, restore it - if ($creatingnewquestion) { + if ($restored_questions[$i]->is_new) { //Now, restore every quiz_answers in this question $status = quiz_restore_answers($oldid,$newid,$que_info,$restore); //Now, depending of the type of questions, invoke different functions @@ -268,8 +279,7 @@ $status = quiz_restore_calculated($oldid,$newid,$que_info,$restore); } else if ($question->qtype == "11") { $status = quiz_restore_rqp($oldid,$newid,$que_info,$restore); - } - + } } else { //We are NOT creating the question, but we need to know every quiz_answers //map between the XML file and the database to be able to restore the states @@ -300,6 +310,15 @@ //Calculated question. Nothing to remap } } + + //Do some output + if (($i+1) % 2 == 0) { + echo "."; + if (($i+1) % 40 == 0) { + echo "
"; + } + backup_flush(300); + } } return $status; } @@ -836,13 +855,13 @@ //Now, build the QUIZ_NUMERICAL record structure $numerical->question = $new_question_id; - $numerical->answers = backup_todb($num_info['#']['ANSWERS']['0']['#']); + $numerical->answer = backup_todb($num_info['#']['ANSWER']['0']['#']); $numerical->tolerance = backup_todb($num_info['#']['TOLERANCE']['0']['#']); ////We have to recode the answer field - $answer = backup_getid($restore->backup_unique_code,"quiz_answers",$numerical->answers); + $answer = backup_getid($restore->backup_unique_code,"quiz_answers",$numerical->answer); if ($answer) { - $numerical->answers = $answer->new_id; + $numerical->answer = $answer->new_id; } //The structure is equal to the db, so insert the quiz_numerical @@ -946,33 +965,29 @@ //Now, build the QUIZ_MULTIANSWER record structure $multianswer->question = $new_question_id; - $multianswer->answers = backup_todb($mul_info['#']['ANSWERS']['0']['#']); - $multianswer->positionkey = backup_todb($mul_info['#']['POSITIONKEY']['0']['#']); - $multianswer->answertype = backup_todb($mul_info['#']['ANSWERTYPE']['0']['#']); - $multianswer->norm = backup_todb($mul_info['#']['NORM']['0']['#']); + $multianswer->sequence = backup_todb($mul_info['#']['SEQUENCE']['0']['#']); - //We have to recode the answers field (a list of answers id) - //Extracts answer id from sequence - $answers_field = ""; + //We have to recode the sequence field (a list of question ids) + //Extracts question id from sequence + $sequence_field = ""; $in_first = true; - $tok = strtok($multianswer->answers,","); + $tok = strtok($multianswer->sequence,","); while ($tok) { //Get the answer from backup_ids - $answer = backup_getid($restore->backup_unique_code,"quiz_answers",$tok); - if ($answer) { + $question = backup_getid($restore->backup_unique_code,"quiz_questions",$tok); + if ($question) { if ($in_first) { - $answers_field .= $answer->new_id; + $sequence_field .= $question->new_id; $in_first = false; } else { - $answers_field .= ",".$answer->new_id; + $sequence_field .= ",".$question->new_id; } } //check for next $tok = strtok(","); } //We have the answers field recoded to its new ids - $multianswer->answers = $answers_field; - + $multianswer->sequence = $sequence_field; //The structure is equal to the db, so insert the quiz_multianswers $newid = insert_record ("quiz_multianswers",$multianswer); @@ -990,7 +1005,7 @@ } backup_flush(300); } - +/* //If we have created the quiz_multianswers record, now, depending of the //answertype, delegate the restore to every qtype function if ($newid) { @@ -1004,6 +1019,7 @@ } else { $status = false; } +*/ } return $status;