From 7fb1b88dc72489dbf7ab894f9cbe3e06fe306b0f Mon Sep 17 00:00:00 2001 From: tjhunt Date: Fri, 9 May 2008 15:05:36 +0000 Subject: [PATCH] MDL-10899 - There is some data associated with some questons that needs to be udpated when moving questions between categories. This commit deals with subquestions, and lays the foundation for fixing the other problem - datasets - which is files as bug 14767. --- lang/en_utf8/question.php | 1 + lib/questionlib.php | 24 ++++++++++++++++++++++++ question/category_class.php | 5 +++-- question/contextmoveq.php | 7 ++++--- question/editlib.php | 7 ++----- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lang/en_utf8/question.php b/lang/en_utf8/question.php index 8c6ae25ac3f..7f8b0498272 100644 --- a/lang/en_utf8/question.php +++ b/lang/en_utf8/question.php @@ -32,6 +32,7 @@ $string['editingquestion'] = 'Editing a question'; $string['erroraccessingcontext'] = 'Cannot access context'; $string['errorfilecannotbecopied'] = 'Error cannot copy file $a.'; $string['errorfilecannotbemoved'] = 'Error cannot move file $a.'; +$string['errormovingquestions'] = 'Error while moving questions with ids $a.'; $string['errorfileschanged'] = 'Error files linked to from questions have changed since form was displayed.'; $string['exportcategory'] = 'Export category'; $string['filesareasite']= 'the site files area'; diff --git a/lib/questionlib.php b/lib/questionlib.php index 94259e5b97a..22cb029d3dd 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -559,6 +559,30 @@ function question_delete_activity($cm, $feedback=true) { } return true; } + +/** + * This function should be considered private to the question bank, it is called from + * question/editlib.php question/contextmoveq.php and a few similar places to to the work of + * acutally moving questions and associated data. However, callers of this function also have to + * do other work, which is why you should not call this method directly from outside the questionbank. + * + * @param string $questionids a comma-separated list of question ids. + * @param integer $newcategory the id of the category to move to. + */ +function question_move_questions_to_category($questionids, $newcategory) { + $result = true; + + // Move the questions themselves. + $result = $result && set_field_select('question', 'category', $newcategory, "id IN ($questionids)"); + + // Move any subquestions belonging to them. + $result = $result && set_field_select('question', 'category', $newcategory, "parent IN ($questionids)"); + + // TODO Deal with datasets. + + return $result; +} + /** * @param array $row tab objects * @param question_edit_contexts $contexts object representing contexts available from this context diff --git a/question/category_class.php b/question/category_class.php index 879f353de74..80c5fe16fd1 100644 --- a/question/category_class.php +++ b/question/category_class.php @@ -352,8 +352,9 @@ class question_category_object { } function move_questions($oldcat, $newcat){ - if (!set_field('question', 'category', $newcat, 'category', $oldcat)) { - print_error("Error while moving questions from category '$oldcat' to '$newcat'", '', $this->pageurl->out()); + $questionids = get_records_select_menu('question', "category = $oldcat AND parent = 0", '', 'id,1'); + if (!question_move_questions_to_category(implode(',', array_keys($questionids)), $newcat)) { + print_error('errormovingquestions', 'question', $returnurl, $ids); } } diff --git a/question/contextmoveq.php b/question/contextmoveq.php index 9bcd9dce2cc..9973c6d66b9 100644 --- a/question/contextmoveq.php +++ b/question/contextmoveq.php @@ -159,9 +159,10 @@ if ($contextmoveform->is_cancelled()){ } } - //now move questions - if (!execute_sql("UPDATE {$CFG->prefix}question SET category = {$tocat->id} WHERE id IN ({$ids})", false)){ - print_error("Could not move the questions {$ids} to category ".$tocat->name, '', $returnurl); + +/// Now move questions. + if (!question_move_questions_to_category($ids, $tocat->id)) { + print_error('errormovingquestions', 'question', $returnurl, $ids); } redirect($returnurl); } diff --git a/question/editlib.php b/question/editlib.php index 38315a66b2e..b80d7f892d1 100644 --- a/question/editlib.php +++ b/question/editlib.php @@ -447,11 +447,8 @@ function question_showbank_actions($pageurl, $cm){ } $returnurl = $pageurl->out(false, array('category'=>"$tocategoryid,$contextid")); if (!$checkforfiles){ - foreach ($questionids as $questionid){ - //move question - if (!set_field('question', 'category', $tocategory->id, 'id', $questionid)) { - error('Could not update category field'); - } + if (!question_move_questions_to_category(implode(',', $questionids), $tocategory->id)) { + print_error('errormovingquestions', 'question', $returnurl, $questionids); } redirect($returnurl); } else {