From 48a947c5f64d16d42ea5dea27a07911c489ec3d2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:41:05 +0000 Subject: [PATCH 1/5] Initial plan From 21b2bd8ae4625111dca657541bf430b8a79e84c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:48:29 +0000 Subject: [PATCH 2/5] Add Moodle 5 hook callback for assignment settings dropdown Co-authored-by: richardwolfmayr <24298463+richardwolfmayr@users.noreply.github.com> --- classes/event_observer.php | 53 +++++++++++++++++++++++++++++++++++++ classes/hook_listener.php | 54 ++++++++++++++++++++++++++++++++++++++ db/events.php | 8 ++++++ db/hooks.php | 24 +++++++++++++++++ lang/en/block_exaport.php | 6 +++++ 5 files changed, 145 insertions(+) create mode 100644 classes/event_observer.php create mode 100644 classes/hook_listener.php create mode 100644 db/hooks.php diff --git a/classes/event_observer.php b/classes/event_observer.php new file mode 100644 index 00000000..a9a8af9f --- /dev/null +++ b/classes/event_observer.php @@ -0,0 +1,53 @@ +. + +namespace block_exaport; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Event observer for exaport assignment settings. + */ +class event_observer { + + /** + * Handles course module created event. + * Placeholder for saving block_exaport_assignment_option data when an assignment is created. + * + * @param \core\event\course_module_created $event + * @return void + */ + public static function course_module_created(\core\event\course_module_created $event): void { + if (($event->other['modulename'] ?? null) !== 'assign') { + return; + } + // TODO: Save block_exaport_assignment_option value for the newly created assignment. + } + + /** + * Handles course module updated event. + * Placeholder for saving block_exaport_assignment_option data when an assignment is updated. + * + * @param \core\event\course_module_updated $event + * @return void + */ + public static function course_module_updated(\core\event\course_module_updated $event): void { + if (($event->other['modulename'] ?? null) !== 'assign') { + return; + } + // TODO: Save block_exaport_assignment_option value for the updated assignment. + } +} diff --git a/classes/hook_listener.php b/classes/hook_listener.php new file mode 100644 index 00000000..da425f01 --- /dev/null +++ b/classes/hook_listener.php @@ -0,0 +1,54 @@ +. + +namespace block_exaport; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Hook listener for exaport block. + */ +class hook_listener { + + /** + * Adds a dropdown field to the assignment activity settings form. + * + * @param \core\hook\form_coursemodule_standard_elements $hook + * @return void + */ + public static function form_coursemodule_standard_elements( + \core\hook\form_coursemodule_standard_elements $hook + ): void { + if ($hook->get_cmtype() !== 'assign') { + return; + } + + $mform = $hook->get_form(); + + $options = [ + 'testvalue1' => get_string('testvalue1', 'block_exaport'), + 'testvalue2' => get_string('testvalue2', 'block_exaport'), + 'testvalue3' => get_string('testvalue3', 'block_exaport'), + ]; + + $mform->addElement( + 'select', + 'block_exaport_assignment_option', + get_string('assignment_option', 'block_exaport'), + $options + ); + } +} diff --git a/db/events.php b/db/events.php index 5a3ea7d8..d819786f 100644 --- a/db/events.php +++ b/db/events.php @@ -17,5 +17,13 @@ 'eventname' => '\core\event\user_enrolment_updated', 'callback' => '\block_exaport\observer::user_enrolment_updated', ), + array( + 'eventname' => '\core\event\course_module_created', + 'callback' => '\block_exaport\event_observer::course_module_created', + ), + array( + 'eventname' => '\core\event\course_module_updated', + 'callback' => '\block_exaport\event_observer::course_module_updated', + ), ); diff --git a/db/hooks.php b/db/hooks.php new file mode 100644 index 00000000..6862d527 --- /dev/null +++ b/db/hooks.php @@ -0,0 +1,24 @@ +. + +defined('MOODLE_INTERNAL') || die(); + +$callbacks = [ + [ + 'hook' => \core\hook\form_coursemodule_standard_elements::class, + 'callback' => [\block_exaport\hook_listener::class, 'form_coursemodule_standard_elements'], + ], +]; diff --git a/lang/en/block_exaport.php b/lang/en/block_exaport.php index eba03941..1c66cd36 100644 --- a/lang/en/block_exaport.php +++ b/lang/en/block_exaport.php @@ -977,3 +977,9 @@ $string['no_views_to_distribute'] = 'No view template defined to distribute'; $string['views_created'] = 'Views created: {$a}'; $string['views_skipped'] = 'Views skipped (already exist): {$a}'; + +// === Assignment settings === +$string['assignment_option'] = 'Exaport Assignment Option'; +$string['testvalue1'] = 'Test Value 1'; +$string['testvalue2'] = 'Test Value 2'; +$string['testvalue3'] = 'Test Value 3'; From 68739557a68ce6d631c7435b75e15193898e56c1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 13:11:49 +0000 Subject: [PATCH 3/5] Fix: use real Moodle coursemodule_standard_elements callback instead of non-existent hook Co-authored-by: richardwolfmayr <24298463+richardwolfmayr@users.noreply.github.com> --- classes/hook_listener.php | 17 +++++++++-------- db/hooks.php | 7 +------ lib.php | 11 +++++++++++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/classes/hook_listener.php b/classes/hook_listener.php index da425f01..415bd405 100644 --- a/classes/hook_listener.php +++ b/classes/hook_listener.php @@ -19,25 +19,26 @@ defined('MOODLE_INTERNAL') || die(); /** - * Hook listener for exaport block. + * Handles course module form element injection for exaport block. */ class hook_listener { /** * Adds a dropdown field to the assignment activity settings form. * - * @param \core\hook\form_coursemodule_standard_elements $hook + * Called via {@see block_exaport_coursemodule_standard_elements()} in lib.php, + * which is invoked by Moodle's plugin callback mechanism + * ({@see moodleform_mod::plugin_extend_coursemodule_standard_elements()}). + * + * @param \moodleform_mod $formwrapper The moodle quickforms wrapper object. + * @param \MoodleQuickForm $mform The actual form object. * @return void */ - public static function form_coursemodule_standard_elements( - \core\hook\form_coursemodule_standard_elements $hook - ): void { - if ($hook->get_cmtype() !== 'assign') { + public static function coursemodule_standard_elements(\moodleform_mod $formwrapper, \MoodleQuickForm $mform): void { + if (($formwrapper->get_current()->modulename ?? null) !== 'assign') { return; } - $mform = $hook->get_form(); - $options = [ 'testvalue1' => get_string('testvalue1', 'block_exaport'), 'testvalue2' => get_string('testvalue2', 'block_exaport'), diff --git a/db/hooks.php b/db/hooks.php index 6862d527..067e018d 100644 --- a/db/hooks.php +++ b/db/hooks.php @@ -16,9 +16,4 @@ defined('MOODLE_INTERNAL') || die(); -$callbacks = [ - [ - 'hook' => \core\hook\form_coursemodule_standard_elements::class, - 'callback' => [\block_exaport\hook_listener::class, 'form_coursemodule_standard_elements'], - ], -]; +$callbacks = []; diff --git a/lib.php b/lib.php index 045f5ea2..e7479245 100644 --- a/lib.php +++ b/lib.php @@ -316,3 +316,14 @@ function block_exaport_output_fragment_blockedit($args) { return $formdata->html; } + +/** + * Inject custom elements into the course module settings form for assignment activities. + * + * @param \moodleform_mod $formwrapper The moodle quickforms wrapper object. + * @param \MoodleQuickForm $mform The actual form object (required to modify the form). + * @return void + */ +function block_exaport_coursemodule_standard_elements($formwrapper, $mform): void { + \block_exaport\hook_listener::coursemodule_standard_elements($formwrapper, $mform); +} From 93fabb8d2bde455f8d8b7284e084640bb5341562 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 13:28:10 +0000 Subject: [PATCH 4/5] Cleanup: inline coursemodule_standard_elements, merge event_observer into observer, remove hook/indirection files Co-authored-by: richardwolfmayr <24298463+richardwolfmayr@users.noreply.github.com> --- classes/event_observer.php | 53 ------------------------------------ classes/hook_listener.php | 55 -------------------------------------- classes/observer.php | 32 ++++++++++++++++++++-- db/events.php | 4 +-- db/hooks.php | 19 ------------- lib.php | 19 +++++++++++-- 6 files changed, 49 insertions(+), 133 deletions(-) delete mode 100644 classes/event_observer.php delete mode 100644 classes/hook_listener.php delete mode 100644 db/hooks.php diff --git a/classes/event_observer.php b/classes/event_observer.php deleted file mode 100644 index a9a8af9f..00000000 --- a/classes/event_observer.php +++ /dev/null @@ -1,53 +0,0 @@ -. - -namespace block_exaport; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Event observer for exaport assignment settings. - */ -class event_observer { - - /** - * Handles course module created event. - * Placeholder for saving block_exaport_assignment_option data when an assignment is created. - * - * @param \core\event\course_module_created $event - * @return void - */ - public static function course_module_created(\core\event\course_module_created $event): void { - if (($event->other['modulename'] ?? null) !== 'assign') { - return; - } - // TODO: Save block_exaport_assignment_option value for the newly created assignment. - } - - /** - * Handles course module updated event. - * Placeholder for saving block_exaport_assignment_option data when an assignment is updated. - * - * @param \core\event\course_module_updated $event - * @return void - */ - public static function course_module_updated(\core\event\course_module_updated $event): void { - if (($event->other['modulename'] ?? null) !== 'assign') { - return; - } - // TODO: Save block_exaport_assignment_option value for the updated assignment. - } -} diff --git a/classes/hook_listener.php b/classes/hook_listener.php deleted file mode 100644 index 415bd405..00000000 --- a/classes/hook_listener.php +++ /dev/null @@ -1,55 +0,0 @@ -. - -namespace block_exaport; - -defined('MOODLE_INTERNAL') || die(); - -/** - * Handles course module form element injection for exaport block. - */ -class hook_listener { - - /** - * Adds a dropdown field to the assignment activity settings form. - * - * Called via {@see block_exaport_coursemodule_standard_elements()} in lib.php, - * which is invoked by Moodle's plugin callback mechanism - * ({@see moodleform_mod::plugin_extend_coursemodule_standard_elements()}). - * - * @param \moodleform_mod $formwrapper The moodle quickforms wrapper object. - * @param \MoodleQuickForm $mform The actual form object. - * @return void - */ - public static function coursemodule_standard_elements(\moodleform_mod $formwrapper, \MoodleQuickForm $mform): void { - if (($formwrapper->get_current()->modulename ?? null) !== 'assign') { - return; - } - - $options = [ - 'testvalue1' => get_string('testvalue1', 'block_exaport'), - 'testvalue2' => get_string('testvalue2', 'block_exaport'), - 'testvalue3' => get_string('testvalue3', 'block_exaport'), - ]; - - $mform->addElement( - 'select', - 'block_exaport_assignment_option', - get_string('assignment_option', 'block_exaport'), - $options - ); - } -} diff --git a/classes/observer.php b/classes/observer.php index e59d79af..0f103cc1 100644 --- a/classes/observer.php +++ b/classes/observer.php @@ -44,15 +44,43 @@ public static function user_enrolment_updated(\core\event\user_enrolment_updated private static function queue_distribution_task($courseid, $userid) { // Create ad-hoc task. $task = new \block_exaport\task\distribute_to_user_task(); - + // Set custom data. $task->set_custom_data([ 'courseid' => $courseid, 'userid' => $userid, ]); - + // Queue the task. \core\task\manager::queue_adhoc_task($task); } + + /** + * Handles course module created event. + * Placeholder for saving block_exaport_assignment_option data when an assignment is created. + * + * @param \core\event\course_module_created $event + * @return void + */ + public static function course_module_created(\core\event\course_module_created $event): void { + if (($event->other['modulename'] ?? null) !== 'assign') { + return; + } + // TODO: Save block_exaport_assignment_option value for the newly created assignment. + } + + /** + * Handles course module updated event. + * Placeholder for saving block_exaport_assignment_option data when an assignment is updated. + * + * @param \core\event\course_module_updated $event + * @return void + */ + public static function course_module_updated(\core\event\course_module_updated $event): void { + if (($event->other['modulename'] ?? null) !== 'assign') { + return; + } + // TODO: Save block_exaport_assignment_option value for the updated assignment. + } } diff --git a/db/events.php b/db/events.php index d819786f..f0409bc5 100644 --- a/db/events.php +++ b/db/events.php @@ -19,11 +19,11 @@ ), array( 'eventname' => '\core\event\course_module_created', - 'callback' => '\block_exaport\event_observer::course_module_created', + 'callback' => '\block_exaport\observer::course_module_created', ), array( 'eventname' => '\core\event\course_module_updated', - 'callback' => '\block_exaport\event_observer::course_module_updated', + 'callback' => '\block_exaport\observer::course_module_updated', ), ); diff --git a/db/hooks.php b/db/hooks.php deleted file mode 100644 index 067e018d..00000000 --- a/db/hooks.php +++ /dev/null @@ -1,19 +0,0 @@ -. - -defined('MOODLE_INTERNAL') || die(); - -$callbacks = []; diff --git a/lib.php b/lib.php index e7479245..5e814dd3 100644 --- a/lib.php +++ b/lib.php @@ -324,6 +324,21 @@ function block_exaport_output_fragment_blockedit($args) { * @param \MoodleQuickForm $mform The actual form object (required to modify the form). * @return void */ -function block_exaport_coursemodule_standard_elements($formwrapper, $mform): void { - \block_exaport\hook_listener::coursemodule_standard_elements($formwrapper, $mform); +function block_exaport_coursemodule_standard_elements(\moodleform_mod $formwrapper, \MoodleQuickForm $mform): void { + if (($formwrapper->get_current()->modulename ?? null) !== 'assign') { + return; + } + + $options = [ + 'testvalue1' => get_string('testvalue1', 'block_exaport'), + 'testvalue2' => get_string('testvalue2', 'block_exaport'), + 'testvalue3' => get_string('testvalue3', 'block_exaport'), + ]; + + $mform->addElement( + 'select', + 'block_exaport_assignment_option', + get_string('assignment_option', 'block_exaport'), + $options + ); } From 1e8bd722f7b5f1d11b113171e3853dd29f2ca272 Mon Sep 17 00:00:00 2001 From: rwolf Date: Fri, 6 Mar 2026 14:34:08 +0100 Subject: [PATCH 5/5] comments.. version --- classes/observer.php | 1 + lib.php | 1 + version.php | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/observer.php b/classes/observer.php index 0f103cc1..61031091 100644 --- a/classes/observer.php +++ b/classes/observer.php @@ -81,6 +81,7 @@ public static function course_module_updated(\core\event\course_module_updated $ return; } // TODO: Save block_exaport_assignment_option value for the updated assignment. + // TODO: e.g. with this? optional_param('block_exaport_assignment_option', 0, PARAM_TEXT); } } diff --git a/lib.php b/lib.php index 5e814dd3..ad961bab 100644 --- a/lib.php +++ b/lib.php @@ -335,6 +335,7 @@ function block_exaport_coursemodule_standard_elements(\moodleform_mod $formwrapp 'testvalue3' => get_string('testvalue3', 'block_exaport'), ]; + // TODO: currently puts in in the last area (tags).. put it somewhere else $mform->addElement( 'select', 'block_exaport_assignment_option', diff --git a/version.php b/version.php index 96923040..52679f6c 100644 --- a/version.php +++ b/version.php @@ -19,6 +19,6 @@ $plugin->component = 'block_exaport'; $plugin->release = '5.1'; -$plugin->version = 2026030403; +$plugin->version = 2026030600; $plugin->requires = 2021051700; // moodle 3.11 $plugin->maturity = MATURITY_STABLE;