Commit | Line | Data |
---|---|---|
d9cb06dc | 1 | <?php |
2 | ||
3 | // This file is part of Moodle - http://moodle.org/ | |
4 | // | |
5 | // Moodle is free software: you can redistribute it and/or modify | |
6 | // it under the terms of the GNU General Public License as published by | |
7 | // the Free Software Foundation, either version 3 of the License, or | |
8 | // (at your option) any later version. | |
9 | // | |
10 | // Moodle is distributed in the hope that it will be useful, | |
11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | // GNU General Public License for more details. | |
14 | // | |
15 | // You should have received a copy of the GNU General Public License | |
16 | // along with Moodle. If not, see <http://www.gnu.org/licenses/>. | |
17 | ||
18 | /** | |
19 | * Display all recent activity in a flexible way | |
20 | * | |
21 | * @copyright 1999 Martin Dougiamas http://dougiamas.com | |
22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
23 | * @package course | |
24 | */ | |
25 | ||
26 | require_once('../config.php'); | |
27 | require_once('lib.php'); | |
28 | require_once('recent_form.php'); | |
29 | ||
30 | $id = required_param('id', PARAM_INT); | |
31 | ||
a6855934 | 32 | $PAGE->set_url('/course/recent.php', array('id'=>$id)); |
d9cb06dc | 33 | |
34 | if (!$course = $DB->get_record('course', array('id'=>$id))) { | |
35 | print_error("That's an invalid course id"); | |
36 | } | |
46054fa8 | 37 | |
d9cb06dc | 38 | require_login($course); |
46054fa8 | 39 | |
d9cb06dc | 40 | add_to_log($course->id, "course", "recent", "recent.php?id=$course->id", $course->id); |
dd97c328 | 41 | |
d9cb06dc | 42 | $context = get_context_instance(CONTEXT_COURSE, $course->id); |
dd97c328 | 43 | |
d9cb06dc | 44 | $lastlogin = time() - COURSE_MAX_RECENT_PERIOD; |
45 | if (!isguestuser() and !empty($USER->lastcourseaccess[$COURSE->id])) { | |
46 | if ($USER->lastcourseaccess[$COURSE->id] > $lastlogin) { | |
47 | $lastlogin = $USER->lastcourseaccess[$COURSE->id]; | |
46054fa8 | 48 | } |
d9cb06dc | 49 | } |
46054fa8 | 50 | |
fbaea88f | 51 | $param = new stdClass(); |
d9cb06dc | 52 | $param->user = 0; |
53 | $param->modid = 'all'; | |
54 | $param->group = 0; | |
55 | $param->sortby = 'default'; | |
56 | $param->date = $lastlogin; | |
57 | $param->id = $COURSE->id; | |
58 | ||
59 | $mform = new recent_form(); | |
60 | $mform->set_data($param); | |
61 | if ($formdata = $mform->get_data()) { | |
62 | $param = $formdata; | |
63 | } | |
46054fa8 | 64 | |
d9cb06dc | 65 | $userinfo = get_string('allparticipants'); |
66 | $dateinfo = get_string('alldays'); | |
46054fa8 | 67 | |
d9cb06dc | 68 | if (!empty($param->user)) { |
69 | if (!$u = $DB->get_record('user', array('id'=>$param->user))) { | |
70 | print_error("That's an invalid user!"); | |
dd97c328 | 71 | } |
d9cb06dc | 72 | $userinfo = fullname($u); |
73 | } | |
e7d9c966 | 74 | |
d9cb06dc | 75 | $strrecentactivity = get_string('recentactivity'); |
a6855934 | 76 | $PAGE->navbar->add($strrecentactivity, new moodle_url('/course/recent.php', array('id'=>$course->id))); |
d9cb06dc | 77 | $PAGE->navbar->add($userinfo); |
78 | $PAGE->set_title("$course->shortname: $strrecentactivity"); | |
79 | $PAGE->set_heading($course->fullname); | |
80 | echo $OUTPUT->header(); | |
551028df | 81 | echo $OUTPUT->heading(format_string($course->fullname) . ": $userinfo", 2); |
6f80940b | 82 | |
d9cb06dc | 83 | $mform->display(); |
e7d9c966 | 84 | |
f20edd52 | 85 | $modinfo = get_fast_modinfo($course); |
d9cb06dc | 86 | get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused); |
e7d9c966 | 87 | |
d9cb06dc | 88 | if (has_capability('moodle/course:viewhiddensections', $context)) { |
89 | $hiddenfilter = ""; | |
90 | } else { | |
91 | $hiddenfilter = "AND cs.visible = 1"; | |
92 | } | |
93 | $sections = array(); | |
7487c856 SH |
94 | $rawsections = array_slice(get_all_sections($course->id), 0, $course->numsections+1, true); |
95 | $canviewhidden = has_capability('moodle/course:viewhiddensections', $context); | |
96 | foreach ($rawsections as $section) { | |
97 | if ($canviewhidden || !empty($section->visible)) { | |
d9cb06dc | 98 | $sections[$section->section] = $section; |
99 | } | |
100 | } | |
46054fa8 | 101 | |
d9cb06dc | 102 | if ($param->modid === 'all') { |
103 | // ok | |
46054fa8 | 104 | |
d9cb06dc | 105 | } else if (strpos($param->modid, 'mod/') === 0) { |
106 | $modname = substr($param->modid, strlen('mod/')); | |
107 | if (array_key_exists($modname, $modnames) and file_exists("$CFG->dirroot/mod/$modname/lib.php")) { | |
108 | $filter = $modname; | |
4581271a | 109 | } |
d9cb06dc | 110 | |
111 | } else if (strpos($param->modid, 'section/') === 0) { | |
112 | $sectionid = substr($param->modid, strlen('section/')); | |
113 | if (isset($sections[$sectionid])) { | |
114 | $sections = array($sectionid=>$sections[$sectionid]); | |
08e2111b | 115 | } |
116 | ||
d9cb06dc | 117 | } else if (is_numeric($param->modid)) { |
118 | $section = $sections[$modinfo->cms[$param->modid]->sectionnum]; | |
119 | $section->sequence = $param->modid; | |
120 | $sections = array($section->sequence=>$section); | |
121 | } | |
46054fa8 | 122 | |
4581271a | 123 | |
d9cb06dc | 124 | if (is_null($modinfo->groups)) { |
125 | $modinfo->groups = groups_get_user_groups($course->id); // load all my groups and cache it in modinfo | |
126 | } | |
b934e7a3 | 127 | |
d9cb06dc | 128 | $activities = array(); |
129 | $index = 0; | |
4581271a | 130 | |
d9cb06dc | 131 | foreach ($sections as $section) { |
dd97c328 | 132 | |
fbaea88f | 133 | $activity = new stdClass(); |
d9cb06dc | 134 | $activity->type = 'section'; |
135 | if ($section->section > 0) { | |
7487c856 | 136 | $activity->name = get_section_name($course, $section); |
d9cb06dc | 137 | } else { |
138 | $activity->name = ''; | |
dd97c328 | 139 | } |
08e2111b | 140 | |
d9cb06dc | 141 | $activity->visible = $section->visible; |
142 | $activities[$index++] = $activity; | |
4581271a | 143 | |
d9cb06dc | 144 | if (empty($section->sequence)) { |
145 | continue; | |
146 | } | |
b934e7a3 | 147 | |
d9cb06dc | 148 | $sectionmods = explode(",", $section->sequence); |
dd97c328 | 149 | |
d9cb06dc | 150 | foreach ($sectionmods as $cmid) { |
151 | if (!isset($mods[$cmid]) or !isset($modinfo->cms[$cmid])) { | |
dd97c328 | 152 | continue; |
b934e7a3 | 153 | } |
154 | ||
d9cb06dc | 155 | $cm = $modinfo->cms[$cmid]; |
dd97c328 | 156 | |
d9cb06dc | 157 | if (!$cm->uservisible) { |
158 | continue; | |
159 | } | |
4581271a | 160 | |
d9cb06dc | 161 | if (!empty($filter) and $cm->modname != $filter) { |
162 | continue; | |
163 | } | |
08e2111b | 164 | |
d9cb06dc | 165 | $libfile = "$CFG->dirroot/mod/$cm->modname/lib.php"; |
5a810603 | 166 | |
d9cb06dc | 167 | if (file_exists($libfile)) { |
168 | require_once($libfile); | |
169 | $get_recent_mod_activity = $cm->modname."_get_recent_mod_activity"; | |
4581271a | 170 | |
d9cb06dc | 171 | if (function_exists($get_recent_mod_activity)) { |
fbaea88f | 172 | $activity = new stdClass(); |
d9cb06dc | 173 | $activity->type = 'activity'; |
174 | $activity->cmid = $cmid; | |
175 | $activities[$index++] = $activity; | |
176 | $get_recent_mod_activity($activities, $index, $param->date, $course->id, $cmid, $param->user, $param->group); | |
4581271a | 177 | } |
178 | } | |
179 | } | |
d9cb06dc | 180 | } |
4581271a | 181 | |
d9cb06dc | 182 | $detail = true; |
4581271a | 183 | |
d9cb06dc | 184 | switch ($param->sortby) { |
185 | case 'datedesc' : usort($activities, 'compare_activities_by_time_desc'); break; | |
186 | case 'dateasc' : usort($activities, 'compare_activities_by_time_asc'); break; | |
187 | case 'default' : | |
188 | default : $detail = false; $param->sortby = 'default'; | |
a8e44ce4 | 189 | |
d9cb06dc | 190 | } |
4581271a | 191 | |
d9cb06dc | 192 | if (!empty($activities)) { |
4581271a | 193 | |
d9cb06dc | 194 | $newsection = true; |
195 | $lastsection = ''; | |
196 | $newinstance = true; | |
197 | $lastinstance = ''; | |
198 | $inbox = false; | |
4581271a | 199 | |
d9cb06dc | 200 | $section = 0; |
b934e7a3 | 201 | |
d9cb06dc | 202 | $activity_count = count($activities); |
203 | $viewfullnames = array(); | |
b934e7a3 | 204 | |
d9cb06dc | 205 | foreach ($activities as $key => $activity) { |
b934e7a3 | 206 | |
d9cb06dc | 207 | if ($activity->type == 'section') { |
208 | if ($param->sortby != 'default') { | |
209 | continue; // no section if ordering by date | |
210 | } | |
211 | if ($activity_count == ($key + 1) or $activities[$key+1]->type == 'section') { | |
212 | // peak at next activity. If it's another section, don't print this one! | |
213 | // this means there are no activities in the current section | |
214 | continue; | |
b934e7a3 | 215 | } |
d9cb06dc | 216 | } |
0f87cb1d | 217 | |
d9cb06dc | 218 | if (($activity->type == 'section') && ($param->sortby == 'default')) { |
219 | if ($inbox) { | |
220 | echo $OUTPUT->box_end(); | |
1ba862ec | 221 | echo $OUTPUT->spacer(array('height'=>30, 'br'=>true)); // should be done with CSS instead |
d9cb06dc | 222 | } |
223 | echo $OUTPUT->box_start(); | |
7eea889b FM |
224 | if (!empty($activity->name)) { |
225 | echo html_writer::tag('h2', $activity->name); | |
226 | } | |
d9cb06dc | 227 | $inbox = true; |
0f87cb1d | 228 | |
d9cb06dc | 229 | } else if ($activity->type == 'activity') { |
dd97c328 | 230 | |
d9cb06dc | 231 | if ($param->sortby == 'default') { |
232 | $cm = $modinfo->cms[$activity->cmid]; | |
dd97c328 | 233 | |
d9cb06dc | 234 | if ($cm->visible) { |
7eea889b | 235 | $class = ''; |
d9cb06dc | 236 | } else { |
7eea889b | 237 | $class = 'dimmed'; |
d9cb06dc | 238 | } |
239 | $name = format_string($cm->name); | |
240 | $modfullname = $modnames[$cm->modname]; | |
dd97c328 | 241 | |
7eea889b FM |
242 | $image = $OUTPUT->pix_icon('icon', $modfullname, $cm->modname, array('class' => 'icon smallicon')); |
243 | $link = html_writer::link(new moodle_url("/mod/$cm->modname/view.php", | |
244 | array("id" => $cm->id)), $name, array('class' => $class)); | |
245 | echo html_writer::tag('h3', "$image $modfullname $link"); | |
d9cb06dc | 246 | } |
08e2111b | 247 | |
d9cb06dc | 248 | } else { |
a8e44ce4 | 249 | |
d9cb06dc | 250 | if (!isset($viewfullnames[$activity->cmid])) { |
251 | $cm_context = get_context_instance(CONTEXT_MODULE, $activity->cmid); | |
252 | $viewfullnames[$activity->cmid] = has_capability('moodle/site:viewfullnames', $cm_context); | |
253 | } | |
76cbde41 | 254 | |
d9cb06dc | 255 | if (!$inbox) { |
256 | echo $OUTPUT->box_start(); | |
257 | $inbox = true; | |
258 | } | |
a8e44ce4 | 259 | |
d9cb06dc | 260 | $print_recent_mod_activity = $activity->type.'_print_recent_mod_activity'; |
a8e44ce4 | 261 | |
d9cb06dc | 262 | if (function_exists($print_recent_mod_activity)) { |
263 | $print_recent_mod_activity($activity, $course->id, $detail, $modnames, $viewfullnames[$activity->cmid]); | |
46054fa8 | 264 | } |
265 | } | |
d9cb06dc | 266 | } |
08e2111b | 267 | |
d9cb06dc | 268 | if ($inbox) { |
269 | echo $OUTPUT->box_end(); | |
270 | } | |
0f87cb1d | 271 | |
08e2111b | 272 | |
d9cb06dc | 273 | } else { |
08e2111b | 274 | |
7eea889b | 275 | echo html_writer::tag('h3', get_string('norecentactivity'), array('class' => 'mdl-align')); |
46054fa8 | 276 | |
d9cb06dc | 277 | } |
4581271a | 278 | |
d9cb06dc | 279 | echo $OUTPUT->footer(); |
46054fa8 | 280 | |
4581271a | 281 | function compare_activities_by_time_desc($a, $b) { |
96dcfb56 | 282 | // make sure the activities actually have a timestamp property |
dd97c328 | 283 | if ((!array_key_exists('timestamp', $a)) or (!array_key_exists('timestamp', $b))) { |
96dcfb56 | 284 | return 0; |
285 | } | |
4581271a | 286 | if ($a->timestamp == $b->timestamp) |
287 | return 0; | |
288 | return ($a->timestamp > $b->timestamp) ? -1 : 1; | |
289 | } | |
290 | ||
291 | function compare_activities_by_time_asc($a, $b) { | |
96dcfb56 | 292 | // make sure the activities actually have a timestamp property |
dd97c328 | 293 | if ((!array_key_exists('timestamp', $a)) or (!array_key_exists('timestamp', $b))) { |
96dcfb56 | 294 | return 0; |
295 | } | |
4581271a | 296 | if ($a->timestamp == $b->timestamp) |
297 | return 0; | |
298 | return ($a->timestamp < $b->timestamp) ? -1 : 1; | |
299 | } | |
d9cb06dc | 300 |