From e20d306969aa4dbfb4880df3d3f6aec6dbed6d68 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Wed, 18 Jun 2014 15:39:02 +0800 Subject: [PATCH 1/2] MDL-39883 events: Create a new api create_from_cm for module create event --- course/dnduploadlib.php | 11 +------- course/modlib.php | 15 ++++------- lib/classes/event/course_module_created.php | 29 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/course/dnduploadlib.php b/course/dnduploadlib.php index 5d146235ce6..16d51dc8dfd 100644 --- a/course/dnduploadlib.php +++ b/course/dnduploadlib.php @@ -648,16 +648,7 @@ class dndupload_ajax_processor { $mod = $info->get_cm($this->cm->id); // Trigger course module created event. - $event = \core\event\course_module_created::create(array( - 'courseid' => $this->course->id, - 'context' => context_module::instance($mod->id), - 'objectid' => $mod->id, - 'other' => array( - 'modulename' => $mod->modname, - 'name' => $mod->name, - 'instanceid' => $instanceid - ) - )); + $event = \core\event\course_module_created::create_from_cm($mod); $event->trigger(); $this->send_response($mod); diff --git a/course/modlib.php b/course/modlib.php index 2e03ff615fd..208a9ba192c 100644 --- a/course/modlib.php +++ b/course/modlib.php @@ -148,16 +148,11 @@ function add_moduleinfo($moduleinfo, $course, $mform = null) { $sectionid = course_add_cm_to_section($course, $moduleinfo->coursemodule, $moduleinfo->section); // Trigger event based on the action we did. - $event = \core\event\course_module_created::create(array( - 'courseid' => $course->id, - 'context' => $modcontext, - 'objectid' => $moduleinfo->coursemodule, - 'other' => array( - 'modulename' => $moduleinfo->modulename, - 'name' => $moduleinfo->name, - 'instanceid' => $moduleinfo->instance - ) - )); + // Api create_from_cm expects modname and id property, and we don't want to modify $moduleinfo since we are returning it. + $eventdata = clone $moduleinfo; + $eventdata->modname = $eventdata->modulename; + $eventdata->id = $eventdata->coursemodule; + $event = \core\event\course_module_created::create_from_cm($eventdata, $modcontext); $event->trigger(); $moduleinfo = edit_module_post_actions($moduleinfo, $course); diff --git a/lib/classes/event/course_module_created.php b/lib/classes/event/course_module_created.php index 672a09a20db..244a1240da4 100644 --- a/lib/classes/event/course_module_created.php +++ b/lib/classes/event/course_module_created.php @@ -54,6 +54,35 @@ class course_module_created extends base { $this->data['edulevel'] = self::LEVEL_TEACHING; } + /** + * Api to Create new event from course module. + * + * @since Moodle 2.6.4, 2.7.1 + * @param \cm_info|\stdClass $cm course module instance, as returned by {@link get_coursemodule_from_id} + * or {@link get_coursemodule_from_instance}. + * @param \context_module $modcontext module context instance + * + * @return \core\event\base returns instance of new event + */ + public static final function create_from_cm($cm, $modcontext = null) { + // If not set, get the module context. + if (empty($modcontext)) { + $modcontext = \context_module::instance($cm->id); + } + + // Create event object for course module update action. + $event = static::create(array( + 'context' => $modcontext, + 'objectid' => $cm->id, + 'other' => array( + 'modulename' => $cm->modname, + 'instanceid' => $cm->instance, + 'name' => $cm->name, + ) + )); + return $event; + } + /** * Returns localised general event name. * From dcbef3f4c2473bda096e5b225e3e03f57b8bd946 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Wed, 18 Jun 2014 15:40:31 +0800 Subject: [PATCH 2/2] MDL-39883 events: Trigger a module created event when duplicating a module --- course/lib.php | 4 ++++ course/tests/courselib_test.php | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/course/lib.php b/course/lib.php index c0f714e576a..ffde87bd8f4 100644 --- a/course/lib.php +++ b/course/lib.php @@ -3530,6 +3530,10 @@ function duplicate_module($course, $cm) { $section = $DB->get_record('course_sections', array('id' => $cm->section, 'course' => $cm->course)); moveto_module($newcm, $section, $cm); moveto_module($cm, $section, $newcm); + + // Trigger course module created event. We can trigger the event only if we know the newcmid. + $event = \core\event\course_module_created::create_from_cm($newcm); + $event->trigger(); } rebuild_course_cache($cm->course); diff --git a/course/tests/courselib_test.php b/course/tests/courselib_test.php index 216db322cb4..b2e9fa4f688 100644 --- a/course/tests/courselib_test.php +++ b/course/tests/courselib_test.php @@ -1958,9 +1958,8 @@ class core_course_courselib_testcase extends advanced_testcase { $modinfo = $this->create_specific_module_test('assign'); $events = $sink->get_events(); $event = array_pop($events); - $sink->close(); - $cm = $DB->get_record('course_modules', array('id' => $modinfo->coursemodule), '*', MUST_EXIST); + $cm = get_coursemodule_from_id('assign', $modinfo->coursemodule, 0, false, MUST_EXIST); $mod = $DB->get_record('assign', array('id' => $modinfo->instance), '*', MUST_EXIST); // Validate event data. @@ -1988,6 +1987,21 @@ class core_course_courselib_testcase extends advanced_testcase { $this->assertEventLegacyLogData($arr, $event); $this->assertEventContextNotUsed($event); + // Let us see if duplicating an activity results in a nice course module created event. + $sink->clear(); + $course = get_course($mod->course); + $newcm = duplicate_module($course, $cm); + $events = $sink->get_events(); + $event = array_pop($events); + $sink->close(); + + // Validate event data. + $this->assertInstanceOf('\core\event\course_module_created', $event); + $this->assertEquals($newcm->id, $event->objectid); + $this->assertEquals($USER->id, $event->userid); + $this->assertEquals($course->id, $event->courseid); + $url = new moodle_url('/mod/assign/view.php', array('id' => $newcm->id)); + $this->assertEquals($url, $event->get_url()); } /**