diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 2eaabc8dcd7..10c69f55b90 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -869,6 +869,7 @@ $string['chooselogs'] = 'Choose which logs you want to see'; $string['choosereportfilter'] = 'Choose a filter for the report'; $string['choosetheme'] = 'Choose theme'; $string['chooseuser'] = 'Choose a user'; +$string['eventcontentviewed'] = 'Content viewed'; $string['icqnumber'] = 'ICQ number'; $string['icon'] = 'Icon'; $string['idnumber'] = 'ID number'; diff --git a/lib/classes/event/content_viewed.php b/lib/classes/event/content_viewed.php new file mode 100644 index 00000000000..bb74e4ec936 --- /dev/null +++ b/lib/classes/event/content_viewed.php @@ -0,0 +1,122 @@ +. +/** + * Abstract event for content viewing. + * + * @package core + * @copyright 2013 Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Class content_viewed. + * + * Base class for a content view event. Each plugin must extend this to create their own content view event. + * + * An example usage:- + * $event = \report_participation\event\content_viewed::create(array('courseid' => $course->id, 'other' => array('content' => 'participants')); + * $event->set_page_detail(); + * $event->set_legacy_logdata(array($course->id, "course", "report participation", "report/participation/index.php?id=$course->id", $course->id)); + * $event->trigger(); + * where \report_participation\event\content_viewed extends \core\event\content_viewed + * + * @package core + * @copyright 2013 Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class content_viewed extends base { + + /** @var null|array $legacylogdata Legacy log data */ + protected $legacylogdata = null; + + /** + * Set basic properties of the event. + */ + protected function init() { + global $PAGE; + + $this->data['crud'] = 'r'; + $this->data['level'] = self::LEVEL_OTHER; + $this->context = $PAGE->context; + } + + /** + * Set basic page properties. + */ + public function set_page_detail() { + global $PAGE; + if (!isset($this->data['other'])) { + $this->data['other'] = array(); + } + $this->data['other'] = array_merge(array('url' => $PAGE->url->out_as_local_url(false), + 'heading' => $PAGE->heading, + 'title' => $PAGE->title), $this->data['other']); + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentviewed', 'moodle'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return 'User with id ' . $this->userid . ' viewed content ' . $this->get_url(); + } + + /** + * Set legacy logdata. + * + * @param array $legacydata legacy logdata. + */ + public function set_legacy_logdata(array $legacydata) { + $this->legacylogdata = $legacydata; + } + + /** + * Get legacy logdata. + * + * @return null|array legacy log data. + */ + protected function get_legacy_logdata() { + return $this->legacylogdata; + } + + /** + * Custom validation. + * + * @throws \coding_exception when validation does not pass. + * @return void + */ + protected function validate_data() { + if (debugging('', DEBUG_DEVELOPER)) { + // Make sure this class is never used without a content identifier. + if (empty($this->other['content'])) { + throw new \coding_exception('content_viewed event must define content identifier.'); + } + } + } +} + diff --git a/lib/tests/event_content_viewed_test.php b/lib/tests/event_content_viewed_test.php new file mode 100644 index 00000000000..25b74627d22 --- /dev/null +++ b/lib/tests/event_content_viewed_test.php @@ -0,0 +1,94 @@ +. + +/** + * Tests for base content viewed event. + * + * @package core + * @category phpunit + * @copyright 2013 Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); +require_once(__DIR__.'/fixtures/event_fixtures.php'); + +/** + * Class core_event_page_viewed_testcase + * + * Tests for event \core\event\page_viewed + */ +class core_event_content_viewed_testcase extends advanced_testcase { + + /** + * Set basic page properties. + */ + public function setUp() { + global $PAGE; + // Set page details. + $PAGE->set_url('/someurl.php'); + $PAGE->set_pagelayout('somelayout'); + } + + /** + * Test event properties and methods. + */ + public function test_event_attributes() { + global $PAGE; + + $this->resetAfterTest(); + + // Trigger the page view event. + $sink = $this->redirectEvents(); + $pageevent = \core_tests\event\content_viewed::create(array('other' => array('content' => 'tests'))); + $pageevent->set_page_detail(); // Set page details. + $legacydata = array(SITEID, 'site', 'view', 'view.php?id='.SITEID, SITEID); + $pageevent->set_legacy_logdata($legacydata); // Set legacy data. + $pageevent->trigger(); + $result = $sink->get_events(); + $event = reset($result); + + // Test page details. + $data = array( 'url' => $PAGE->url->out_as_local_url(false), + 'heading' => $PAGE->heading, + 'title' => $PAGE->title, + 'content' => 'tests'); + $this->assertEquals($data, $event->other); + + // Test legacy stuff. + $this->assertEventLegacyLogData($legacydata, $event); + $pageevent = \core_tests\event\content_viewed::create(array('other' => array('content' => 'tests'))); + $pageevent->trigger(); + $result = $sink->get_events(); + $event = $result[1]; + $this->assertEventLegacyLogData(null, $event); + } + + /** + * Test custom validations. + */ + public function test_event_context_exception() { + + $this->resetAfterTest(); + + // Make sure content identifier is always set. + $this->setExpectedException('coding_exception'); + $pageevent = \core_tests\event\content_viewed::create(); + $pageevent->set_page_detail(); + $pageevent->trigger(); + } +} + diff --git a/lib/tests/fixtures/event_fixtures.php b/lib/tests/fixtures/event_fixtures.php index 1d775d967ed..01275ca9143 100644 --- a/lib/tests/fixtures/event_fixtures.php +++ b/lib/tests/fixtures/event_fixtures.php @@ -211,3 +211,12 @@ class noname_event extends \core\event\base { $this->context = \context_system::instance(); } } + +/** + * Class content_viewed. + * + * Wrapper for testing \core\event\content_viewed . + */ +class content_viewed extends \core\event\content_viewed { +} +