diff --git a/lib/questionlib.php b/lib/questionlib.php index e039ad9c534..201c6c68be1 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -389,10 +389,6 @@ function question_delete_question($questionid): void { // Delete questiontype-specific data. question_bank::get_qtype($question->qtype, false)->delete_question($question->id, $questiondata->contextid); - // Delete the custom filed data for the question. - $customfieldhandler = qbank_customfields\customfield\question_handler::create(); - $customfieldhandler->delete_instance($question->id); - // Now recursively delete all child questions if ($children = $DB->get_records('question', array('parent' => $questionid), '', 'id, qtype')) { diff --git a/question/bank/customfields/classes/event/question_deleted_observer.php b/question/bank/customfields/classes/event/question_deleted_observer.php new file mode 100644 index 00000000000..853c5a79119 --- /dev/null +++ b/question/bank/customfields/classes/event/question_deleted_observer.php @@ -0,0 +1,41 @@ +. + +namespace qbank_customfields\event; + +use core\event\question_deleted; +use qbank_customfields\customfield\question_handler; + +/** + * Event observer for question deletion + * + * @package qbank_customfields + * @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 custom field data for the deleted question. + * + * @param question_deleted $event + * @return void + */ + public static function delete_question_customfields(question_deleted $event): void { + question_handler::create()->delete_instance($event->objectid); + } +} diff --git a/question/bank/customfields/db/events.php b/question/bank/customfields/db/events.php new file mode 100644 index 00000000000..311d7d34cab --- /dev/null +++ b/question/bank/customfields/db/events.php @@ -0,0 +1,33 @@ +. + +/** + * Question custom fields events + * + * @package qbank_customfields + * @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_customfields\event\question_deleted_observer::delete_question_customfields' + ] +]; diff --git a/question/bank/customfields/tests/event/question_deleted_observer_test.php b/question/bank/customfields/tests/event/question_deleted_observer_test.php new file mode 100644 index 00000000000..bcbde6aa7b9 --- /dev/null +++ b/question/bank/customfields/tests/event/question_deleted_observer_test.php @@ -0,0 +1,68 @@ +. + +namespace qbank_customfields\event; + +/** + * Tests for question_deleted_observer + * + * @package qbank_customfields + * @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_customfields\event\question_deleted_observer + */ +class question_deleted_observer_test extends \advanced_testcase { + + /** + * Deleting a question with customfield data should also delete the data. + * + * @return void + */ + public function test_delete_question_with_customfields(): void { + $this->resetAfterTest(); + $generator = self::getDataGenerator(); + $data = [ + 'component' => 'qbank_customfields', + 'area' => 'question' + ]; + + $categoryid = $generator->create_custom_field_category($data)->get('id'); + $generator->create_custom_field(['categoryid' => $categoryid, 'type' => 'text', 'shortname' => 'f1']); + + $questiongenerator = $generator->get_plugin_generator('core_question'); + [, , , $questions] = $questiongenerator->setup_course_and_questions(); + $question = reset($questions); + + $customfieldhandler = \qbank_customfields\customfield\question_handler::create(); + $questiondata = (object)[ + 'id' => $question->id, + 'customfield_f1' => random_string() + ]; + + $customfieldhandler->instance_form_save($questiondata); + + $customdata = $customfieldhandler->get_instance_data($question->id); + $this->assertCount(1, $customdata); + $this->assertEquals($questiondata->customfield_f1, reset($customdata)->get_value()); + + question_delete_question($question->id); + + $customdata = $customfieldhandler->get_instance_data($question->id); + $this->assertCount(1, $customdata); + $this->assertEmpty(reset($customdata)->get_value()); + } +} diff --git a/question/bank/customfields/version.php b/question/bank/customfields/version.php index 4ee627e03d1..077a36e5d51 100644 --- a/question/bank/customfields/version.php +++ b/question/bank/customfields/version.php @@ -26,6 +26,6 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'qbank_customfields'; -$plugin->version = 2023042400; +$plugin->version = 2023042401; $plugin->requires = 2023041800; $plugin->maturity = MATURITY_STABLE;