Permalink
Browse files

MDL-36968 Move function print_recent_activity() to the block recent_a…

…ctivity
  • Loading branch information...
marinaglancy committed Dec 5, 2012
1 parent 50ac16b commit a3f66bdeac7294447d14120fef4cc955a5ad7fe3
@@ -1,12 +1,57 @@
<?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/>.
+
+/**
+ * class block_recent_activity
+ *
+ * @package block_recent_activity
+ * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
require_once($CFG->dirroot.'/course/lib.php');
+/**
+ * class block_recent_activity
+ *
+ * @package block_recent_activity
+ * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
class block_recent_activity extends block_base {
+
+ /**
+ * Use {@link block_recent_activity::get_timestart()} to access
+ *
+ * @var int stores the time since when we want to show recent activity
+ */
+ protected $timestart = null;
+
+ /**
+ * Initialises the block
+ */
function init() {
$this->title = get_string('pluginname', 'block_recent_activity');
}
+ /**
+ * Returns the content object
+ *
+ * @return stdObject
+ */
function get_content() {
if ($this->content !== NULL) {
return $this->content;
@@ -21,15 +66,150 @@ function get_content() {
$this->content->text = '';
$this->content->footer = '';
- // Slightly hacky way to do it but...
- ob_start();
- print_recent_activity($this->page->course);
- $this->content->text = ob_get_contents();
- ob_end_clean();
+ $renderer = $this->page->get_renderer('block_recent_activity');
+ $this->content->text = $renderer->recent_activity($this->page->course,
+ $this->get_timestart(),
+ $this->get_recent_enrolments(),
+ $this->get_structural_changes(),
+ $this->get_modules_recent_activity());
return $this->content;
}
+ /**
+ * Returns the time since when we want to show recent activity
+ *
+ * For guest users it is 2 days, for registered users it is the time of last access to the course
+ *
+ * @return int
+ */
+ protected function get_timestart() {
+ global $USER;
+ if ($this->timestart === null) {
+ $this->timestart = round(time() - COURSE_MAX_RECENT_PERIOD, -2); // better db caching for guests - 100 seconds
+
+ if (!isguestuser()) {
+ if (!empty($USER->lastcourseaccess[$this->page->course->id])) {
+ if ($USER->lastcourseaccess[$this->page->course->id] > $this->timestart) {
+ $this->timestart = $USER->lastcourseaccess[$this->page->course->id];
+ }
+ }
+ }
+ }
+ return $this->timestart;
+ }
+
+ /**
+ * Returns all recent enrollments
+ *
+ * @todo MDL-36993 this function always return empty array
+ * @return array array of entries from {user} table
+ */
+ protected function get_recent_enrolments() {
+ return get_recent_enrolments($this->page->course->id, $this->get_timestart());
+ }
+
+ /**
+ * Returns list of recent changes in course structure
+ *
+ * It includes adding, editing or deleting of the resources or activities
+ * Excludes changes on labels, and also if activity was both added and deleted
+ *
+ * @return array array of changes. Each element is an array containing attributes:
+ * 'action' - one of: 'add mod', 'update mod', 'delete mod'
+ * 'module' - instance of cm_info (for 'delete mod' it is an object with attributes modname and modfullname)
+ */
+ protected function get_structural_changes() {
+ global $DB, $CFG;
+ $course = $this->page->course;
+ $timestart = $this->get_timestart();
+ $changelist = array();
+ $logs = $DB->get_records_select('log',
+ "time > ? AND course = ? AND
+ module = 'course' AND
+ (action = 'add mod' OR action = 'update mod' OR action = 'delete mod')",
+ array($timestart, $course->id), "id ASC");
+ if ($logs) {
+ $modinfo = get_fast_modinfo($course);
+ $newgones = array(); // added and later deleted items
+ foreach ($logs as $key => $log) {
+ $info = explode(' ', $log->info);
+
+ // note: in most cases I replaced hardcoding of label with use of
+ // $cm->has_view() but it was not possible to do this here because
+ // we don't necessarily have the $cm for it
+ if ($info[0] == 'label') { // Labels are ignored in recent activity
+ continue;
+ }
+
+ if (count($info) != 2) {
+ debugging("Incorrect log entry info: id = ".$log->id, DEBUG_DEVELOPER);
+ continue;
+ }
+
+ $modname = $info[0];
+ $instanceid = $info[1];
+
+ if ($log->action == 'delete mod') {
+ // unfortunately we do not know if the mod was visible
+ if (!array_key_exists($log->info, $newgones)) {
+ $changelist[$log->info] = array('action' => $log->action,
+ 'module' => (object)array(
+ 'modname' => $modname,
+ 'modfullname' => get_string('modulename', $modname)
+ ));
+ }
+ } else {
+ if (!isset($modinfo->instances[$modname][$instanceid])) {
+ if ($log->action == 'add mod') {
+ // do not display added and later deleted activities
+ $newgones[$log->info] = true;
+ }
+ continue;
+ }
+ $cm = $modinfo->instances[$modname][$instanceid];
+ if ($cm->uservisible && empty($changelist[$log->info])) {
+ $changelist[$log->info] = array('action' => $log->action, 'module' => $cm);
+ }
+ }
+ }
+ }
+ return $changelist;
+ }
+
+ /**
+ * Returns list of recent activity within modules
+ *
+ * For each used module type executes callback MODULE_print_recent_activity()
+ *
+ * @return array array of pairs moduletype => content
+ */
+ protected function get_modules_recent_activity() {
+ $context = context_course::instance($this->page->course->id);
+ $viewfullnames = has_capability('moodle/site:viewfullnames', $context);
+ $hascontent = false;
+
+ $modinfo = get_fast_modinfo($this->page->course);
+ $usedmodules = $modinfo->get_used_module_names();
+ $recentactivity = array();
+ foreach ($usedmodules as $modname => $modfullname) {
+ // Each module gets it's own logs and prints them
+ ob_start();
+ $hascontent = component_callback('mod_'. $modname, 'print_recent_activity',
+ array($this->page->course, $viewfullnames, $this->get_timestart()), false);
+ if ($hascontent) {
+ $recentactivity[$modname] = ob_get_contents();
+ }
+ ob_end_clean();
+ }
+ return $recentactivity;
+ }
+
+ /**
+ * Which page types this block may appear on.
+ *
+ * @return array page-type prefix => true/false.
+ */
function applicable_formats() {
return array('all' => true, 'my' => false, 'tag' => false);
}
@@ -0,0 +1,128 @@
+<?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/>.
+
+/**
+ * Renderer for block recent_activity
+ *
+ * @package block_recent_activity
+ * @copyright 2012 Marina Glancy
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die;
+
+/**
+ * recent_activity block rendrer
+ *
+ * @package block_recent_activity
+ * @copyright 2012 Marina Glancy
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class block_recent_activity_renderer extends plugin_renderer_base {
+
+ /**
+ * Renders HTML to display recent_activity block
+ *
+ * @param stdClass $course
+ * @param int $timestart
+ * @param array $recentenrolments array of changes in enrolments
+ * @param array $structuralchanges array of changes in course structure
+ * @param array $modulesrecentactivity array of changes in modules (provided by modules)
+ * @return string
+ */
+ public function recent_activity($course, $timestart, $recentenrolments, $structuralchanges,
+ $modulesrecentactivity) {
+
+ $output = html_writer::tag('div',
+ get_string('activitysince', '', userdate($timestart)),
+ array('class' => 'activityhead'));
+
+ $output .= html_writer::tag('div',
+ html_writer::link(new moodle_url('/course/recent.php', array('id' => $course->id)),
+ get_string('recentactivityreport')),
+ array('class' => 'activityhead'));
+
+ $content = false;
+
+ // Firstly, have there been any new enrolments?
+ if ($recentenrolments) {
+ $content = true;
+ $context = context_course::instance($course->id);
+ $viewfullnames = has_capability('moodle/site:viewfullnames', $context);
+ $output .= html_writer::start_tag('div', array('class' => 'newusers'));
+ $output .= $this->heading(get_string("newusers").':', 3);
+ //Accessibility: new users now appear in an <OL> list.
+ $output .= html_writer::start_tag('ol', array('class' => 'list'));
+ foreach ($recentenrolments as $user) {
+ $output .= html_writer::tag('li',
+ html_writer::link(new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id)),
+ fullname($user, $viewfullnames)),
+ array('class' => 'name'));
+ }
+ $output .= html_writer::end_tag('ol');
+ $output .= html_writer::end_tag('div');
+ }
+
+ // Next, have there been any modifications to the course structure?
+ if (!empty($structuralchanges)) {
+ $content = true;
+ $output .= $this->heading(get_string("courseupdates").':', 3);
+ foreach ($structuralchanges as $changeinfo => $change) {
+ $output .= $this->structural_change($change);
+ }
+ }
+
+ // Now display new things from each module
+ foreach ($modulesrecentactivity as $modname => $moduleactivity) {
+ $content = true;
+ $output .= $moduleactivity;
+ }
+
+ if (! $content) {
+ $output .= html_writer::tag('p', get_string('nothingnew'), array('class' => 'message'));
+ }
+ return $output;
+ }
+
+ /**
+ * Renders HTML for one change in course structure
+ *
+ * @see block_recent_activity::get_structural_changes()
+ * @param array $change array containing attributes
+ * 'action' - one of: 'add mod', 'update mod', 'delete mod'
+ * 'module' - instance of cm_info (for 'delete mod' it is an object with attributes modname and modfullname)
+ * @return string
+ */
+ protected function structural_change($change) {
+ $cm = $change['module'];
+ switch ($change['action']) {
+ case 'delete mod':
+ $text = get_string('deletedactivity', 'moodle', $cm->modfullname);
+ break;
+ case 'add mod':
+ $text = get_string('added', 'moodle', $cm->modfullname). '<br />'.
+ html_writer::link($cm->get_url(), format_string($cm->name, true));
+ break;
+ case 'update mod':
+ $text = get_string('updated', 'moodle', $cm->modfullname). '<br />'.
+ html_writer::link($cm->get_url(), format_string($cm->name, true));
+ break;
+ default:
+ return '';
+ }
+ return html_writer::tag('p', $text, array('class' => 'activity'));
+ }
+}
@@ -17,8 +17,7 @@
/**
* Version details
*
- * @package block
- * @subpackage recent_activity
+ * @package block_recent_activity
* @copyright 1999 onwards Martin Dougiamas (http://dougiamas.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
Oops, something went wrong.

0 comments on commit a3f66bd

Please sign in to comment.