mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 17:06:53 +02:00
Now the question backup code has been separated from the quiz backup code.
This commit is contained in:
parent
8ceb3e67d5
commit
fe1106f0d1
8 changed files with 116 additions and 1336 deletions
|
@ -1,57 +1,20 @@
|
|||
<?php //$Id$
|
||||
//This php script contains all the stuff to backup/restore
|
||||
//quiz mods
|
||||
//This php script contains all the stuff to backup quizzes
|
||||
|
||||
//This is the "graphical" structure of the quiz mod:
|
||||
//To see, put your terminal to 160cc
|
||||
|
||||
//
|
||||
// quiz question_categories
|
||||
// (CL,pk->id) (CL,pk->id)
|
||||
// | |
|
||||
// ------------------------------------------------------------------- |
|
||||
// | | | | |.......................................
|
||||
// | quiz_grades | quiz_question_versions | .
|
||||
// | (UL,pk->id,fk->quiz) | (CL,pk->id,fk->quiz) | .
|
||||
// | | . | ----question_datasets---- .
|
||||
// quiz_attempts quiz_question_instances . | | (CL,pk->id,fk->question, | .
|
||||
// (UL,pk->id,fk->quiz) (CL,pk->id,fk->quiz,question) . | | fk->dataset_definition) | .
|
||||
// | | . | | | .
|
||||
// | question_sessions | . | | | .
|
||||
// |---------(UL,pk->id,fk->attempt,question)-----| . | | | .
|
||||
// | . | . | | question_dataset_definitions
|
||||
// | . | . | | (CL,pk->id,fk->category)
|
||||
// | question_states | question |
|
||||
// ----------(UL,pk->id,fk->attempt,question)--------------------------(CL,pk->id,fk->category,files) |
|
||||
// | | question_dataset_items
|
||||
// | | (CL,pk->id,fk->definition)
|
||||
// --------- |
|
||||
// | |
|
||||
// question_rqp_states |
|
||||
// (UL,pk->id,fk->stateid) | question_rqp_type
|
||||
// | (SL,pk->id)
|
||||
// | |
|
||||
// -------------------------------------------------------------------------------------------------------------- |
|
||||
// | | | | | | | question_rqp
|
||||
// | | | | | | |--(CL,pk->id,fk->question)
|
||||
// | | | | question_calculated | |
|
||||
// question_truefalse | question_multichoice | (CL,pl->id,fk->question) | |
|
||||
// (CL,pk->id,fk->question) | (CL,pk->id,fk->question) | . | | question_randomsamatch
|
||||
// . | . | . | |--(CL,pk->id,fk->question)
|
||||
// . question_shortanswer . question_numerical . question_multianswer. |
|
||||
// . (CL,pk->id,fk->question) . (CL,pk->id,fk->question) . (CL,pk->id,fk->question) |
|
||||
// . . . . . . | question_match
|
||||
// . . . . . . |--(CL,pk->id,fk->question)
|
||||
// . . . . . . | .
|
||||
// . . . . . . | .
|
||||
// . . . . . . | .
|
||||
// . . . . . . | question_match_sub
|
||||
// ........................................................................................ |--(CL,pk->id,fk->question)
|
||||
// . |
|
||||
// . |
|
||||
// . | question_numerical_units
|
||||
// question_answers |--(CL,pk->id,fk->question)
|
||||
// (CL,pk->id,fk->question)----------------------------------------------------------
|
||||
// quiz
|
||||
// (CL,pk->id)
|
||||
// |
|
||||
// -------------------------------------------------------------------
|
||||
// | | | |
|
||||
// | quiz_grades | quiz_question_versions
|
||||
// | (UL,pk->id,fk->quiz) | (CL,pk->id,fk->quiz)
|
||||
// | |
|
||||
// quiz_attempts quiz_question_instances
|
||||
// (UL,pk->id,fk->quiz) (CL,pk->id,fk->quiz,question)
|
||||
//
|
||||
// Meaning: pk->primary key field of the table
|
||||
// fk->foreign key to link with parent
|
||||
|
@ -63,41 +26,10 @@
|
|||
//
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Comments:
|
||||
//THIS MOD BACKUP NEEDS TO USE THE mdl_backup_ids TABLE
|
||||
|
||||
//This module is special, because we make the backup in two steps:
|
||||
// 1.-We backup every category and their questions (complete structure). It includes this tables:
|
||||
// - question_categories
|
||||
// - question
|
||||
// - question_rqp
|
||||
// - question_truefalse
|
||||
// - question_shortanswer
|
||||
// - question_multianswer
|
||||
// - question_multichoice
|
||||
// - question_numerical
|
||||
// - question_randomsamatch
|
||||
// - question_match
|
||||
// - question_match_sub
|
||||
// - question_calculated
|
||||
// - question_answers
|
||||
// - question_numerical_units
|
||||
// - question_datasets
|
||||
// - question_dataset_definitions
|
||||
// - question_dataset_items
|
||||
// All this backup info have its own section in moodle.xml (QUESTION_CATEGORIES) and it's generated
|
||||
// before every module backup standard invocation. And only if to backup quizzes has been selected !!
|
||||
// It's invoked with quiz_backup_question_categories. (course independent).
|
||||
|
||||
// 2.-Standard module backup (Invoked via quiz_backup_mods). It includes this tables:
|
||||
// - quiz
|
||||
// - quiz_question_versions
|
||||
// - quiz_question_instances
|
||||
// - quiz_attempts
|
||||
// - quiz_grades
|
||||
// - question_states
|
||||
// - question_sessions
|
||||
// This step is the standard mod backup. (course dependent).
|
||||
// When we backup a quiz we also need to backup the questions and possibly
|
||||
// the data about student interaction with the questions. The functions to do
|
||||
// that are included with the following library
|
||||
include_once("$CFG->dirroot/question/backuplib.php");
|
||||
|
||||
//STEP 1. Backup categories/questions and associated structures
|
||||
// (course independent)
|
||||
|
@ -228,525 +160,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
//Delete category ids from backup_ids table
|
||||
function delete_category_ids ($backup_unique_code) {
|
||||
global $CFG;
|
||||
$status = true;
|
||||
$status = execute_sql("DELETE FROM {$CFG->prefix}backup_ids
|
||||
WHERE backup_code = '$backup_unique_code'",false);
|
||||
return $status;
|
||||
}
|
||||
|
||||
function quiz_backup_question_categories($bf,$preferences) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
//First, we get the used categories from backup_ids
|
||||
$categories = question_category_ids_by_backup ($preferences->backup_unique_code);
|
||||
|
||||
//If we've categories
|
||||
if ($categories) {
|
||||
//Write start tag
|
||||
$status = fwrite($bf,start_tag("QUESTION_CATEGORIES",2,true));
|
||||
//Iterate over each category
|
||||
foreach ($categories as $cat) {
|
||||
//Start category
|
||||
$status = fwrite ($bf,start_tag("QUESTION_CATEGORY",3,true));
|
||||
//Get category data from question_categories
|
||||
$category = get_record ("question_categories","id",$cat->old_id);
|
||||
//Print category contents
|
||||
fwrite($bf,full_tag("ID",4,false,$category->id));
|
||||
fwrite($bf,full_tag("NAME",4,false,$category->name));
|
||||
fwrite($bf,full_tag("INFO",4,false,$category->info));
|
||||
fwrite($bf,full_tag("PUBLISH",4,false,$category->publish));
|
||||
fwrite($bf,full_tag("STAMP",4,false,$category->stamp));
|
||||
fwrite($bf,full_tag("PARENT",4,false,$category->parent));
|
||||
fwrite($bf,full_tag("SORTORDER",4,false,$category->sortorder));
|
||||
//Now, backup their questions
|
||||
$status = quiz_backup_question($bf,$preferences,$category->id);
|
||||
//End category
|
||||
$status = fwrite ($bf,end_tag("QUESTION_CATEGORY",3,true));
|
||||
}
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("QUESTION_CATEGORIES",2,true));
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups all the questions in selected category and their
|
||||
//asociated data
|
||||
function quiz_backup_question($bf,$preferences,$category) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
// We'll fetch the questions sorted by parent so that questions with no parents
|
||||
// (these are the ones which could be parents themselves) are backed up first. This
|
||||
// is important for the recoding of the parent field during the restore process
|
||||
$questions = get_records("question","category",$category,"parent ASC, id");
|
||||
//If there are questions
|
||||
if ($questions) {
|
||||
//Write start tag
|
||||
$status = fwrite ($bf,start_tag("QUESTIONS",4,true));
|
||||
$counter = 0;
|
||||
//Iterate over each question
|
||||
foreach ($questions as $question) {
|
||||
//Start question
|
||||
$status = fwrite ($bf,start_tag("QUESTION",5,true));
|
||||
//Print question contents
|
||||
fwrite ($bf,full_tag("ID",6,false,$question->id));
|
||||
fwrite ($bf,full_tag("PARENT",6,false,$question->parent));
|
||||
fwrite ($bf,full_tag("NAME",6,false,$question->name));
|
||||
fwrite ($bf,full_tag("QUESTIONTEXT",6,false,$question->questiontext));
|
||||
fwrite ($bf,full_tag("QUESTIONTEXTFORMAT",6,false,$question->questiontextformat));
|
||||
fwrite ($bf,full_tag("IMAGE",6,false,$question->image));
|
||||
fwrite ($bf,full_tag("DEFAULTGRADE",6,false,$question->defaultgrade));
|
||||
fwrite ($bf,full_tag("PENALTY",6,false,$question->penalty));
|
||||
fwrite ($bf,full_tag("QTYPE",6,false,$question->qtype));
|
||||
fwrite ($bf,full_tag("LENGTH",6,false,$question->length));
|
||||
fwrite ($bf,full_tag("STAMP",6,false,$question->stamp));
|
||||
fwrite ($bf,full_tag("VERSION",6,false,$question->version));
|
||||
fwrite ($bf,full_tag("HIDDEN",6,false,$question->hidden));
|
||||
//Now, depending of the qtype, call one function or other
|
||||
if ($question->qtype == "1") {
|
||||
$status = quiz_backup_shortanswer($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "2") {
|
||||
$status = quiz_backup_truefalse($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "3") {
|
||||
$status = quiz_backup_multichoice($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "4") {
|
||||
//Random question. Nothing to write.
|
||||
} else if ($question->qtype == "5") {
|
||||
$status = quiz_backup_match($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "6") {
|
||||
$status = quiz_backup_randomsamatch($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "7") {
|
||||
//Description question. Nothing to write.
|
||||
} else if ($question->qtype == "8") {
|
||||
$status = quiz_backup_numerical($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "9") {
|
||||
$status = quiz_backup_multianswer($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "10") {
|
||||
$status = quiz_backup_calculated($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "11") {
|
||||
$status = quiz_backup_rqp($bf,$preferences,$question->id);
|
||||
} else if ($question->qtype == "12") {
|
||||
$status = quiz_backup_essay($bf,$preferences,$question->id);
|
||||
}
|
||||
//End question
|
||||
$status = fwrite ($bf,end_tag("QUESTION",5,true));
|
||||
//Do some output
|
||||
$counter++;
|
||||
if ($counter % 10 == 0) {
|
||||
echo ".";
|
||||
if ($counter % 200 == 0) {
|
||||
echo "<br />";
|
||||
}
|
||||
backup_flush(300);
|
||||
}
|
||||
}
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("QUESTIONS",4,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a truefalse question (qtype=2) and its
|
||||
//asociated data
|
||||
function quiz_backup_truefalse($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$truefalses = get_records("question_truefalse","question",$question,"id");
|
||||
//If there are truefalses
|
||||
if ($truefalses) {
|
||||
//Iterate over each truefalse
|
||||
foreach ($truefalses as $truefalse) {
|
||||
$status = fwrite ($bf,start_tag("TRUEFALSE",6,true));
|
||||
//Print truefalse contents
|
||||
fwrite ($bf,full_tag("TRUEANSWER",7,false,$truefalse->trueanswer));
|
||||
fwrite ($bf,full_tag("FALSEANSWER",7,false,$truefalse->falseanswer));
|
||||
$status = fwrite ($bf,end_tag("TRUEFALSE",6,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a shortanswer question (qtype=1) and its
|
||||
//asociated data
|
||||
function quiz_backup_shortanswer($bf,$preferences,$question,$level=6,$include_answers=true) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$shortanswers = get_records("question_shortanswer","question",$question,"id");
|
||||
//If there are shortanswers
|
||||
if ($shortanswers) {
|
||||
//Iterate over each shortanswer
|
||||
foreach ($shortanswers as $shortanswer) {
|
||||
$status = fwrite ($bf,start_tag("SHORTANSWER",$level,true));
|
||||
//Print shortanswer contents
|
||||
fwrite ($bf,full_tag("ANSWERS",$level+1,false,$shortanswer->answers));
|
||||
fwrite ($bf,full_tag("USECASE",$level+1,false,$shortanswer->usecase));
|
||||
$status = fwrite ($bf,end_tag("SHORTANSWER",$level,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
if ($include_answers) {
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a multichoice question (qtype=3) and its
|
||||
//asociated data
|
||||
function quiz_backup_multichoice($bf,$preferences,$question,$level=6,$include_answers=true) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$multichoices = get_records("question_multichoice","question",$question,"id");
|
||||
//If there are multichoices
|
||||
if ($multichoices) {
|
||||
//Iterate over each multichoice
|
||||
foreach ($multichoices as $multichoice) {
|
||||
$status = fwrite ($bf,start_tag("MULTICHOICE",$level,true));
|
||||
//Print multichoice contents
|
||||
fwrite ($bf,full_tag("LAYOUT",$level+1,false,$multichoice->layout));
|
||||
fwrite ($bf,full_tag("ANSWERS",$level+1,false,$multichoice->answers));
|
||||
fwrite ($bf,full_tag("SINGLE",$level+1,false,$multichoice->single));
|
||||
fwrite ($bf,full_tag("SHUFFLEANSWERS",$level+1,false,$randomsamatch->shuffleanswers));
|
||||
$status = fwrite ($bf,end_tag("MULTICHOICE",$level,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
if ($include_answers) {
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a randomsamatch question (qtype=6) and its
|
||||
//asociated data
|
||||
function quiz_backup_randomsamatch($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$randomsamatchs = get_records("question_randomsamatch","question",$question,"id");
|
||||
//If there are randomsamatchs
|
||||
if ($randomsamatchs) {
|
||||
//Iterate over each randomsamatch
|
||||
foreach ($randomsamatchs as $randomsamatch) {
|
||||
$status = fwrite ($bf,start_tag("RANDOMSAMATCH",6,true));
|
||||
//Print randomsamatch contents
|
||||
fwrite ($bf,full_tag("CHOOSE",7,false,$randomsamatch->choose));
|
||||
fwrite ($bf,full_tag("SHUFFLEANSWERS",7,false,$randomsamatch->shuffleanswers));
|
||||
$status = fwrite ($bf,end_tag("RANDOMSAMATCH",6,true));
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a match question (qtype=5) and its
|
||||
//asociated data
|
||||
function quiz_backup_match($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$matchs = get_records("question_match_sub","question",$question,"id");
|
||||
//If there are matchs
|
||||
if ($matchs) {
|
||||
$status = fwrite ($bf,start_tag("MATCHS",6,true));
|
||||
//Iterate over each match
|
||||
foreach ($matchs as $match) {
|
||||
$status = fwrite ($bf,start_tag("MATCH",7,true));
|
||||
//Print match contents
|
||||
fwrite ($bf,full_tag("ID",8,false,$match->id));
|
||||
fwrite ($bf,full_tag("CODE",8,false,$match->code));
|
||||
fwrite ($bf,full_tag("QUESTIONTEXT",8,false,$match->questiontext));
|
||||
fwrite ($bf,full_tag("ANSWERTEXT",8,false,$match->answertext));
|
||||
$status = fwrite ($bf,end_tag("MATCH",7,true));
|
||||
}
|
||||
$status = fwrite ($bf,end_tag("MATCHS",6,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a numerical question (qtype=8) and its
|
||||
//asociated data
|
||||
function quiz_backup_numerical($bf,$preferences,$question,$level=6) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$numericals = get_records("question_numerical","question",$question,"id");
|
||||
//If there are numericals
|
||||
if ($numericals) {
|
||||
//Iterate over each numerical
|
||||
foreach ($numericals as $numerical) {
|
||||
$status = fwrite ($bf,start_tag("NUMERICAL",$level,true));
|
||||
//Print numerical contents
|
||||
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);
|
||||
$status = fwrite ($bf,end_tag("NUMERICAL",$level,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a multianswer question (qtype=9) and its
|
||||
//asociated data
|
||||
function quiz_backup_multianswer($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$multianswers = get_records("question_multianswer","question",$question,"id");
|
||||
//If there are multianswers
|
||||
if ($multianswers) {
|
||||
//Print multianswers header
|
||||
$status = fwrite ($bf,start_tag("MULTIANSWERS",6,true));
|
||||
//Iterate over each multianswer
|
||||
foreach ($multianswers as $multianswer) {
|
||||
$status = fwrite ($bf,start_tag("MULTIANSWER",7,true));
|
||||
//Print multianswer contents
|
||||
fwrite ($bf,full_tag("ID",8,false,$multianswer->id));
|
||||
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
|
||||
$status = fwrite ($bf,end_tag("MULTIANSWERS",6,true));
|
||||
//Now print question_answers
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in a calculated question (qtype=10) and its
|
||||
//asociated data
|
||||
function quiz_backup_calculated($bf,$preferences,$question,$level=6,$include_answers=true) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$calculateds = get_records("question_calculated","question",$question,"id");
|
||||
//If there are calculated-s
|
||||
if ($calculateds) {
|
||||
//Iterate over each calculateds
|
||||
foreach ($calculateds as $calculated) {
|
||||
$status = $status &&fwrite ($bf,start_tag("CALCULATED",$level,true));
|
||||
//Print calculated contents
|
||||
fwrite ($bf,full_tag("ANSWER",$level+1,false,$calculated->answer));
|
||||
fwrite ($bf,full_tag("TOLERANCE",$level+1,false,$calculated->tolerance));
|
||||
fwrite ($bf,full_tag("TOLERANCETYPE",$level+1,false,$calculated->tolerancetype));
|
||||
fwrite ($bf,full_tag("CORRECTANSWERLENGTH",$level+1,false,$calculated->correctanswerlength));
|
||||
fwrite ($bf,full_tag("CORRECTANSWERFORMAT",$level+1,false,$calculated->correctanswerformat));
|
||||
//Now backup numerical_units
|
||||
$status = quiz_backup_numerical_units($bf,$preferences,$question,7);
|
||||
//Now backup required dataset definitions and items...
|
||||
$status = quiz_backup_datasets($bf,$preferences,$question,7);
|
||||
//End calculated data
|
||||
$status = $status &&fwrite ($bf,end_tag("CALCULATED",$level,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
if ($include_answers) {
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in an rqp question (qtype=11) and its
|
||||
//asociated data
|
||||
function quiz_backup_rqp($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$rqp = get_records("question_rqp","question",$question,"id");
|
||||
//If there are rqps
|
||||
if ($rqps) {
|
||||
//Iterate over each rqp
|
||||
foreach ($rqps as $rqp) {
|
||||
$status = fwrite ($bf,start_tag("RQP",6,true));
|
||||
//Print rqp contents
|
||||
fwrite ($bf,full_tag("TYPE",7,false,$rqp->type));
|
||||
fwrite ($bf,full_tag("SOURCE",7,false,$rqp->source));
|
||||
fwrite ($bf,full_tag("FORMAT",7,false,$rqp->format));
|
||||
fwrite ($bf,full_tag("FLAGS",7,false,$rqp->flags));
|
||||
fwrite ($bf,full_tag("MAXSCORE",7,false,$rqp->maxscore));
|
||||
$status = fwrite ($bf,end_tag("RQP",6,true));
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups the data in an essay question (qtype=12) and its
|
||||
//asociated data
|
||||
function quiz_backup_essay($bf,$preferences,$question,$level=6) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$essays = get_records('question_essay', 'question', $question, "id");
|
||||
//If there are essays
|
||||
if ($essays) {
|
||||
//Iterate over each essay
|
||||
foreach ($essays as $essay) {
|
||||
$status = fwrite ($bf,start_tag("ESSAY",$level,true));
|
||||
//Print essay contents
|
||||
fwrite ($bf,full_tag("ANSWER",$level+1,false,$essay->answer));
|
||||
$status = fwrite ($bf,end_tag("ESSAY",$level,true));
|
||||
}
|
||||
//Now print question_answers
|
||||
$status = quiz_backup_answers($bf,$preferences,$question);
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
|
||||
//This function backups the answers data in some question types
|
||||
//(truefalse, shortanswer,multichoice,numerical,calculated)
|
||||
function quiz_backup_answers($bf,$preferences,$question) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$answers = get_records("question_answers","question",$question,"id");
|
||||
//If there are answers
|
||||
if ($answers) {
|
||||
$status = fwrite ($bf,start_tag("ANSWERS",6,true));
|
||||
//Iterate over each answer
|
||||
foreach ($answers as $answer) {
|
||||
$status = fwrite ($bf,start_tag("ANSWER",7,true));
|
||||
//Print answer contents
|
||||
fwrite ($bf,full_tag("ID",8,false,$answer->id));
|
||||
fwrite ($bf,full_tag("ANSWER_TEXT",8,false,$answer->answer));
|
||||
fwrite ($bf,full_tag("FRACTION",8,false,$answer->fraction));
|
||||
fwrite ($bf,full_tag("FEEDBACK",8,false,$answer->feedback));
|
||||
$status = fwrite ($bf,end_tag("ANSWER",7,true));
|
||||
}
|
||||
$status = fwrite ($bf,end_tag("ANSWERS",6,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//This function backups question_numerical_units from different question types
|
||||
function quiz_backup_numerical_units($bf,$preferences,$question,$level=7) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$numerical_units = get_records("question_numerical_units","question",$question,"id");
|
||||
//If there are numericals_units
|
||||
if ($numerical_units) {
|
||||
$status = fwrite ($bf,start_tag("NUMERICAL_UNITS",$level,true));
|
||||
//Iterate over each numerical_unit
|
||||
foreach ($numerical_units as $numerical_unit) {
|
||||
$status = fwrite ($bf,start_tag("NUMERICAL_UNIT",$level+1,true));
|
||||
//Print numerical_unit contents
|
||||
fwrite ($bf,full_tag("MULTIPLIER",$level+2,false,$numerical_unit->multiplier));
|
||||
fwrite ($bf,full_tag("UNIT",$level+2,false,$numerical_unit->unit));
|
||||
//Now backup numerical_units
|
||||
$status = fwrite ($bf,end_tag("NUMERICAL_UNIT",$level+1,true));
|
||||
}
|
||||
$status = fwrite ($bf,end_tag("NUMERICAL_UNITS",$level,true));
|
||||
}
|
||||
|
||||
return $status;
|
||||
|
||||
}
|
||||
|
||||
//This function backups dataset_definitions (via question_datasets) from different question types
|
||||
function quiz_backup_datasets($bf,$preferences,$question,$level=7) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
//First, we get the used datasets for this question
|
||||
$question_datasets = get_records("question_datasets","question",$question,"id");
|
||||
//If there are question_datasets
|
||||
if ($question_datasets) {
|
||||
$status = $status &&fwrite ($bf,start_tag("DATASET_DEFINITIONS",$level,true));
|
||||
//Iterate over each question_dataset
|
||||
foreach ($question_datasets as $question_dataset) {
|
||||
$def = NULL;
|
||||
//Get dataset_definition
|
||||
if ($def = get_record("question_dataset_definitions","id",$question_dataset->datasetdefinition)) {;
|
||||
$status = $status &&fwrite ($bf,start_tag("DATASET_DEFINITION",$level+1,true));
|
||||
//Print question_dataset contents
|
||||
fwrite ($bf,full_tag("CATEGORY",$level+2,false,$def->category));
|
||||
fwrite ($bf,full_tag("NAME",$level+2,false,$def->name));
|
||||
fwrite ($bf,full_tag("TYPE",$level+2,false,$def->type));
|
||||
fwrite ($bf,full_tag("OPTIONS",$level+2,false,$def->options));
|
||||
fwrite ($bf,full_tag("ITEMCOUNT",$level+2,false,$def->itemcount));
|
||||
//Now backup dataset_entries
|
||||
$status = quiz_backup_dataset_items($bf,$preferences,$def->id,$level+2);
|
||||
//End dataset definition
|
||||
$status = $status &&fwrite ($bf,end_tag("DATASET_DEFINITION",$level+1,true));
|
||||
}
|
||||
}
|
||||
$status = $status &&fwrite ($bf,end_tag("DATASET_DEFINITIONS",$level,true));
|
||||
}
|
||||
|
||||
return $status;
|
||||
|
||||
}
|
||||
|
||||
//This function backups datases_items from dataset_definitions
|
||||
function quiz_backup_dataset_items($bf,$preferences,$datasetdefinition,$level=9) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
//First, we get the datasets_items for this dataset_definition
|
||||
$dataset_items = get_records("question_dataset_items","definition",$datasetdefinition,"id");
|
||||
//If there are dataset_items
|
||||
if ($dataset_items) {
|
||||
$status = $status &&fwrite ($bf,start_tag("DATASET_ITEMS",$level,true));
|
||||
//Iterate over each dataset_item
|
||||
foreach ($dataset_items as $dataset_item) {
|
||||
$status = $status &&fwrite ($bf,start_tag("DATASET_ITEM",$level+1,true));
|
||||
//Print question_dataset contents
|
||||
fwrite ($bf,full_tag("NUMBER",$level+2,false,$dataset_item->number));
|
||||
fwrite ($bf,full_tag("VALUE",$level+2,false,$dataset_item->value));
|
||||
//End dataset definition
|
||||
$status = $status &&fwrite ($bf,end_tag("DATASET_ITEM",$level+1,true));
|
||||
}
|
||||
$status = $status &&fwrite ($bf,end_tag("DATASET_ITEMS",$level,true));
|
||||
}
|
||||
|
||||
return $status;
|
||||
|
||||
}
|
||||
|
||||
//STEP 2. Backup quizzes and associated structures
|
||||
// (course dependent)
|
||||
|
@ -958,74 +371,6 @@
|
|||
return $status;
|
||||
}
|
||||
|
||||
//Backup question_states contents (executed from backup_quiz_attempts)
|
||||
function backup_question_states ($bf,$preferences,$attempt) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$question_states = get_records("question_states","attempt",$attempt,"id");
|
||||
//If there are states
|
||||
if ($question_states) {
|
||||
//Write start tag
|
||||
$status = fwrite ($bf,start_tag("STATES",6,true));
|
||||
//Iterate over each state
|
||||
foreach ($question_states as $state) {
|
||||
//Start state
|
||||
$status = fwrite ($bf,start_tag("STATE",7,true));
|
||||
//Print state contents
|
||||
fwrite ($bf,full_tag("ID",8,false,$state->id));
|
||||
fwrite ($bf,full_tag("QUESTION",8,false,$state->question));
|
||||
fwrite ($bf,full_tag("ORIGINALQUESTION",8,false,$state->originalquestion));
|
||||
fwrite ($bf,full_tag("SEQ_NUMBER",8,false,$state->seq_number));
|
||||
fwrite ($bf,full_tag("ANSWER",8,false,$state->answer));
|
||||
fwrite ($bf,full_tag("TIMESTAMP",8,false,$state->timestamp));
|
||||
fwrite ($bf,full_tag("EVENT",8,false,$state->event));
|
||||
fwrite ($bf,full_tag("GRADE",8,false,$state->grade));
|
||||
fwrite ($bf,full_tag("RAW_GRADE",8,false,$state->raw_grade));
|
||||
fwrite ($bf,full_tag("PENALTY",8,false,$state->penalty));
|
||||
// now back up question type specific state information
|
||||
$status = backup_question_rqp_state ($bf,$preferences,$state->id);
|
||||
$status = backup_question_essay_state ($bf,$preferences,$state->id);
|
||||
//End state
|
||||
$status = fwrite ($bf,end_tag("STATE",7,true));
|
||||
}
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("STATES",6,true));
|
||||
}
|
||||
}
|
||||
|
||||
//Backup question_sessions contents (executed from backup_quiz_attempts)
|
||||
function backup_question_sessions ($bf,$preferences,$attempt) {
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$question_sessions = get_records("question_sessions","attemptid",$attempt,"id");
|
||||
//If there are sessions
|
||||
if ($question_sessions) {
|
||||
//Write start tag (the funny name 'newest states' has historical reasons)
|
||||
$status = fwrite ($bf,start_tag("NEWEST_STATES",6,true));
|
||||
//Iterate over each newest_state
|
||||
foreach ($question_sessions as $newest_state) {
|
||||
//Start newest_state
|
||||
$status = fwrite ($bf,start_tag("NEWEST_STATE",7,true));
|
||||
//Print newest_state contents
|
||||
fwrite ($bf,full_tag("ID",8,false,$newest_state->id));
|
||||
fwrite ($bf,full_tag("QUESTIONID",8,false,$newest_state->questionid));
|
||||
fwrite ($bf,full_tag("NEWEST",8,false,$newest_state->newest));
|
||||
fwrite ($bf,full_tag("NEWGRADED",8,false,$newest_state->newgraded));
|
||||
fwrite ($bf,full_tag("SUMPENALTY",8,false,$newest_state->sumpenalty));
|
||||
//End newest_state
|
||||
$status = fwrite ($bf,end_tag("NEWEST_STATE",7,true));
|
||||
}
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("NEWEST_STATES",6,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
function quiz_check_backup_mods_instances($instance,$backup_unique_code) {
|
||||
// the keys in this array need to be unique as they get merged...
|
||||
$info[$instance->id.'0'][0] = '<b>'.$instance->name.'</b>';
|
||||
|
@ -1040,7 +385,7 @@
|
|||
}
|
||||
//Questions
|
||||
$info[$instance->id.'2'][0] = get_string("questionsinclhidden","quiz");
|
||||
if ($ids = quiz_question_ids_by_backup ($backup_unique_code)) {
|
||||
if ($ids = question_ids_by_backup ($backup_unique_code)) {
|
||||
$info[$instance->id.'2'][1] = count($ids);
|
||||
} else {
|
||||
$info[$instance->id.'2'][1] = 0;
|
||||
|
@ -1058,50 +403,6 @@
|
|||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
//Backup question_rqp_state contents (executed from backup_question_states)
|
||||
function backup_question_rqp_state ($bf,$preferences,$state) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$rqp_state = get_record("question_rqp_states","stateid",$state);
|
||||
//If there is a state
|
||||
if ($rqp_state) {
|
||||
//Write start tag
|
||||
$status = fwrite ($bf,start_tag("RQP_STATE",8,true));
|
||||
//Print state contents
|
||||
fwrite ($bf,full_tag("RESPONSES",9,false,$rqp_state->responses));
|
||||
fwrite ($bf,full_tag("PERSISTENT_DATA",9,false,$rqp_state->persistent_data));
|
||||
fwrite ($bf,full_tag("TEMPLATE_VARS",9,false,$rqp_state->template_vars));
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("RQP_STATE",8,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
//Backup question_essay_state contents (executed from backup_question_states)
|
||||
function backup_question_essay_state ($bf,$preferences,$state) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
$status = true;
|
||||
|
||||
$essay_state = get_record("question_essay_states", "stateid", $state);
|
||||
//If there is a state
|
||||
if ($essay_state) {
|
||||
//Write start tag
|
||||
$status = fwrite ($bf,start_tag("ESSAY_STATE",8,true));
|
||||
//Print state contents
|
||||
fwrite ($bf,full_tag("GRADED",9,false,$essay_state->graded));
|
||||
fwrite ($bf,full_tag("FRACTION",9,false,$essay_state->fraction));
|
||||
fwrite ($bf,full_tag("RESPONSE",9,false,$essay_state->response));
|
||||
//Write end tag
|
||||
$status = fwrite ($bf,end_tag("ESSAY_STATE",8,true));
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
|
||||
////Return an array of info (name,value)
|
||||
/// $instances is an array with key = instanceid, value = object (name,id,userdata)
|
||||
|
@ -1134,7 +435,7 @@
|
|||
}
|
||||
//Questions
|
||||
$info[2][0] = get_string("questions","quiz");
|
||||
if ($ids = quiz_question_ids_by_backup ($backup_unique_code)) {
|
||||
if ($ids = question_ids_by_backup ($backup_unique_code)) {
|
||||
$info[2][1] = count($ids);
|
||||
} else {
|
||||
$info[2][1] = 0;
|
||||
|
@ -1185,29 +486,6 @@
|
|||
WHERE a.course = '$course'");
|
||||
}
|
||||
|
||||
//Returns an array of categories id
|
||||
function question_category_ids_by_backup ($backup_unique_code) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
return get_records_sql ("SELECT a.old_id, a.backup_code
|
||||
FROM {$CFG->prefix}backup_ids a
|
||||
WHERE a.backup_code = '$backup_unique_code' AND
|
||||
a.table_name = 'question_categories'");
|
||||
}
|
||||
|
||||
function quiz_question_ids_by_backup ($backup_unique_code) {
|
||||
|
||||
global $CFG;
|
||||
|
||||
return get_records_sql ("SELECT q.id, q.category
|
||||
FROM {$CFG->prefix}backup_ids a,
|
||||
{$CFG->prefix}question q
|
||||
WHERE a.backup_code = '$backup_unique_code' AND
|
||||
q.category = a.old_id AND
|
||||
a.table_name = 'question_categories'");
|
||||
}
|
||||
|
||||
function quiz_grade_ids_by_course ($course) {
|
||||
|
||||
global $CFG;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?php //$Id$
|
||||
//This php script contains all the stuff to backup/restore
|
||||
//quiz mods
|
||||
//This php script contains all the stuff to restore quiz mods
|
||||
|
||||
// Todo:
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue