diff --git a/mod/lesson/classes/event/lesson_ended.php b/mod/lesson/classes/event/lesson_ended.php new file mode 100644 index 00000000000..76963d284f9 --- /dev/null +++ b/mod/lesson/classes/event/lesson_ended.php @@ -0,0 +1,76 @@ +. + +/** + * Event to be triggered when a lesson is ended. + * + * @package mod_lesson + * @copyright 2013 Mark Nelson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later. + */ + +namespace mod_lesson\event; + +defined('MOODLE_INTERNAL') || die(); + +class lesson_ended extends \core\event\base { + + /** + * Set basic properties for the event. + */ + protected function init() { + $this->data['objecttable'] = 'lesson'; + $this->data['crud'] = 'r'; + $this->data['level'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventlessonended', 'mod_lesson'); + } + + /** + * Get URL related to the action. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/mod/lesson/view.php', array('id' => $this->context->instanceid)); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + return 'The lesson ' . $this->objectid . ' was ended by the user ' . $this->userid; + } + + /** + * Replace add_to_log() statement. + * + * @return array of parameters to be passed to legacy add_to_log() function. + */ + protected function get_legacy_logdata() { + return array($this->courseid, 'lesson', 'end', 'view.php?id=' . $this->context->instanceid, $this->objectid, + $this->context->instanceid); + } +} diff --git a/mod/lesson/lang/en/lesson.php b/mod/lesson/lang/en/lesson.php index 106eeb73eba..a0ff52d0edf 100644 --- a/mod/lesson/lang/en/lesson.php +++ b/mod/lesson/lang/en/lesson.php @@ -172,6 +172,7 @@ $string['essayscore'] = 'Essay score'; $string['eventessayattemptviewed'] = 'Essay attempt viewed'; $string['eventhighscoreadded'] = 'Highscore added'; $string['eventhighscoresviewed'] = 'Highscores viewed'; +$string['eventlessonended'] = 'Lesson ended'; $string['eventlessonstarted'] = 'Lesson started'; $string['fileformat'] = 'File format'; $string['finish'] = 'Finish'; diff --git a/mod/lesson/locallib.php b/mod/lesson/locallib.php index 0c6370afb34..35c13825355 100644 --- a/mod/lesson/locallib.php +++ b/mod/lesson/locallib.php @@ -1255,6 +1255,18 @@ class lesson extends lesson_base { public function stop_timer() { global $USER, $DB; unset($USER->startlesson[$this->properties->id]); + + $cm = get_coursemodule_from_instance('lesson', $this->properties()->id, $this->properties()->course, + false, MUST_EXIST); + + // Trigger lesson ended event. + $event = \mod_lesson\event\lesson_ended::create(array( + 'objectid' => $this->properties()->id, + 'context' => context_module::instance($cm->id), + 'courseid' => $this->properties()->course + )); + $event->trigger(); + return $this->update_timer(false, false); } diff --git a/mod/lesson/tests/events_test.php b/mod/lesson/tests/events_test.php index 0fb7552abf5..55ff9217db5 100644 --- a/mod/lesson/tests/events_test.php +++ b/mod/lesson/tests/events_test.php @@ -166,4 +166,32 @@ class mod_lesson_events_testcase extends advanced_testcase { $this->lesson->properties()->id, $this->lesson->properties()->cmid); $this->assertEventLegacyLogData($expected, $event); } + + /** + * Test the lesson ended event. + */ + public function test_lesson_ended() { + global $DB, $USER; + + // Add a lesson timer so that stop_timer() does not complain. + $lessontimer = new stdClass(); + $lessontimer->lessonid = $this->lesson->properties()->id; + $lessontimer->userid = $USER->id; + $lessontimer->startime = time(); + $lessontimer->lessontime = time(); + $DB->insert_record('lesson_timer', $lessontimer); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $this->lesson->stop_timer(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the event data is valid. + $this->assertInstanceOf('\mod_lesson\event\lesson_ended', $event); + $this->assertEquals(context_module::instance($this->lesson->properties()->cmid), $event->get_context()); + $expected = array($this->course->id, 'lesson', 'end', 'view.php?id=' . $this->lesson->properties()->cmid, + $this->lesson->properties()->id, $this->lesson->properties()->cmid); + $this->assertEventLegacyLogData($expected, $event); + } } diff --git a/mod/lesson/view.php b/mod/lesson/view.php index 9d54e107304..383e9f9cb50 100644 --- a/mod/lesson/view.php +++ b/mod/lesson/view.php @@ -421,9 +421,6 @@ if ($pageid != LESSON_EOL) { // Used to check to see if the student ran out of time $outoftime = optional_param('outoftime', '', PARAM_ALPHA); - // Update the clock / get time information for this user - add_to_log($course->id, "lesson", "end", "view.php?id=".$PAGE->cm->id, "$lesson->id", $PAGE->cm->id); - // We are using level 3 header because the page title is a sub-heading of lesson title (MDL-30911). $lessoncontent .= $OUTPUT->heading(get_string("congratulations", "lesson"), 3); $lessoncontent .= $OUTPUT->box_start('generalbox boxaligncenter'); @@ -432,6 +429,7 @@ if ($pageid != LESSON_EOL) { $ntries--; // need to look at the old attempts :) } if (!$canmanage) { + // Update the clock / get time information for this user. $lesson->stop_timer(); $gradeinfo = lesson_grade($lesson, $ntries);