From 90c3f310668bb63203adca939554ababb31d24c6 Mon Sep 17 00:00:00 2001 From: gustav_delius Date: Mon, 20 Mar 2006 23:04:22 +0000 Subject: [PATCH] Some improvements to delete_question() --- lib/questionlib.php | 60 +++++++++++++------ mod/quiz/lib.php | 3 +- .../questiontypes/calculated/questiontype.php | 15 +++-- question/questiontypes/essay/questiontype.php | 4 +- question/questiontypes/match/questiontype.php | 6 +- .../multianswer/questiontype.php | 4 +- .../multichoice/questiontype.php | 4 +- .../questiontypes/numerical/questiontype.php | 6 +- question/questiontypes/questiontype.php | 2 +- .../randomsamatch/questiontype.php | 4 +- question/questiontypes/rqp/questiontype.php | 8 ++- .../shortanswer/questiontype.php | 5 +- .../questiontypes/truefalse/questiontype.php | 4 +- 13 files changed, 77 insertions(+), 48 deletions(-) diff --git a/lib/questionlib.php b/lib/questionlib.php index 2966080af7..ed629b1d42 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -173,39 +173,61 @@ class cmoptions { } - /// FUNCTIONS ////////////////////////////////////////////////////// +/** + * Returns an array with all the course modules that use this question + * + * @param object $questionid + */ +function question_whereused($questionid) { + $instances = array(); + $modules = get_records('modules'); + foreach ($modules as $module) { + $fn = $module->name.'_question_whereused'; + if (function_exists($fn)) { + $instances[] = $fn($questionid); + } + } + return $instances; +} /** * Deletes question and all associated data from the database * - * TODO: remove quiz dependence - * + * It will not delete a question if it is used by an activity module * @param object $question The question being deleted */ -function delete_question($question) { +function delete_question($questionid) { global $QTYPES; + + // Do not delete a question if it is used by an activity module + if (count(question_whereused($questionid))) { + return; + } + + // delete questiontype-specific data if (isset($QTYPES[$question->qtype])) { - $QTYPES[$question->qtype]->delete_question($question); - } else {echo 'qtype: '.$question->qtype.'
';} - delete_records("question_answers", "question", $question->id); - delete_records("question_states", "question", $question->id); - delete_records("question_sessions", "questionid", $question->id); - if ($newversions = get_records('quiz_question_versions', 'oldquestion', $question->id)) { - foreach ($newversions as $newversion) { - $newquestion = get_record('question', 'id', $newversion->newquestion); - delete_question($newquestion); - } - delete_records("quiz_question_versions", "oldquestion", $question->id); + $QTYPES[$question->qtype]->delete_question($questionid); } - delete_records("quiz_question_versions", "newquestion", $question->id); - if ($children = get_records('question', 'parent', $question->id)) { + + // delete entries from all other question tables + // It is important that this is done only after calling the questiontype functions + delete_records("question_answers", "question", $questionid); + delete_records("question_states", "question", $questionid); + delete_records("question_sessions", "questionid", $questionid); + + // Now recursively delete all child questions + if ($children = get_records('question', 'parent', $questionid)) { foreach ($children as $child) { - delete_question($child); + delete_question($child->id); } } - return true; + + // Finally delete the question record itself + delete_records('question', 'id', $questionid); + + return; } /** diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index de7a4d2218..d7932ef6f3 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -11,7 +11,6 @@ */ require_once($CFG->libdir.'/pagelib.php'); -require_once($CFG->dirroot.'/mod/quiz/constants.php'); /// CONSTANTS /////////////////////////////////////////////////////////////////// @@ -377,7 +376,7 @@ function quiz_delete_course($course, $feedback=true) { //deleting questions if ($questions = get_records("question", "category", $category->id)) { foreach ($questions as $question) { - delete_question($question); + delete_question($question->id); } delete_records("question", "category", $category->id); } diff --git a/question/questiontypes/calculated/questiontype.php b/question/questiontypes/calculated/questiontype.php index ca9374c00b..bc00bd85a3 100644 --- a/question/questiontypes/calculated/questiontype.php +++ b/question/questiontypes/calculated/questiontype.php @@ -203,11 +203,16 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_calculated", "question", $question->id); - delete_records("question_numerical_units", "question", $question->id); - delete_records("question_datasets", "question", $question->id); - //TODO: delete entries from the question_dataset_items and question_dataset_definitions tables + function delete_question($questionid) { + delete_records("question_calculated", "question", $questionid); + delete_records("question_numerical_units", "question", $questionid); + if ($datasets = get_records('question_datasets', 'question', $questionid)) { + foreach ($datasets as $dataset) { + delete_records('question_dataset_definitions', 'id', $datasets->datasetdefinition); + delete_records('question_dataset_items', 'definition', $datasets->datasetdefinition); + } + } + delete_records("question_datasets", "question", $questionid); return true; } diff --git a/question/questiontypes/essay/questiontype.php b/question/questiontypes/essay/questiontype.php index 8deeee2f10..8b86cfe167 100644 --- a/question/questiontypes/essay/questiontype.php +++ b/question/questiontypes/essay/questiontype.php @@ -74,8 +74,8 @@ class question_essay_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_essay", "question", $question->id); + function delete_question($questionid) { + delete_records("question_essay", "question", $questionid); return true; } diff --git a/question/questiontypes/match/questiontype.php b/question/questiontypes/match/questiontype.php index 8ffdfbf788..f884b1f8a7 100644 --- a/question/questiontypes/match/questiontype.php +++ b/question/questiontypes/match/questiontype.php @@ -108,9 +108,9 @@ class question_match_qtype extends default_questiontype { * @return boolean Success/Failure * @param integer $question->id */ - function delete_question($question) { - delete_records("question_match", "question", $question->id); - delete_records("question_match_sub", "question", $question->id); + function delete_question($questionid) { + delete_records("question_match", "question", $questionid); + delete_records("question_match_sub", "question", $questionid); return true; } diff --git a/question/questiontypes/multianswer/questiontype.php b/question/questiontypes/multianswer/questiontype.php index 1dd24a9d80..be91d5b327 100644 --- a/question/questiontypes/multianswer/questiontype.php +++ b/question/questiontypes/multianswer/questiontype.php @@ -171,8 +171,8 @@ class quiz_embedded_cloze_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_multianswer", "question", $question->id); + function delete_question($questionid) { + delete_records("question_multianswer", "question", $questionid); return true; } diff --git a/question/questiontypes/multichoice/questiontype.php b/question/questiontypes/multichoice/questiontype.php index 17b4218e76..6beed5c123 100644 --- a/question/questiontypes/multichoice/questiontype.php +++ b/question/questiontypes/multichoice/questiontype.php @@ -144,8 +144,8 @@ class question_multichoice_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_multichoice", "question", $question->id); + function delete_question($questionid) { + delete_records("question_multichoice", "question", $questionid); return true; } diff --git a/question/questiontypes/numerical/questiontype.php b/question/questiontypes/numerical/questiontype.php index 1675fac934..fadd95c3c2 100644 --- a/question/questiontypes/numerical/questiontype.php +++ b/question/questiontypes/numerical/questiontype.php @@ -228,9 +228,9 @@ class question_numerical_qtype extends question_shortanswer_qtype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_numerical", "question", $question->id); - delete_records("question_numerical_units", "question", $question->id); + function delete_question($questionid) { + delete_records("question_numerical", "question", $questionid); + delete_records("question_numerical_units", "question", $questionid); return true; } diff --git a/question/questiontypes/questiontype.php b/question/questiontypes/questiontype.php index e833a60306..ff68a13a8a 100644 --- a/question/questiontypes/questiontype.php +++ b/question/questiontypes/questiontype.php @@ -183,7 +183,7 @@ class default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { + function delete_question($questionid) { /// The default question type does not have any tables of its own // therefore there is nothing to delete diff --git a/question/questiontypes/randomsamatch/questiontype.php b/question/questiontypes/randomsamatch/questiontype.php index c034cc1ea3..2009d73568 100644 --- a/question/questiontypes/randomsamatch/questiontype.php +++ b/question/questiontypes/randomsamatch/questiontype.php @@ -61,8 +61,8 @@ class question_randomsamatch_qtype extends question_match_qtype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_randomsamatch", "question", $question->id); + function delete_question($questionid) { + delete_records("question_randomsamatch", "question", $questionid); return true; } diff --git a/question/questiontypes/rqp/questiontype.php b/question/questiontypes/rqp/questiontype.php index 4244cd574d..bb55188366 100644 --- a/question/questiontypes/rqp/questiontype.php +++ b/question/questiontypes/rqp/questiontype.php @@ -129,9 +129,13 @@ class question_rqp_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { + function delete_question($questionid) { delete_records("question_rqp", "question", $questionid); - //TODO: delete also the states from question_rqp_states + if ($states = get_records('question_states', 'question', $questionid)) { + foreach ($states as $state) { + delete_records('question_rqp_states', 'stateid', $state->id); + } + } return true; } diff --git a/question/questiontypes/shortanswer/questiontype.php b/question/questiontypes/shortanswer/questiontype.php index 6c9628d61b..62f39ad039 100644 --- a/question/questiontypes/shortanswer/questiontype.php +++ b/question/questiontypes/shortanswer/questiontype.php @@ -112,9 +112,8 @@ class question_shortanswer_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_shortanswer", "question", $question->id); - //TODO: delete also the states from question_rqp_states + function delete_question($questionid) { + delete_records("question_shortanswer", "question", $questionid); return true; } diff --git a/question/questiontypes/truefalse/questiontype.php b/question/questiontypes/truefalse/questiontype.php index 57ffb74015..17725f9c53 100644 --- a/question/questiontypes/truefalse/questiontype.php +++ b/question/questiontypes/truefalse/questiontype.php @@ -115,8 +115,8 @@ class question_truefalse_qtype extends default_questiontype { * @return boolean Success/Failure * @param object $question The question being deleted */ - function delete_question($question) { - delete_records("question_truefalse", "question", $question->id); + function delete_question($questionid) { + delete_records("question_truefalse", "question", $questionid); return true; } -- 2.39.5