Bumped the version up to 1.9.3
[moodle.git] / user / index.php
blob6bd4238a89a55230124778c4a1aad0c9f6a619be
1 <?PHP // $Id$
3 // Lists all the users within a given course
5 require_once('../config.php');
6 require_once($CFG->libdir.'/tablelib.php');
8 define('USER_SMALL_CLASS', 20); // Below this is considered small
9 define('USER_LARGE_CLASS', 200); // Above this is considered large
10 define('DEFAULT_PAGE_SIZE', 20);
11 define('SHOW_ALL_PAGE_SIZE', 5000);
13 $page = optional_param('page', 0, PARAM_INT); // which page to show
14 $perpage = optional_param('perpage', DEFAULT_PAGE_SIZE, PARAM_INT); // how many per page
15 $mode = optional_param('mode', NULL); // '0' for less details, '1' for more
16 $accesssince = optional_param('accesssince',0,PARAM_INT); // filter by last access. -1 = never
17 $search = optional_param('search','',PARAM_CLEAN);
18 $roleid = optional_param('roleid', 0, PARAM_INT); // optional roleid, -1 means all site users on frontpage
20 $contextid = optional_param('contextid', 0, PARAM_INT); // one of this or
21 $courseid = optional_param('id', 0, PARAM_INT); // this are required
23 if ($contextid) {
24 if (! $context = get_context_instance_by_id($contextid)) {
25 error("Context ID is incorrect");
27 if (! $course = get_record('course', 'id', $context->instanceid)) {
28 error("Course ID is incorrect");
30 } else {
31 if (! $course = get_record('course', 'id', $courseid)) {
32 error("Course ID is incorrect");
34 if (! $context = get_context_instance(CONTEXT_COURSE, $course->id)) {
35 error("Context ID is incorrect");
38 // not needed anymore
39 unset($contextid);
40 unset($courseid);
42 require_login($course);
44 $sitecontext = get_context_instance(CONTEXT_SYSTEM);
45 $frontpagectx = get_context_instance(CONTEXT_COURSE, SITEID);
47 if ($context->id != $frontpagectx->id) {
48 require_capability('moodle/course:viewparticipants', $context);
49 } else {
50 require_capability('moodle/site:viewparticipants', $sitecontext);
51 // override the default on frontpage
52 $roleid = optional_param('roleid', -1, PARAM_INT);
55 /// front page course is different
56 $rolenames = array();
57 $avoidroles = array();
59 if ($roles = get_roles_used_in_context($context, true)) {
60 // We should ONLY allow roles with moodle/course:view because otherwise we get little niggly issues
61 // like MDL-8093
62 // We should further exclude "admin" users (those with "doanything" at site level) because
63 // Otherwise they appear in every participant list
65 $canviewroles = get_roles_with_capability('moodle/course:view', CAP_ALLOW, $context);
66 $doanythingroles = get_roles_with_capability('moodle/site:doanything', CAP_ALLOW, $sitecontext);
68 if ($context->id == $frontpagectx->id) {
69 //we want admins listed on frontpage too
70 foreach ($doanythingroles as $dar) {
71 $canviewroles[$dar->id] = $dar;
73 $doanythingroles = array();
76 foreach ($roles as $role) {
77 if (!isset($canviewroles[$role->id])) { // Avoid this role (eg course creator)
78 $avoidroles[] = $role->id;
79 unset($roles[$role->id]);
80 continue;
82 if (isset($doanythingroles[$role->id])) { // Avoid this role (ie admin)
83 $avoidroles[] = $role->id;
84 unset($roles[$role->id]);
85 continue;
87 $rolenames[$role->id] = strip_tags(role_get_name($role, $context)); // Used in menus etc later on
91 if ($context->id == $frontpagectx->id and $CFG->defaultfrontpageroleid) {
92 // default frontpage role is assigned to all site users
93 unset($rolenames[$CFG->defaultfrontpageroleid]);
96 // no roles to display yet?
97 // frontpage course is an exception, on the front page course we should display all users
98 if (empty($rolenames) && $context->id != $frontpagectx->id) {
99 if (has_capability('moodle/role:assign', $context)) {
100 redirect($CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$context->id);
101 } else {
102 error ('No participants found for this course');
106 add_to_log($course->id, 'user', 'view all', 'index.php?id='.$course->id, '');
108 $bulkoperations = has_capability('moodle/course:bulkmessaging', $context);
110 $countries = get_list_of_countries();
112 $strnever = get_string('never');
114 $datestring->year = get_string('year');
115 $datestring->years = get_string('years');
116 $datestring->day = get_string('day');
117 $datestring->days = get_string('days');
118 $datestring->hour = get_string('hour');
119 $datestring->hours = get_string('hours');
120 $datestring->min = get_string('min');
121 $datestring->mins = get_string('mins');
122 $datestring->sec = get_string('sec');
123 $datestring->secs = get_string('secs');
125 if ($mode !== NULL) {
126 $SESSION->userindexmode = $fullmode = ($mode == 1);
127 } else if (isset($SESSION->userindexmode)) {
128 $fullmode = $SESSION->userindexmode;
129 } else {
130 $fullmode = false;
133 /// Check to see if groups are being used in this course
134 /// and if so, set $currentgroup to reflect the current group
136 $groupmode = groups_get_course_groupmode($course); // Groups are being used
137 $currentgroup = groups_get_course_group($course, true);
139 if (!$currentgroup) { // To make some other functions work better later
140 $currentgroup = NULL;
143 $isseparategroups = ($course->groupmode == SEPARATEGROUPS and $course->groupmodeforce and
144 !has_capability('moodle/site:accessallgroups', $context));
146 if ($isseparategroups and (!$currentgroup) ) {
147 $navlinks = array();
148 $navlinks[] = array('name' => get_string('participants'), 'link' => null, 'type' => 'misc');
149 $navigation = build_navigation($navlinks);
151 print_header("$course->shortname: ".get_string('participants'), $course->fullname, $navigation, "", "", true, "&nbsp;", navmenu($course));
152 print_heading(get_string("notingroup"));
153 print_footer($course);
154 exit;
157 // Should use this variable so that we don't break stuff every time a variable is added or changed.
158 $baseurl = $CFG->wwwroot.'/user/index.php?contextid='.$context->id.'&amp;roleid='.$roleid.'&amp;id='.$course->id.'&amp;perpage='.$perpage.'&amp;accesssince='.$accesssince.'&amp;search='.s($search);
160 /// Print headers
162 $navlinks = array();
163 $navlinks[] = array('name' => get_string('participants'), 'link' => null, 'type' => 'misc');
164 $navigation = build_navigation($navlinks);
166 print_header("$course->shortname: ".get_string('participants'), $course->fullname, $navigation, "", "", true, "&nbsp;", navmenu($course));
168 /// setting up tags
169 if ($course->id == SITEID) {
170 $filtertype = 'site';
171 } else if ($course->id && !$currentgroup) {
172 $filtertype = 'course';
173 $filterselect = $course->id;
174 } else {
175 $filtertype = 'group';
176 $filterselect = $currentgroup;
178 $currenttab = 'participants';
179 $user = $USER;
181 require_once($CFG->dirroot .'/user/tabs.php');
184 /// Get the hidden field list
185 if (has_capability('moodle/course:viewhiddenuserfields', $context)) {
186 $hiddenfields = array(); // teachers and admins are allowed to see everything
187 } else {
188 $hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields));
192 /// Print settings and things in a table across the top
194 echo '<table class="controls" cellspacing="0"><tr>';
196 /// Print my course menus
197 if ($mycourses = get_my_courses($USER->id)) {
198 echo '<td class="left">';
199 $courselist = array();
200 foreach ($mycourses as $mycourse) {
201 $courselist[$mycourse->id] = format_string($mycourse->shortname);
203 if (has_capability('moodle/site:viewparticipants', $sitecontext)) {
204 unset($courselist[SITEID]);
205 $courselist = array(SITEID => format_string($SITE->shortname)) + $courselist;
207 popup_form($CFG->wwwroot.'/user/index.php?roleid='.$roleid.'&amp;sifirst=&amp;silast=&amp;id=',
208 $courselist, 'courseform', $course->id, '', '', '', false, 'self', get_string('mycourses'));
209 echo '</td>';
212 echo '<td class="left">';
213 groups_print_course_menu($course, $baseurl);
214 echo '</td>';
216 // get minimum lastaccess for this course and display a dropbox to filter by lastaccess going back this far.
217 // we need to make it diferently for normal courses and site course
218 if ($context->id != $frontpagectx->id) {
219 $minlastaccess = get_field_sql('SELECT min(timeaccess)
220 FROM '.$CFG->prefix.'user_lastaccess
221 WHERE courseid = '.$course->id.'
222 AND timeaccess != 0');
223 $lastaccess0exists = record_exists('user_lastaccess', 'courseid', $course->id, 'timeaccess', 0);
224 } else {
225 $minlastaccess = get_field_sql('SELECT min(lastaccess)
226 FROM '.$CFG->prefix.'user
227 WHERE lastaccess != 0');
228 $lastaccess0exists = record_exists('user','lastaccess',0);
231 $now = usergetmidnight(time());
232 $timeaccess = array();
234 // makes sense for this to go first.
235 $timeoptions[0] = get_string('selectperiod');
237 // days
238 for ($i = 1; $i < 7; $i++) {
239 if (strtotime('-'.$i.' days',$now) >= $minlastaccess) {
240 $timeoptions[strtotime('-'.$i.' days',$now)] = get_string('numdays','moodle',$i);
243 // weeks
244 for ($i = 1; $i < 10; $i++) {
245 if (strtotime('-'.$i.' weeks',$now) >= $minlastaccess) {
246 $timeoptions[strtotime('-'.$i.' weeks',$now)] = get_string('numweeks','moodle',$i);
249 // months
250 for ($i = 2; $i < 12; $i++) {
251 if (strtotime('-'.$i.' months',$now) >= $minlastaccess) {
252 $timeoptions[strtotime('-'.$i.' months',$now)] = get_string('nummonths','moodle',$i);
255 // try a year
256 if (strtotime('-1 year',$now) >= $minlastaccess) {
257 $timeoptions[strtotime('-1 year',$now)] = get_string('lastyear');
260 if (!empty($lastaccess0exists)) {
261 $timeoptions[-1] = get_string('never');
264 if (count($timeoptions) > 1) {
265 echo '<td class="left">';
266 $baseurl = preg_replace('/&amp;accesssince='.$accesssince.'/','',$baseurl);
267 popup_form($baseurl.'&amp;accesssince=',$timeoptions,'timeoptions',$accesssince, '', '', '', false, 'self', get_string('usersnoaccesssince'));
268 echo '</td>';
272 echo '<td class="right">';
273 $formatmenu = array( '0' => get_string('detailedless'),
274 '1' => get_string('detailedmore'));
275 popup_form($baseurl.'&amp;mode=', $formatmenu, 'formatmenu', $fullmode, '', '', '', false, 'self', get_string('userlist'));
276 echo '</td></tr></table>';
278 if ($currentgroup and (!$isseparategroups or has_capability('moodle/site:accessallgroups', $context))) { /// Display info about the group
279 if ($group = groups_get_group($currentgroup)) {
280 if (!empty($group->description) or (!empty($group->picture) and empty($group->hidepicture))) {
281 echo '<table class="groupinfobox"><tr><td class="left side picture">';
282 print_group_picture($group, $course->id, true, false, false);
283 echo '</td><td class="content">';
284 echo '<h3>'.$group->name;
285 if (has_capability('moodle/course:managegroups', $context)) {
286 echo '&nbsp;<a title="'.get_string('editgroupprofile').'" href="'.$CFG->wwwroot.'/group/group.php?id='.$group->id.'&amp;courseid='.$group->courseid.'">';
287 echo '<img src="'.$CFG->pixpath.'/t/edit.gif" alt="'.get_string('editgroupprofile').'" />';
288 echo '</a>';
290 echo '</h3>';
291 echo format_text($group->description);
292 echo '</td></tr></table>';
297 /// Define a table showing a list of users in the current role selection
299 $tablecolumns = array('userpic', 'fullname');
300 $tableheaders = array(get_string('userpic'), get_string('fullname'));
301 if (!isset($hiddenfields['city'])) {
302 $tablecolumns[] = 'city';
303 $tableheaders[] = get_string('city');
305 if (!isset($hiddenfields['country'])) {
306 $tablecolumns[] = 'country';
307 $tableheaders[] = get_string('country');
309 if (!isset($hiddenfields['lastaccess'])) {
310 $tablecolumns[] = 'lastaccess';
311 $tableheaders[] = get_string('lastaccess');
314 if ($course->enrolperiod) {
315 $tablecolumns[] = 'timeend';
316 $tableheaders[] = get_string('enrolmentend');
319 if ($bulkoperations) {
320 $tablecolumns[] = '';
321 $tableheaders[] = get_string('select');
324 $table = new flexible_table('user-index-participants-'.$course->id);
326 $table->define_columns($tablecolumns);
327 $table->define_headers($tableheaders);
328 $table->define_baseurl($baseurl);
330 $table->sortable(true, 'lastaccess', SORT_DESC);
332 $table->set_attribute('cellspacing', '0');
333 $table->set_attribute('id', 'participants');
334 $table->set_attribute('class', 'generaltable generalbox');
336 $table->set_control_variables(array(
337 TABLE_VAR_SORT => 'ssort',
338 TABLE_VAR_HIDE => 'shide',
339 TABLE_VAR_SHOW => 'sshow',
340 TABLE_VAR_IFIRST => 'sifirst',
341 TABLE_VAR_ILAST => 'silast',
342 TABLE_VAR_PAGE => 'spage'
344 $table->setup();
347 // we are looking for all users with this role assigned in this context or higher
348 if ($usercontexts = get_parent_contexts($context)) {
349 $listofcontexts = '('.implode(',', $usercontexts).')';
350 } else {
351 $listofcontexts = '('.$sitecontext->id.')'; // must be site
353 if ($roleid > 0) {
354 $selectrole = " AND r.roleid = $roleid ";
355 } else {
356 $selectrole = " ";
359 if ($context->id != $frontpagectx->id) {
360 $select = 'SELECT DISTINCT u.id, u.username, u.firstname, u.lastname,
361 u.email, u.city, u.country, u.picture,
362 u.lang, u.timezone, u.emailstop, u.maildisplay, u.imagealt,
363 COALESCE(ul.timeaccess, 0) AS lastaccess,
364 r.hidden,
365 ctx.id AS ctxid, ctx.path AS ctxpath,
366 ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel ';
367 $select .= $course->enrolperiod?', r.timeend ':'';
368 } else {
369 if ($roleid >= 0) {
370 $select = 'SELECT u.id, u.username, u.firstname, u.lastname,
371 u.email, u.city, u.country, u.picture,
372 u.lang, u.timezone, u.emailstop, u.maildisplay, u.imagealt,
373 u.lastaccess, r.hidden,
374 ctx.id AS ctxid, ctx.path AS ctxpath,
375 ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel ';
376 } else {
377 $select = 'SELECT u.id, u.username, u.firstname, u.lastname,
378 u.email, u.city, u.country, u.picture,
379 u.lang, u.timezone, u.emailstop, u.maildisplay, u.imagealt,
380 u.lastaccess,
381 ctx.id AS ctxid, ctx.path AS ctxpath,
382 ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel ';
386 if ($context->id != $frontpagectx->id or $roleid >= 0) {
387 $from = "FROM {$CFG->prefix}user u
388 LEFT OUTER JOIN {$CFG->prefix}context ctx
389 ON (u.id=ctx.instanceid AND ctx.contextlevel = ".CONTEXT_USER.")
390 JOIN {$CFG->prefix}role_assignments r
391 ON u.id=r.userid
392 LEFT OUTER JOIN {$CFG->prefix}user_lastaccess ul
393 ON (r.userid=ul.userid and ul.courseid = $course->id) ";
394 } else {
395 // on frontpage and we want all registered users
396 $from = "FROM {$CFG->prefix}user u
397 LEFT OUTER JOIN {$CFG->prefix}context ctx
398 ON (u.id=ctx.instanceid AND ctx.contextlevel = ".CONTEXT_USER.") ";
401 $hiddensql = has_capability('moodle/role:viewhiddenassigns', $context)? '':' AND r.hidden = 0 ';
403 // exclude users with roles we are avoiding
404 if ($avoidroles) {
405 $adminroles = 'AND r.roleid NOT IN (';
406 $adminroles .= implode(',', $avoidroles);
407 $adminroles .= ')';
408 } else {
409 $adminroles = '';
412 // join on 2 conditions
413 // otherwise we run into the problem of having records in ul table, but not relevant course
414 // and user record is not pulled out
416 if ($context->id != $frontpagectx->id) {
417 $where = "WHERE (r.contextid = $context->id OR r.contextid in $listofcontexts)
418 AND u.deleted = 0 $selectrole
419 AND (ul.courseid = $course->id OR ul.courseid IS NULL)
420 AND u.username != 'guest'
421 $adminroles
422 $hiddensql ";
423 $where .= get_course_lastaccess_sql($accesssince);
424 } else {
425 if ($roleid >= 0) {
426 $where = "WHERE (r.contextid = $context->id OR r.contextid in $listofcontexts)
427 AND u.deleted = 0 $selectrole
428 AND u.username != 'guest'";
429 $where .= get_user_lastaccess_sql($accesssince);
430 } else {
431 $where = "WHERE u.deleted = 0
432 AND u.username != 'guest'";
433 $where .= get_user_lastaccess_sql($accesssince);
436 $wheresearch = '';
438 if (!empty($search)) {
439 $LIKE = sql_ilike();
440 $fullname = sql_fullname('u.firstname','u.lastname');
441 $wheresearch .= ' AND ('. $fullname .' '. $LIKE .'\'%'. $search .'%\' OR email '. $LIKE .'\'%'. $search .'%\' OR idnumber '.$LIKE.' \'%'.$search.'%\') ';
445 if ($currentgroup) { // Displaying a group by choice
446 // FIX: TODO: This will not work if $currentgroup == 0, i.e. "those not in a group"
447 $from .= 'LEFT JOIN '.$CFG->prefix.'groups_members gm ON u.id = gm.userid ';
448 $where .= ' AND gm.groupid = '.$currentgroup;
451 $totalcount = count_records_sql('SELECT COUNT(distinct u.id) '.$from.$where); // Each user could have > 1 role
453 if ($table->get_sql_where()) {
454 $where .= ' AND '.$table->get_sql_where();
457 /// Always add r.hidden to sort in order to guarantee hiddens to "win"
458 /// in the resolution of duplicates later - MDL-13935
459 /// Only exception is frontpage that doesn't have such r.hidden info
460 /// because it retrieves ALL users (without role checking) - MDL-14034
461 if ($table->get_sql_sort()) {
462 $sort = ' ORDER BY '.$table->get_sql_sort();
463 if ($context->id != $frontpagectx->id or $roleid >= 0) {
464 $sort .= ', r.hidden DESC';
466 } else {
467 $sort = '';
468 if ($context->id != $frontpagectx->id or $roleid >= 0) {
469 $sort .= ' ORDER BY r.hidden DESC';
473 $matchcount = count_records_sql('SELECT COUNT(distinct u.id) '.$from.$where.$wheresearch);
475 $table->initialbars(true);
476 $table->pagesize($perpage, $matchcount);
478 $userlist = get_recordset_sql($select.$from.$where.$wheresearch.$sort,
479 $table->get_page_start(), $table->get_page_size());
481 if ($context->id == $frontpagectx->id) {
482 $strallsiteusers = get_string('allsiteusers', 'role');
483 if ($CFG->defaultfrontpageroleid) {
484 if ($fprole = get_record('role', 'id', $CFG->defaultfrontpageroleid)) {
485 $fprole = role_get_name($fprole, $frontpagectx);
486 $strallsiteusers = "$strallsiteusers ($fprole)";
489 $rolenames = array(-1 => $strallsiteusers) + $rolenames;
492 /// If there are multiple Roles in the course, then show a drop down menu for switching
493 if (count($rolenames) > 1) {
494 echo '<div class="rolesform">';
495 echo '<label for="rolesform_jump">'.get_string('currentrole', 'role').'&nbsp;</label>';
496 if ($context->id != $frontpagectx->id) {
497 $rolenames = array(0 => get_string('all')) + $rolenames;
498 } else {
499 if (!$CFG->defaultfrontpageroleid) {
500 // we do not want "All users with role" - we already have all users in defualt frontpage role option
501 $rolenames = array(0 => get_string('userswithrole', 'role')) + $rolenames;
504 popup_form("$CFG->wwwroot/user/index.php?contextid=$context->id&amp;sifirst=&amp;silast=&amp;roleid=", $rolenames,
505 'rolesform', $roleid, '');
506 echo '</div>';
508 } else if (count($rolenames) == 1) {
509 // when all users with the same role - print its name
510 echo '<div class="rolesform">';
511 echo get_string('role').': ';
512 $rolename = reset($rolenames);
513 echo $rolename;
514 echo '</div>';
517 if ($roleid > 0) {
518 if (!$currentrole = get_record('role','id',$roleid)) {
519 error('That role does not exist');
521 $a->number = $totalcount;
522 // MDL-12217, use course specific rolename
523 if (isset($rolenames[$currentrole->id])){
524 $a->role = $rolenames[$currentrole->id];
525 }else{
526 $a->role = $currentrole->name;//safety net
528 $heading = format_string(get_string('xuserswiththerole', 'role', $a));
530 if ($currentgroup and $group) {
531 $a->group = $group->name;
532 $heading .= ' ' . format_string(get_string('ingroup', 'role', $a));
535 if ($accesssince) {
536 $a->timeperiod = $timeoptions[$accesssince];
537 $heading .= ' ' . format_string(get_string('inactiveformorethan', 'role', $a));
540 $heading .= ": $a->number";
541 if (user_can_assign($context, $roleid)) {
542 $heading .= ' <a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?roleid='.$roleid.'&amp;contextid='.$context->id.'">';
543 $heading .= '<img src="'.$CFG->pixpath.'/i/edit.gif" class="icon" alt="" /></a>';
545 print_heading($heading, 'center', 3);
546 } else {
547 if ($course->id != SITEID && has_capability('moodle/role:assign', $context)) {
548 $editlink = ' <a href="'.$CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$context->id.'">';
549 $editlink .= '<img src="'.$CFG->pixpath.'/i/edit.gif" class="icon" alt="" /></a>';
550 } else {
551 $editlink = '';
553 if ($course->id == SITEID and $roleid < 0) {
554 $strallparticipants = get_string('allsiteusers', 'role');
555 } else {
556 $strallparticipants = get_string('allparticipants');
558 if ($matchcount < $totalcount) {
559 print_heading($strallparticipants.': '.$matchcount.'/'.$totalcount . $editlink, '', 3);
560 } else {
561 print_heading($strallparticipants.': '.$matchcount . $editlink, '', 3);
566 if ($bulkoperations) {
567 echo '
568 <script type="text/javascript">
569 //<![CDATA[
570 function checksubmit(form) {
571 var destination = form.formaction.options[form.formaction.selectedIndex].value;
572 if (destination == "" || !checkchecked(form)) {
573 form.formaction.selectedIndex = 0;
574 return false;
575 } else {
576 return true;
580 function checkchecked(form) {
581 var inputs = document.getElementsByTagName(\'INPUT\');
582 var checked = false;
583 inputs = filterByParent(inputs, function() {return form;});
584 for(var i = 0; i < inputs.length; ++i) {
585 if (inputs[i].type == \'checkbox\' && inputs[i].checked) {
586 checked = true;
589 return checked;
591 //]]>
592 </script>
594 echo '<form action="action_redir.php" method="post" id="participantsform" onsubmit="return checksubmit(this);">';
595 echo '<div>';
596 echo '<input type="hidden" name="sesskey" value="'.$USER->sesskey.'" />';
597 echo '<input type="hidden" name="returnto" value="'.s(me()).'" />';
600 if ($CFG->longtimenosee > 0 && $CFG->longtimenosee < 1000 && $totalcount > 0) {
601 echo '<p id="longtimenosee">('.get_string('unusedaccounts', '', $CFG->longtimenosee).')</p>';
604 if ($fullmode) { // Print simple listing
605 if ($totalcount < 1) {
606 print_heading(get_string('nothingtodisplay'));
607 } else {
608 if ($totalcount > $perpage) {
610 $firstinitial = $table->get_initial_first();
611 $lastinitial = $table->get_initial_last();
612 $strall = get_string('all');
613 $alpha = explode(',', get_string('alphabet'));
615 // Bar of first initials
617 echo '<div class="initialbar firstinitial">'.get_string('firstname').' : ';
618 if(!empty($firstinitial)) {
619 echo '<a href="'.$baseurl.'&amp;sifirst=">'.$strall.'</a>';
620 } else {
621 echo '<strong>'.$strall.'</strong>';
623 foreach ($alpha as $letter) {
624 if ($letter == $firstinitial) {
625 echo ' <strong>'.$letter.'</strong>';
626 } else {
627 echo ' <a href="'.$baseurl.'&amp;sifirst='.$letter.'">'.$letter.'</a>';
630 echo '</div>';
632 // Bar of last initials
634 echo '<div class="initialbar lastinitial">'.get_string('lastname').' : ';
635 if(!empty($lastinitial)) {
636 echo '<a href="'.$baseurl.'&amp;silast=">'.$strall.'</a>';
637 } else {
638 echo '<strong>'.$strall.'</strong>';
640 foreach ($alpha as $letter) {
641 if ($letter == $lastinitial) {
642 echo ' <strong>'.$letter.'</strong>';
643 } else {
644 echo ' <a href="'.$baseurl.'&amp;silast='.$letter.'">'.$letter.'</a>';
647 echo '</div>';
649 print_paging_bar($matchcount, intval($table->get_page_start() / $perpage), $perpage, $baseurl.'&amp;', 'spage');
652 if ($matchcount > 0) {
653 $usersprinted = array();
654 while ($user = rs_fetch_next_record($userlist)) {
655 if (in_array($user->id, $usersprinted)) { /// Prevent duplicates by r.hidden - MDL-13935
656 continue;
658 $usersprinted[] = $user->id; /// Add new user to the array of users printed
660 $user = make_context_subobj($user);
661 print_user($user, $course, $bulkoperations);
664 } else {
665 print_heading(get_string('nothingtodisplay'));
669 } else {
670 $countrysort = (strpos($sort, 'country') !== false);
671 $timeformat = get_string('strftimedate');
674 if ($userlist) {
675 $usersprinted = array();
676 while ($user = rs_fetch_next_record($userlist)) {
677 if (in_array($user->id, $usersprinted)) { /// Prevent duplicates by r.hidden - MDL-13935
678 continue;
680 $usersprinted[] = $user->id; /// Add new user to the array of users printed
682 $user = make_context_subobj($user);
683 if ( !empty($user->hidden) ) {
684 // if the assignment is hidden, display icon
685 $hidden = " <img src=\"{$CFG->pixpath}/t/show.gif\" title=\"".get_string('userhashiddenassignments', 'role')."\" alt=\"".get_string('hiddenassign')."\" class=\"hide-show-image\"/>";
686 } else {
687 $hidden = '';
690 if ($user->lastaccess) {
691 $lastaccess = format_time(time() - $user->lastaccess, $datestring);
692 } else {
693 $lastaccess = $strnever;
696 if (empty($user->country)) {
697 $country = '';
699 } else {
700 if($countrysort) {
701 $country = '('.$user->country.') '.$countries[$user->country];
703 else {
704 $country = $countries[$user->country];
708 if (!isset($user->context)) {
709 $usercontext = get_context_instance(CONTEXT_USER, $user->id);
710 } else {
711 $usercontext = $user->context;
714 if ($piclink = ($USER->id == $user->id || has_capability('moodle/user:viewdetails', $context) || has_capability('moodle/user:viewdetails', $usercontext))) {
715 $profilelink = '<strong><a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&amp;course='.$course->id.'">'.fullname($user).'</a></strong>';
716 } else {
717 $profilelink = '<strong>'.fullname($user).'</strong>';
720 $data = array (
721 print_user_picture($user, $course->id, $user->picture, false, true, $piclink),
722 $profilelink . $hidden);
724 if (!isset($hiddenfields['city'])) {
725 $data[] = $user->city;
727 if (!isset($hiddenfields['country'])) {
728 $data[] = $country;
730 if (!isset($hiddenfields['lastaccess'])) {
731 $data[] = $lastaccess;
733 if ($course->enrolperiod) {
734 if ($user->timeend) {
735 $data[] = userdate($user->timeend, $timeformat);
736 } else {
737 $data[] = get_string('unlimited');
740 if ($bulkoperations) {
741 $data[] = '<input type="checkbox" name="user'.$user->id.'" />';
743 $table->add_data($data);
748 $table->print_html();
752 if ($bulkoperations) {
753 echo '<br /><div class="buttons">';
754 echo '<input type="button" onclick="checkall()" value="'.get_string('selectall').'" /> ';
755 echo '<input type="button" onclick="checknone()" value="'.get_string('deselectall').'" /> ';
756 $displaylist = array();
757 $displaylist['messageselect.php'] = get_string('messageselectadd');
758 if (has_capability('moodle/notes:manage', $context) && $context->id != $frontpagectx->id) {
759 $displaylist['addnote.php'] = get_string('addnewnote', 'notes');
760 $displaylist['groupaddnote.php'] = get_string('groupaddnewnote', 'notes');
763 if ($context->id != $frontpagectx->id) {
764 $displaylist['extendenrol.php'] = get_string('extendenrol');
765 $displaylist['groupextendenrol.php'] = get_string('groupextendenrol');
768 helpbutton("participantswithselectedusers", get_string("withselectedusers"));
769 choose_from_menu ($displaylist, "formaction", "", get_string("withselectedusers"), "if(checksubmit(this.form))this.form.submit();", "");
770 echo '<input type="hidden" name="id" value="'.$course->id.'" />';
771 echo '<div id="noscriptparticipantsform" style="display: inline;">';
772 echo '<input type="submit" value="'.get_string('ok').'" /></div>';
773 echo '<script type="text/javascript">'.
774 "\n//<![CDATA[\n".
775 'document.getElementById("noscriptparticipantsform").style.display = "none";'.
776 "\n//]]>\n".'</script>';
777 echo '</div>';
778 echo '</div>';
779 echo '</form>';
783 if ($bulkoperations && $totalcount > ($perpage*3)) {
784 echo '<form action="index.php"><div><input type="hidden" name="id" value="'.$course->id.'" />'.get_string('search').':&nbsp;'."\n";
785 echo '<input type="text" name="search" value="'.s($search).'" />&nbsp;<input type="submit" value="'.get_string('search').'" /></div></form>'."\n";
788 $perpageurl = preg_replace('/&amp;perpage=\d*/','', $baseurl);
789 if ($perpage == SHOW_ALL_PAGE_SIZE) {
790 echo '<div id="showall"><a href="'.$perpageurl.'&amp;perpage='.DEFAULT_PAGE_SIZE.'">'.get_string('showperpage', '', DEFAULT_PAGE_SIZE).'</a></div>';
792 } else if ($matchcount > 0 && $perpage < $matchcount) {
793 echo '<div id="showall"><a href="'.$perpageurl.'&amp;perpage='.SHOW_ALL_PAGE_SIZE.'">'.get_string('showall', '', $matchcount).'</a></div>';
796 print_footer($course);
798 if ($userlist) {
799 rs_close($userlist);
803 function get_course_lastaccess_sql($accesssince='') {
804 if (empty($accesssince)) {
805 return '';
807 if ($accesssince == -1) { // never
808 return ' AND ul.timeaccess = 0';
809 } else {
810 return ' AND ul.timeaccess != 0 AND ul.timeaccess < '.$accesssince;
814 function get_user_lastaccess_sql($accesssince='') {
815 if (empty($accesssince)) {
816 return '';
818 if ($accesssince == -1) { // never
819 return ' AND u.lastaccess = 0';
820 } else {
821 return ' AND u.lastaccess != 0 AND u.lastaccess < '.$accesssince;