diff --git a/h5p/classes/event/h5p_viewed.php b/h5p/classes/event/h5p_viewed.php new file mode 100644 index 00000000000..ef7015cc3dc --- /dev/null +++ b/h5p/classes/event/h5p_viewed.php @@ -0,0 +1,97 @@ +. + +/** + * H5P viewed event class. + * + * @package core + * @since Moodle 3.8 + * @copyright 2019 Carlos Escobedo + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_h5p\event; +defined('MOODLE_INTERNAL') || die(); + +/** + * H5P viewed event class. + * + * @package core_h5p + * @since Moodle 3.8 + * @copyright 2019 Carlos Escobedo + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class h5p_viewed extends \core\event\base { + + /** + * Initialise event parameters. + */ + protected function init() { + $this->data['objecttable'] = 'h5p'; + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventh5pviewed', 'h5p'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' has viewed the H5P with the id '$this->objectid'."; + } + + /** + * Custom validations. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + if (!isset($this->objectid)) { + throw new \coding_exception('The \'objectid\' must be set.'); + } + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + // There is no url since the previous event already has the url where the h5p content has been displayed. + return null; + } + + /** + * Return the legacy event name. + * + * @return string + */ + public static function get_legacy_eventname() { + return 'core_h5p_viewed'; + } +} \ No newline at end of file diff --git a/h5p/classes/player.php b/h5p/classes/player.php index 5605a972481..8413cf830b4 100644 --- a/h5p/classes/player.php +++ b/h5p/classes/player.php @@ -174,15 +174,28 @@ class player { * @return string The HTML code to display this H5P content. */ public function output() : string { - global $OUTPUT; + global $OUTPUT, $USER; $template = new \stdClass(); $template->h5pid = $this->h5pid; if ($this->embedtype === 'div') { - return $OUTPUT->render_from_template('core_h5p/h5pdiv', $template); + $h5phtml = $OUTPUT->render_from_template('core_h5p/h5pdiv', $template); } else { - return $OUTPUT->render_from_template('core_h5p/h5piframe', $template); + $h5phtml = $OUTPUT->render_from_template('core_h5p/h5piframe', $template); } + + // Trigger capability_assigned event. + \core_h5p\event\h5p_viewed::create([ + 'objectid' => $this->h5pid, + 'userid' => $USER->id, + 'context' => $this->context, + 'other' => [ + 'url' => $this->url->out(), + 'time' => time() + ] + ])->trigger(); + + return $h5phtml; } /** diff --git a/h5p/tests/event_h5p_viewed.php b/h5p/tests/event_h5p_viewed.php new file mode 100644 index 00000000000..451ba4e6820 --- /dev/null +++ b/h5p/tests/event_h5p_viewed.php @@ -0,0 +1,98 @@ +. + +/** + * Tests for h5p viewed event. + * + * @package core_h5p + * @category test + * @copyright 2019 Carlos Escobedo + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.8 + */ + +defined('MOODLE_INTERNAL') || die(); + +use core_h5p\autoloader; + +/** + * Tests for h5p viewed event. + * + * @package core_h5p + * @category test + * @copyright 2019 Carlos Escobedo + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.8 + */ +class core_h5p_event_h5p_viewed_testcase extends advanced_testcase { + + /** + * Setup test. + */ + protected function setUp() { + parent::setUp(); + autoloader::register(); + } + + /** + * test_event_h5p_viewed description + * @runInSeparateProcess + */ + public function test_event_h5p_viewed() { + $this->resetAfterTest(true); + + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $page = $this->getDataGenerator()->create_module('page', array('course' => $course->id)); + $pagecontext = \context_module::instance($page->cmid); + // Url dummy just for testing proposal. + $url = \moodle_url::make_pluginfile_url( + $pagecontext->id, + \core_h5p\file_storage::COMPONENT, + 'unittest', + 0, + '/', + 'h5pfiletest.h5p' + ); + // Dummy H5P id for testing proposal. We don't need a real h5p. + $dummyh5pid = 111; + $now = time(); + // Event parameters for testing. + $params = [ + 'objectid' => $dummyh5pid, + 'userid' => $user->id, + 'context' => $pagecontext, + 'other' => [ + 'url' => $url->out(), + 'time' => $now + ] + ]; + // Prepare redirect Events. + $sink = $this->redirectEvents(); + // Test the event H5P viewed. + $event = \core_h5p\event\h5p_viewed::create($params); + $event->trigger(); + $result = $sink->get_events(); + $event = reset($result); + $sink->close(); + // Check the event info. + $this->assertEquals($dummyh5pid, $event->objectid); + $this->assertEquals($user->id, $event->userid); + $this->assertEquals($pagecontext->id, $event->contextid); + $this->assertEquals($url->out(), $event->other['url']); + $this->assertEquals($now, $event->other['time']); + } +} diff --git a/lang/en/h5p.php b/lang/en/h5p.php index a65724f2e55..2fcf32fbdee 100644 --- a/lang/en/h5p.php +++ b/lang/en/h5p.php @@ -71,6 +71,7 @@ $string['downloadtitle'] = 'Download this content as a H5P file.'; $string['editor'] = 'Editor'; $string['embed'] = 'Embed'; $string['embedtitle'] = 'View the embed code for this content.'; +$string['eventh5pviewed'] = 'H5P viewed'; $string['fileExceedsMaxSize'] = 'One of the files inside the package exceeds the maximum file size allowed. ({$a->%file} {$a->%used} > {$a->%max})'; $string['fullscreen'] = 'Fullscreen'; $string['gpl'] = 'General Public License v3'; @@ -135,6 +136,7 @@ $string['originator'] = 'Originator'; $string['pd'] = 'Public Domain'; $string['pddl'] = 'Public Domain Dedication and Licence'; $string['pdm'] = 'Public Domain Mark (PDM)'; +$string['pluginname'] = 'H5P Package'; $string['privacy:metadata'] = 'H5P subsystem does not store any personal data.'; $string['resizescript'] = 'Include this script on your website if you want dynamic sizing of the embedded content:'; $string['resubmitScores'] = 'Attempting to submit stored results.';