This also includes the abstract class course_module_viewed.
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Event observers for workshopallocation_scheduled.
+ *
+ * @package workshopallocation_scheduled
+ * @copyright 2013 Adrian Greeve <adrian@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace workshopallocation_scheduled;
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Class for workshopallocation_scheduled observers.
+ *
+ * @package workshopallocation_scheduled
+ * @copyright 2013 Adrian Greeve <adrian@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class observer {
+
+ /**
+ * Triggered when the '\mod_workshop\event\course_module_viewed' event is triggered.
+ *
+ * This does the same job as {@link workshopallocation_scheduled_cron()} but for the
+ * single workshop. The idea is that we do not need to wait for cron to execute.
+ * Displaying the workshop main view.php can trigger the scheduled allocation, too.
+ *
+ * @param \mod_workshop\event\course_module_viewed $event
+ * @return bool
+ */
+ public static function workshop_viewed($event) {
+ global $DB;
+
+ $workshop = $event->get_record_snapshot('workshop', $event->objectid);
+ $course = $event->get_record_snapshot('course', $event->courseid);
+ $cm = $event->get_record_snapshot('course_modules', $event->contextinstanceid);
+
+ $workshop = new \workshop($workshop, $cm, $course);
+ $now = time();
+
+ // Non-expensive check to see if the scheduled allocation can even happen.
+ if ($workshop->phase == \workshop::PHASE_SUBMISSION and $workshop->submissionend > 0 and $workshop->submissionend < $now) {
+
+ // Make sure the scheduled allocation has been configured for this workshop, that it has not
+ // been executed yet and that the passed workshop record is still valid.
+ $sql = "SELECT a.id
+ FROM {workshopallocation_scheduled} a
+ JOIN {workshop} w ON a.workshopid = w.id
+ WHERE w.id = :workshopid
+ AND a.enabled = 1
+ AND w.phase = :phase
+ AND w.submissionend > 0
+ AND w.submissionend < :now
+ AND (a.timeallocated IS NULL OR a.timeallocated < w.submissionend)";
+ $params = array('workshopid' => $workshop->id, 'phase' => \workshop::PHASE_SUBMISSION, 'now' => $now);
+
+ if ($DB->record_exists_sql($sql, $params)) {
+ // Allocate submissions for assessments.
+ $allocator = $workshop->allocator_instance('scheduled');
+ $result = $allocator->execute();
+ // Todo inform the teachers about the results.
+ }
+ }
+ return true;
+ }
+}
defined('MOODLE_INTERNAL') || die();
-$handlers = array(
-
- // The workshop main page is displayed to the user
- 'workshop_viewed' => array(
- 'handlerfile' => '/mod/workshop/allocation/scheduled/lib.php',
- 'handlerfunction' => 'workshopallocation_scheduled_workshop_viewed',
- 'schedule' => 'instant',
- 'internal' => 1,
- ),
-
+$observers = array(
+ array(
+ 'eventname' => '\mod_workshop\event\course_module_viewed',
+ 'callback' => '\workshopallocation_scheduled\observer::workshop_viewed',
+ )
);
// todo inform the teachers about the results
}
}
-
-////////////////////////////////////////////////////////////////////////////////
-// Events API
-////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Handler for the 'workshop_viewed' event
- *
- * This does the same job as {@link workshopallocation_scheduled_cron()} but for the
- * single workshop. The idea is that we do not need to wait forcron to execute.
- * Displaying the workshop main view.php can trigger the scheduled allocation, too.
- *
- * @param stdClass $event event data
- * @return bool
- */
-function workshopallocation_scheduled_workshop_viewed($event) {
- global $DB;
-
- $workshop = $event->workshop;
- $now = time();
-
- // Non-expensive check to see if the scheduled allocation can even happen.
- if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->submissionend > 0 and $workshop->submissionend < $now) {
-
- // Make sure the scheduled allocation has been configured for this workshop, that it has not
- // been executed yet and that the passed workshop record is still valid.
- $sql = "SELECT a.id
- FROM {workshopallocation_scheduled} a
- JOIN {workshop} w ON a.workshopid = w.id
- WHERE w.id = :workshopid
- AND a.enabled = 1
- AND w.phase = :phase
- AND w.submissionend > 0
- AND w.submissionend < :now
- AND (a.timeallocated IS NULL OR a.timeallocated < w.submissionend)";
- $params = array('workshopid' => $workshop->id, 'phase' => workshop::PHASE_SUBMISSION, 'now' => $now);
-
- if ($DB->record_exists_sql($sql, $params)) {
- // Allocate submissions for assessments.
- $allocator = $workshop->allocator_instance('scheduled');
- $result = $allocator->execute();
- // todo inform the teachers about the results
- }
- }
-
- return true;
-}
--- /dev/null
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file contains an event for when a workshop activity is viewed.
+ *
+ * @package mod_workshop
+ * @copyright 2013 Adrian Greeve <adrian@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace mod_workshop\event;
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Event for when a workshop activity is viewed.
+ *
+ * @package mod_workshop
+ * @copyright 2013 Adrian Greeve
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_module_viewed extends \core\event\content_viewed {
+
+ /**
+ * Init method.
+ */
+ protected function init() {
+ $this->data['crud'] = 'r';
+ $this->data['level'] = self::LEVEL_PARTICIPATING;
+ $this->data['objecttable'] = 'workshop';
+ }
+
+ /**
+ * Does this event replace a legacy event?
+ *
+ * @return string legacy event name
+ */
+ public static function get_legacy_eventname() {
+ return 'workshop_viewed';
+ }
+
+ /**
+ * Returns non-localised description of what happened.
+ *
+ * @return string
+ */
+ public function get_description() {
+ return 'User with id ' . $this->userid . ' viewed content ' . $this->get_url() . ' In phase ' . $this->other['content'];
+ }
+
+ /**
+ * Returns localised general event name.
+ *
+ * @return string
+ */
+ public static function get_name() {
+ return get_string('workshopviewed', 'workshop');
+ }
+
+ /**
+ * Returns relevant URL.
+ * @return \moodle_url
+ */
+ public function get_url() {
+ $url = '/mod/workshop/view.php';
+ return new \moodle_url($url, array('id'=>$this->context->instanceid));
+ }
+
+ /**
+ * Legacy event data if get_legacy_eventname() is not empty.
+ *
+ * @return mixed
+ */
+ protected function get_legacy_eventdata() {
+ global $USER;
+
+ $workshop = $this->get_record_snapshot('workshop', $this->objectid);
+ $course = $this->get_record_snapshot('course', $this->courseid);
+ $cm = $this->get_record_snapshot('course_modules', $this->context->instanceid);
+ $workshop = new \workshop($workshop, $cm, $course);
+ return (object)array('workshop' => $workshop, 'user' => $USER);
+ }
+
+ /**
+ * replace add_to_log() statement.
+ *
+ * @return array of parameters to be passed to legacy add_to_log() function.
+ */
+ protected function get_legacy_logdata() {
+ $url = new \moodle_url('view.php', array('id' => $this->context->instanceid));
+ return array($this->courseid, 'workshop', 'view', $url->out(), $this->objectid, $this->context->instanceid);
+ }
+}
$string['workshop:viewauthorpublished'] = 'View authors of published submissions';
$string['workshop:viewpublishedsubmissions'] = 'View published submissions';
$string['workshop:viewreviewernames'] = 'View reviewer names';
+$string['workshopviewed'] = 'Workshop viewed';
$string['yourassessment'] = 'Your assessment';
$string['yourgrades'] = 'Your grades';
$string['yoursubmission'] = 'Your submission';
$eval = optional_param('eval', null, PARAM_PLUGIN);
if ($id) {
- $cm = get_coursemodule_from_id('workshop', $id, 0, false, MUST_EXIST);
- $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
- $workshop = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST);
+ $cm = get_coursemodule_from_id('workshop', $id, 0, false, MUST_EXIST);
+ $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
+ $workshoprecord = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST);
} else {
- $workshop = $DB->get_record('workshop', array('id' => $w), '*', MUST_EXIST);
- $course = $DB->get_record('course', array('id' => $workshop->course), '*', MUST_EXIST);
- $cm = get_coursemodule_from_instance('workshop', $workshop->id, $course->id, false, MUST_EXIST);
+ $workshoprecord = $DB->get_record('workshop', array('id' => $w), '*', MUST_EXIST);
+ $course = $DB->get_record('course', array('id' => $workshoprecord->course), '*', MUST_EXIST);
+ $cm = get_coursemodule_from_instance('workshop', $workshoprecord->id, $course->id, false, MUST_EXIST);
}
require_login($course, true, $cm);
require_capability('mod/workshop:view', $PAGE->context);
-$workshop = new workshop($workshop, $cm, $course);
-$workshop->log('view');
+$workshop = new workshop($workshoprecord, $cm, $course);
// Mark viewed
$completion = new completion_info($course);
$completion->set_module_viewed($cm);
-// Fire the event
-events_trigger('workshop_viewed', (object)array(
- 'workshop' => $workshop,
- 'user' => $USER,
-));
+$eventdata = array();
+$eventdata['objectid'] = $workshop->id;
+$eventdata['context'] = $workshop->context;
+$eventdata['courseid'] = $course->id;
+$eventdata['other']['content'] = $workshop->phase;
+
+$PAGE->set_url($workshop->view_url());
+$event = \mod_workshop\event\course_module_viewed::create($eventdata);
+$event->add_record_snapshot('course', $course);
+$event->add_record_snapshot('workshop', $workshoprecord);
+$event->add_record_snapshot('course_modules', $cm);
+$event->set_page_detail();
+$event->trigger();
// If the phase is to be switched, do it asap. This just has to happen after triggering
// the event so that the scheduled allocator had a chance to allocate submissions.
$USER->editing = $editmode;
}
-$PAGE->set_url($workshop->view_url());
$PAGE->set_title($workshop->name);
$PAGE->set_heading($course->fullname);