$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';
}
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
}
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);
}
}
}
}
- //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);
}
}
$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 {