diff --git a/lib/questionlib.php b/lib/questionlib.php index 201c6c68be1..438fe683aa3 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -399,9 +399,6 @@ function question_delete_question($questionid): void { } } - // Delete question comments. - $DB->delete_records('comments', ['itemid' => $questionid, 'component' => 'qbank_comment', - 'commentarea' => 'question']); // Finally delete the question record itself. $DB->delete_records('question', ['id' => $question->id]); $DB->delete_records('question_versions', ['id' => $questiondata->versionid]); @@ -414,6 +411,7 @@ function question_delete_question($questionid): void { question_bank::notify_question_edited($question->id); // Log the deletion of this question. + // Any qbank plugins storing additional question data should observe this event and perform the necessary deletion. $question->category = $questiondata->categoryid; $question->contextid = $questiondata->contextid; $event = \core\event\question_deleted::create_from_question_instance($question); diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 7df51950287..f16cbe6a4f5 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -54,6 +54,8 @@ information provided here is intended especially for developers. * New method moodleform::filter_shown_headers() is created to show some expanded headers only and hide the rest. * count_words() and count_letters() have a new optional parameter called $format to format the text before doing the counting. * New core_renderer::sr_text method to generate screen reader only inline texts without using html_writter. +* Code calling to qbank plugins was moved from question_delete_question in questionlib.php into the plugins themselves. Any plugins + that need to perform processing when a question is deleted should observe the \core\event\question_deleted event instead. === 4.2 === diff --git a/question/bank/comment/classes/event/question_deleted_observer.php b/question/bank/comment/classes/event/question_deleted_observer.php new file mode 100644 index 00000000000..ff53c04b6bb --- /dev/null +++ b/question/bank/comment/classes/event/question_deleted_observer.php @@ -0,0 +1,49 @@ +. + +namespace qbank_comment\event; + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot . '/comment/lib.php'); + +use core\event\question_deleted; + +/** + * Event observer for question deletion + * + * @package qbank_comment + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class question_deleted_observer { + + /** + * Delete any comments for the deleted question. + * + * @param question_deleted $event + * @return void + */ + public static function delete_question_comments(question_deleted $event): void { + \comment::delete_comments([ + 'contextid' => \context_system::instance()->id, + 'component' => 'qbank_comment', + 'commentarea' => 'question', + 'itemid' => $event->objectid, + ]); + } +} diff --git a/question/bank/comment/db/events.php b/question/bank/comment/db/events.php new file mode 100644 index 00000000000..7efa63e9f2e --- /dev/null +++ b/question/bank/comment/db/events.php @@ -0,0 +1,33 @@ +. + +/** + * Question custom fields events + * + * @package qbank_comment + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$observers = [ + [ + 'eventname' => '\core\event\question_deleted', + 'callback' => '\qbank_comment\event\question_deleted_observer::delete_question_comments', + ] +]; diff --git a/question/bank/comment/tests/event/question_deleted_observer_test.php b/question/bank/comment/tests/event/question_deleted_observer_test.php new file mode 100644 index 00000000000..f31c3f71ef0 --- /dev/null +++ b/question/bank/comment/tests/event/question_deleted_observer_test.php @@ -0,0 +1,66 @@ +. + +namespace qbank_comment\event; + +/** + * Tests for question_deleted_observer + * + * @package qbank_comment + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \qbank_comment\event\question_deleted_observer + */ +class question_deleted_observer_test extends \advanced_testcase { + + /** + * Deleting a question with comments should also delete the comments + * + * @return void + */ + public function test_delete_question_with_comments(): void { + $this->resetAfterTest(); + $this->setAdminUser(); + $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); + [, , , $questions] = $questiongenerator->setup_course_and_questions(); + $question = reset($questions); + + $context = \context_system::instance(); + $commentgenerator = $this->getDataGenerator()->get_plugin_generator('core_comment'); + /** @var \comment $comment */ + $comment = $commentgenerator->create_comment([ + 'context' => $context, + 'component' => 'qbank_comment', + 'area' => 'question', + 'itemid' => $question->id, + 'content' => random_string(), + ]); + + $this->assertEquals(1, $comment->count()); + + question_delete_question($question->id); + + $newcomment = new \comment((object)[ + 'context' => $context, + 'component' => 'qbank_comment', + 'area' => 'question', + 'itemid' => $question->id, + ]); + + $this->assertEquals(0, $newcomment->count()); + } +} diff --git a/question/bank/comment/version.php b/question/bank/comment/version.php index d94f8bd1b75..dd34079b7c6 100644 --- a/question/bank/comment/version.php +++ b/question/bank/comment/version.php @@ -26,6 +26,6 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'qbank_comment'; -$plugin->version = 2023042400; +$plugin->version = 2023042401; $plugin->requires = 2023041800; $plugin->maturity = MATURITY_STABLE;