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 {