MDL-86524 questions: Update set reference context after category move
When a category is restored, it is first created in the course context, them moved it its module context once that has been restored. When this happens, we also need to update set references that refer to that category to use the new context. However, this was using the legacy category fields so was not updating them correctly. It now does.
This commit is contained in:
@@ -5688,13 +5688,19 @@ class restore_move_module_questions_categories extends restore_execution_step {
|
||||
// We need to check all the question_set_references belonging to this context_module.
|
||||
$references = $DB->get_records('question_set_references', ['usingcontextid' => $newcontext->newitemid]);
|
||||
foreach ($references as $reference) {
|
||||
$filtercondition = json_decode($reference->filtercondition);
|
||||
if (!empty($filtercondition->questioncategoryid) &&
|
||||
in_array($filtercondition->questioncategoryid, $categoryids)) {
|
||||
// This is one of ours, update the questionscontextid.
|
||||
$DB->set_field('question_set_references',
|
||||
'questionscontextid', $newcontext->newitemid,
|
||||
['id' => $reference->id]);
|
||||
$filtercondition = json_decode($reference->filtercondition, true);
|
||||
if (!array_key_exists('filter', $filtercondition)) {
|
||||
$filtercondition = \core_question\question_reference_manager::convert_legacy_set_reference_filter_condition(
|
||||
$filtercondition,
|
||||
);
|
||||
}
|
||||
$questioncategoryid = $filtercondition['filter']['category']['values'][0];
|
||||
if (in_array($questioncategoryid, $categoryids)) {
|
||||
// This is one of ours, update the questionscontextid and filtercondition fields.
|
||||
$reference->questionscontextid = $newcontext->newitemid;
|
||||
$filtercondition['cat'] = "{$questioncategoryid},{$newcontext->newitemid}";
|
||||
$reference->filtercondition = json_encode($filtercondition);
|
||||
$DB->update_record('question_set_references', $reference);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,10 +74,8 @@ final class restore_39_test extends advanced_testcase {
|
||||
// Get question_set_references records for the restored quiz activity.
|
||||
$references = $DB->get_records('question_set_references', ['usingcontextid' => $contextid]);
|
||||
foreach ($references as $reference) {
|
||||
$filtercondition = json_decode($reference->filtercondition);
|
||||
// Confirm the questionscontextid is set correctly, which is from filter question category id.
|
||||
$this->assertEquals($reference->questionscontextid,
|
||||
$qcats[$filtercondition->questioncategoryid]->contextid);
|
||||
// Confirm the questionscontextid is set correctly, which is now the quiz context.
|
||||
$this->assertEquals($contextid, $reference->questionscontextid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user