[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Lists all the users within a given course. 19 * 20 * @copyright 1999 Martin Dougiamas http://dougiamas.com 21 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 22 * @package core_user 23 */ 24 25 require_once('../config.php'); 26 require_once($CFG->libdir.'/tablelib.php'); 27 require_once($CFG->libdir.'/filelib.php'); 28 29 define('USER_SMALL_CLASS', 20); // Below this is considered small. 30 define('USER_LARGE_CLASS', 200); // Above this is considered large. 31 define('DEFAULT_PAGE_SIZE', 20); 32 define('SHOW_ALL_PAGE_SIZE', 5000); 33 define('MODE_BRIEF', 0); 34 define('MODE_USERDETAILS', 1); 35 36 $page = optional_param('page', 0, PARAM_INT); // Which page to show. 37 $perpage = optional_param('perpage', DEFAULT_PAGE_SIZE, PARAM_INT); // How many per page. 38 $mode = optional_param('mode', null, PARAM_INT); // Use the MODE_ constants. 39 $accesssince = optional_param('accesssince', 0, PARAM_INT); // Filter by last access. -1 = never. 40 $search = optional_param('search', '', PARAM_RAW); // Make sure it is processed with p() or s() when sending to output! 41 $roleid = optional_param('roleid', 0, PARAM_INT); // Optional roleid, 0 means all enrolled users (or all on the frontpage). 42 $contextid = optional_param('contextid', 0, PARAM_INT); // One of this or. 43 $courseid = optional_param('id', 0, PARAM_INT); // This are required. 44 45 $PAGE->set_url('/user/index.php', array( 46 'page' => $page, 47 'perpage' => $perpage, 48 'mode' => $mode, 49 'accesssince' => $accesssince, 50 'search' => $search, 51 'roleid' => $roleid, 52 'contextid' => $contextid, 53 'id' => $courseid)); 54 55 if ($contextid) { 56 $context = context::instance_by_id($contextid, MUST_EXIST); 57 if ($context->contextlevel != CONTEXT_COURSE) { 58 print_error('invalidcontext'); 59 } 60 $course = $DB->get_record('course', array('id' => $context->instanceid), '*', MUST_EXIST); 61 } else { 62 $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST); 63 $context = context_course::instance($course->id, MUST_EXIST); 64 } 65 // Not needed anymore. 66 unset($contextid); 67 unset($courseid); 68 69 require_login($course); 70 71 $systemcontext = context_system::instance(); 72 $isfrontpage = ($course->id == SITEID); 73 74 $frontpagectx = context_course::instance(SITEID); 75 76 if ($isfrontpage) { 77 $PAGE->set_pagelayout('admin'); 78 require_capability('moodle/site:viewparticipants', $systemcontext); 79 } else { 80 $PAGE->set_pagelayout('incourse'); 81 require_capability('moodle/course:viewparticipants', $context); 82 } 83 84 $rolenamesurl = new moodle_url("$CFG->wwwroot/user/index.php?contextid=$context->id&sifirst=&silast="); 85 86 $rolenames = role_fix_names(get_profile_roles($context), $context, ROLENAME_ALIAS, true); 87 if ($isfrontpage) { 88 $rolenames[0] = get_string('allsiteusers', 'role'); 89 } else { 90 $rolenames[0] = get_string('allparticipants'); 91 } 92 93 // Make sure other roles may not be selected by any means. 94 if (empty($rolenames[$roleid])) { 95 print_error('noparticipants'); 96 } 97 98 // No roles to display yet? 99 // frontpage course is an exception, on the front page course we should display all users. 100 if (empty($rolenames) && !$isfrontpage) { 101 if (has_capability('moodle/role:assign', $context)) { 102 redirect($CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$context->id); 103 } else { 104 print_error('noparticipants'); 105 } 106 } 107 108 $event = \core\event\user_list_viewed::create(array( 109 'objectid' => $course->id, 110 'courseid' => $course->id, 111 'context' => $context, 112 'other' => array( 113 'courseshortname' => $course->shortname, 114 'coursefullname' => $course->fullname 115 ) 116 )); 117 $event->trigger(); 118 119 $bulkoperations = has_capability('moodle/course:bulkmessaging', $context); 120 121 $countries = get_string_manager()->get_list_of_countries(); 122 123 $strnever = get_string('never'); 124 125 $datestring = new stdClass(); 126 $datestring->year = get_string('year'); 127 $datestring->years = get_string('years'); 128 $datestring->day = get_string('day'); 129 $datestring->days = get_string('days'); 130 $datestring->hour = get_string('hour'); 131 $datestring->hours = get_string('hours'); 132 $datestring->min = get_string('min'); 133 $datestring->mins = get_string('mins'); 134 $datestring->sec = get_string('sec'); 135 $datestring->secs = get_string('secs'); 136 137 if ($mode !== null) { 138 $mode = (int)$mode; 139 $SESSION->userindexmode = $mode; 140 } else if (isset($SESSION->userindexmode)) { 141 $mode = (int)$SESSION->userindexmode; 142 } else { 143 $mode = MODE_BRIEF; 144 } 145 146 // Check to see if groups are being used in this course 147 // and if so, set $currentgroup to reflect the current group. 148 149 $groupmode = groups_get_course_groupmode($course); // Groups are being used. 150 $currentgroup = groups_get_course_group($course, true); 151 152 if (!$currentgroup) { // To make some other functions work better later. 153 $currentgroup = null; 154 } 155 156 $isseparategroups = ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)); 157 158 $PAGE->set_title("$course->shortname: ".get_string('participants')); 159 $PAGE->set_heading($course->fullname); 160 $PAGE->set_pagetype('course-view-' . $course->format); 161 $PAGE->add_body_class('path-user'); // So we can style it independently. 162 $PAGE->set_other_editing_capability('moodle/course:manageactivities'); 163 164 echo $OUTPUT->header(); 165 166 echo '<div class="userlist">'; 167 168 if ($isseparategroups and (!$currentgroup) ) { 169 // The user is not in the group so show message and exit. 170 echo $OUTPUT->heading(get_string("notingroup")); 171 echo $OUTPUT->footer(); 172 exit; 173 } 174 175 176 // Should use this variable so that we don't break stuff every time a variable is added or changed. 177 $baseurl = new moodle_url('/user/index.php', array( 178 'contextid' => $context->id, 179 'roleid' => $roleid, 180 'id' => $course->id, 181 'perpage' => $perpage, 182 'accesssince' => $accesssince, 183 'search' => s($search))); 184 185 // Setting up tags. 186 if ($course->id == SITEID) { 187 $filtertype = 'site'; 188 } else if ($course->id && !$currentgroup) { 189 $filtertype = 'course'; 190 $filterselect = $course->id; 191 } else { 192 $filtertype = 'group'; 193 $filterselect = $currentgroup; 194 } 195 196 197 198 // Get the hidden field list. 199 if (has_capability('moodle/course:viewhiddenuserfields', $context)) { 200 $hiddenfields = array(); // Teachers and admins are allowed to see everything. 201 } else { 202 $hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields)); 203 } 204 205 if (isset($hiddenfields['lastaccess'])) { 206 // Do not allow access since filtering. 207 $accesssince = 0; 208 } 209 210 // Print settings and things in a table across the top. 211 $controlstable = new html_table(); 212 $controlstable->attributes['class'] = 'controls'; 213 $controlstable->cellspacing = 0; 214 $controlstable->data[] = new html_table_row(); 215 216 // Print my course menus. 217 if ($mycourses = enrol_get_my_courses()) { 218 $courselist = array(); 219 $popupurl = new moodle_url('/user/index.php?roleid='.$roleid.'&sifirst=&silast='); 220 foreach ($mycourses as $mycourse) { 221 $coursecontext = context_course::instance($mycourse->id); 222 $courselist[$mycourse->id] = format_string($mycourse->shortname, true, array('context' => $coursecontext)); 223 } 224 if (has_capability('moodle/site:viewparticipants', $systemcontext)) { 225 unset($courselist[SITEID]); 226 $courselist = array(SITEID => format_string($SITE->shortname, true, array('context' => $systemcontext))) + $courselist; 227 } 228 $select = new single_select($popupurl, 'id', $courselist, $course->id, null, 'courseform'); 229 $select->set_label(get_string('mycourses')); 230 $controlstable->data[0]->cells[] = $OUTPUT->render($select); 231 } 232 233 $controlstable->data[0]->cells[] = groups_print_course_menu($course, $baseurl->out(), true); 234 235 if (!isset($hiddenfields['lastaccess'])) { 236 // Get minimum lastaccess for this course and display a dropbox to filter by lastaccess going back this far. 237 // We need to make it diferently for normal courses and site course. 238 if (!$isfrontpage) { 239 $minlastaccess = $DB->get_field_sql('SELECT min(timeaccess) 240 FROM {user_lastaccess} 241 WHERE courseid = ? 242 AND timeaccess != 0', array($course->id)); 243 $lastaccess0exists = $DB->record_exists('user_lastaccess', array('courseid' => $course->id, 'timeaccess' => 0)); 244 } else { 245 $minlastaccess = $DB->get_field_sql('SELECT min(lastaccess) 246 FROM {user} 247 WHERE lastaccess != 0'); 248 $lastaccess0exists = $DB->record_exists('user', array('lastaccess' => 0)); 249 } 250 251 $now = usergetmidnight(time()); 252 $timeaccess = array(); 253 $baseurl->remove_params('accesssince'); 254 255 // Makes sense for this to go first. 256 $timeoptions[0] = get_string('selectperiod'); 257 258 // Days. 259 for ($i = 1; $i < 7; $i++) { 260 if (strtotime('-'.$i.' days', $now) >= $minlastaccess) { 261 $timeoptions[strtotime('-'.$i.' days', $now)] = get_string('numdays', 'moodle', $i); 262 } 263 } 264 // Weeks. 265 for ($i = 1; $i < 10; $i++) { 266 if (strtotime('-'.$i.' weeks', $now) >= $minlastaccess) { 267 $timeoptions[strtotime('-'.$i.' weeks', $now)] = get_string('numweeks', 'moodle', $i); 268 } 269 } 270 // Months. 271 for ($i = 2; $i < 12; $i++) { 272 if (strtotime('-'.$i.' months', $now) >= $minlastaccess) { 273 $timeoptions[strtotime('-'.$i.' months', $now)] = get_string('nummonths', 'moodle', $i); 274 } 275 } 276 // Try a year. 277 if (strtotime('-1 year', $now) >= $minlastaccess) { 278 $timeoptions[strtotime('-1 year', $now)] = get_string('lastyear'); 279 } 280 281 if (!empty($lastaccess0exists)) { 282 $timeoptions[-1] = get_string('never'); 283 } 284 285 if (count($timeoptions) > 1) { 286 $select = new single_select($baseurl, 'accesssince', $timeoptions, $accesssince, null, 'timeoptions'); 287 $select->set_label(get_string('usersnoaccesssince')); 288 $controlstable->data[0]->cells[] = $OUTPUT->render($select); 289 } 290 } 291 292 $formatmenu = array( '0' => get_string('brief'), 293 '1' => get_string('userdetails')); 294 $select = new single_select($baseurl, 'mode', $formatmenu, $mode, null, 'formatmenu'); 295 $select->set_label(get_string('userlist')); 296 $userlistcell = new html_table_cell(); 297 $userlistcell->attributes['class'] = 'right'; 298 $userlistcell->text = $OUTPUT->render($select); 299 $controlstable->data[0]->cells[] = $userlistcell; 300 301 echo html_writer::table($controlstable); 302 303 if ($currentgroup and (!$isseparategroups or has_capability('moodle/site:accessallgroups', $context))) { 304 // Display info about the group. 305 if ($group = groups_get_group($currentgroup)) { 306 if (!empty($group->description) or (!empty($group->picture) and empty($group->hidepicture))) { 307 $groupinfotable = new html_table(); 308 $groupinfotable->attributes['class'] = 'groupinfobox'; 309 $picturecell = new html_table_cell(); 310 $picturecell->attributes['class'] = 'left side picture'; 311 $picturecell->text = print_group_picture($group, $course->id, true, true, false); 312 313 $contentcell = new html_table_cell(); 314 $contentcell->attributes['class'] = 'content'; 315 316 $contentheading = $group->name; 317 if (has_capability('moodle/course:managegroups', $context)) { 318 $aurl = new moodle_url('/group/group.php', array('id' => $group->id, 'courseid' => $group->courseid)); 319 $contentheading .= ' ' . $OUTPUT->action_icon($aurl, new pix_icon('t/edit', get_string('editgroupprofile'))); 320 } 321 322 $group->description = file_rewrite_pluginfile_urls($group->description, 'pluginfile.php', $context->id, 'group', 323 'description', $group->id); 324 if (!isset($group->descriptionformat)) { 325 $group->descriptionformat = FORMAT_MOODLE; 326 } 327 $options = array('overflowdiv' => true); 328 $formatteddesc = format_text($group->description, $group->descriptionformat, $options); 329 $contentcell->text = $OUTPUT->heading($contentheading, 3) . $formatteddesc; 330 $groupinfotable->data[] = new html_table_row(array($picturecell, $contentcell)); 331 echo html_writer::table($groupinfotable); 332 } 333 } 334 } 335 336 // Define a table showing a list of users in the current role selection. 337 $tablecolumns = array(); 338 $tableheaders = array(); 339 if ($bulkoperations && $mode === MODE_BRIEF) { 340 $tablecolumns[] = 'select'; 341 $tableheaders[] = get_string('select'); 342 } 343 $tablecolumns[] = 'userpic'; 344 $tablecolumns[] = 'fullname'; 345 346 $extrafields = get_extra_user_fields($context); 347 $tableheaders[] = get_string('userpic'); 348 $tableheaders[] = get_string('fullnameuser'); 349 350 if ($mode === MODE_BRIEF) { 351 foreach ($extrafields as $field) { 352 $tablecolumns[] = $field; 353 $tableheaders[] = get_user_field_name($field); 354 } 355 } 356 if ($mode === MODE_BRIEF && !isset($hiddenfields['city'])) { 357 $tablecolumns[] = 'city'; 358 $tableheaders[] = get_string('city'); 359 } 360 if ($mode === MODE_BRIEF && !isset($hiddenfields['country'])) { 361 $tablecolumns[] = 'country'; 362 $tableheaders[] = get_string('country'); 363 } 364 if (!isset($hiddenfields['lastaccess'])) { 365 $tablecolumns[] = 'lastaccess'; 366 if ($course->id == SITEID) { 367 // Exception case for viewing participants on site home. 368 $tableheaders[] = get_string('lastsiteaccess'); 369 } else { 370 $tableheaders[] = get_string('lastcourseaccess'); 371 } 372 } 373 374 if ($bulkoperations && $mode === MODE_USERDETAILS) { 375 $tablecolumns[] = 'select'; 376 $tableheaders[] = get_string('select'); 377 } 378 379 $table = new flexible_table('user-index-participants-'.$course->id); 380 $table->define_columns($tablecolumns); 381 $table->define_headers($tableheaders); 382 $table->define_baseurl($baseurl->out()); 383 384 if (!isset($hiddenfields['lastcourseaccess'])) { 385 $table->sortable(true, 'lastcourseaccess', SORT_DESC); 386 } else { 387 $table->sortable(true, 'firstname', SORT_ASC); 388 } 389 390 $table->no_sorting('roles'); 391 $table->no_sorting('groups'); 392 $table->no_sorting('groupings'); 393 $table->no_sorting('select'); 394 395 $table->set_attribute('cellspacing', '0'); 396 $table->set_attribute('id', 'participants'); 397 $table->set_attribute('class', 'generaltable generalbox'); 398 399 $table->set_control_variables(array( 400 TABLE_VAR_SORT => 'ssort', 401 TABLE_VAR_HIDE => 'shide', 402 TABLE_VAR_SHOW => 'sshow', 403 TABLE_VAR_IFIRST => 'sifirst', 404 TABLE_VAR_ILAST => 'silast', 405 TABLE_VAR_PAGE => 'spage' 406 )); 407 $table->setup(); 408 409 list($esql, $params) = get_enrolled_sql($context, null, $currentgroup, true); 410 $joins = array("FROM {user} u"); 411 $wheres = array(); 412 413 $userfields = array('username', 'email', 'city', 'country', 'lang', 'timezone', 'maildisplay'); 414 $mainuserfields = user_picture::fields('u', $userfields); 415 $extrasql = get_extra_user_fields_sql($context, 'u', '', $userfields); 416 417 if ($isfrontpage) { 418 $select = "SELECT $mainuserfields, u.lastaccess$extrasql"; 419 $joins[] = "JOIN ($esql) e ON e.id = u.id"; // Everybody on the frontpage usually. 420 if ($accesssince) { 421 $wheres[] = get_user_lastaccess_sql($accesssince); 422 } 423 424 } else { 425 $select = "SELECT $mainuserfields, COALESCE(ul.timeaccess, 0) AS lastaccess$extrasql"; 426 $joins[] = "JOIN ($esql) e ON e.id = u.id"; // Course enrolled users only. 427 $joins[] = "LEFT JOIN {user_lastaccess} ul ON (ul.userid = u.id AND ul.courseid = :courseid)"; // Not everybody accessed course yet. 428 $params['courseid'] = $course->id; 429 if ($accesssince) { 430 $wheres[] = get_course_lastaccess_sql($accesssince); 431 } 432 } 433 434 // Performance hacks - we preload user contexts together with accounts. 435 $ccselect = ', ' . context_helper::get_preload_record_columns_sql('ctx'); 436 $ccjoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel)"; 437 $params['contextlevel'] = CONTEXT_USER; 438 $select .= $ccselect; 439 $joins[] = $ccjoin; 440 441 442 // Limit list to users with some role only. 443 if ($roleid) { 444 // We want to query both the current context and parent contexts. 445 list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'relatedctx'); 446 447 $wheres[] = "u.id IN (SELECT userid FROM {role_assignments} WHERE roleid = :roleid AND contextid $relatedctxsql)"; 448 $params = array_merge($params, array('roleid' => $roleid), $relatedctxparams); 449 } 450 451 $from = implode("\n", $joins); 452 if ($wheres) { 453 $where = "WHERE " . implode(" AND ", $wheres); 454 } else { 455 $where = ""; 456 } 457 458 $totalcount = $DB->count_records_sql("SELECT COUNT(u.id) $from $where", $params); 459 460 if (!empty($search)) { 461 $fullname = $DB->sql_fullname('u.firstname', 'u.lastname'); 462 $wheres[] = "(". $DB->sql_like($fullname, ':search1', false, false) . 463 " OR ". $DB->sql_like('email', ':search2', false, false) . 464 " OR ". $DB->sql_like('idnumber', ':search3', false, false) .") "; 465 $params['search1'] = "%$search%"; 466 $params['search2'] = "%$search%"; 467 $params['search3'] = "%$search%"; 468 } 469 470 list($twhere, $tparams) = $table->get_sql_where(); 471 if ($twhere) { 472 $wheres[] = $twhere; 473 $params = array_merge($params, $tparams); 474 } 475 476 $from = implode("\n", $joins); 477 if ($wheres) { 478 $where = "WHERE " . implode(" AND ", $wheres); 479 } else { 480 $where = ""; 481 } 482 483 if ($table->get_sql_sort()) { 484 $sort = ' ORDER BY '.$table->get_sql_sort(); 485 } else { 486 $sort = ''; 487 } 488 489 $matchcount = $DB->count_records_sql("SELECT COUNT(u.id) $from $where", $params); 490 491 $table->initialbars(true); 492 $table->pagesize($perpage, $matchcount); 493 494 // List of users at the current visible page - paging makes it relatively short. 495 $userlist = $DB->get_recordset_sql("$select $from $where $sort", $params, $table->get_page_start(), $table->get_page_size()); 496 497 // If there are multiple Roles in the course, then show a drop down menu for switching. 498 if (count($rolenames) > 1) { 499 echo '<div class="rolesform">'; 500 echo '<label for="rolesform_jump">'.get_string('currentrole', 'role').' </label>'; 501 echo $OUTPUT->single_select($rolenamesurl, 'roleid', $rolenames, $roleid, null, 'rolesform'); 502 echo '</div>'; 503 504 } else if (count($rolenames) == 1) { 505 // When all users with the same role - print its name. 506 echo '<div class="rolesform">'; 507 echo get_string('role').get_string('labelsep', 'langconfig'); 508 $rolename = reset($rolenames); 509 echo $rolename; 510 echo '</div>'; 511 } 512 513 if ($roleid > 0) { 514 $a = new stdClass(); 515 $a->number = $totalcount; 516 $a->role = $rolenames[$roleid]; 517 $heading = format_string(get_string('xuserswiththerole', 'role', $a)); 518 519 if ($currentgroup and $group) { 520 $a->group = $group->name; 521 $heading .= ' ' . format_string(get_string('ingroup', 'role', $a)); 522 } 523 524 if ($accesssince) { 525 $a->timeperiod = $timeoptions[$accesssince]; 526 $heading .= ' ' . format_string(get_string('inactiveformorethan', 'role', $a)); 527 } 528 529 $heading .= ": $a->number"; 530 531 if (user_can_assign($context, $roleid)) { 532 $headingurl = new moodle_url($CFG->wwwroot . '/' . $CFG->admin . '/roles/assign.php', 533 array('roleid' => $roleid, 'contextid' => $context->id)); 534 $heading .= $OUTPUT->action_icon($headingurl, new pix_icon('t/edit', get_string('edit'))); 535 } 536 echo $OUTPUT->heading($heading, 3); 537 } else { 538 if ($course->id != SITEID && has_capability('moodle/course:enrolreview', $context)) { 539 $editlink = $OUTPUT->action_icon(new moodle_url('/enrol/users.php', array('id' => $course->id)), 540 new pix_icon('t/edit', get_string('edit'))); 541 } else { 542 $editlink = ''; 543 } 544 if ($course->id == SITEID and $roleid < 0) { 545 $strallparticipants = get_string('allsiteusers', 'role'); 546 } else { 547 $strallparticipants = get_string('allparticipants'); 548 } 549 if ($matchcount < $totalcount) { 550 echo $OUTPUT->heading($strallparticipants.get_string('labelsep', 'langconfig').$matchcount.'/'.$totalcount . $editlink, 3); 551 } else { 552 echo $OUTPUT->heading($strallparticipants.get_string('labelsep', 'langconfig').$matchcount . $editlink, 3); 553 } 554 } 555 556 557 if ($bulkoperations) { 558 echo '<form action="action_redir.php" method="post" id="participantsform">'; 559 echo '<div>'; 560 echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />'; 561 echo '<input type="hidden" name="returnto" value="'.s($PAGE->url->out(false)).'" />'; 562 } 563 564 if ($mode === MODE_USERDETAILS) { // Print simple listing. 565 if ($totalcount < 1) { 566 echo $OUTPUT->heading(get_string('nothingtodisplay')); 567 } else { 568 if ($totalcount > $perpage) { 569 570 $firstinitial = $table->get_initial_first(); 571 $lastinitial = $table->get_initial_last(); 572 $strall = get_string('all'); 573 $alpha = explode(',', get_string('alphabet', 'langconfig')); 574 575 // Bar of first initials. 576 577 echo '<div class="initialbar firstinitial">'.get_string('firstname').' : '; 578 if (!empty($firstinitial)) { 579 echo '<a href="'.$baseurl->out().'&sifirst=">'.$strall.'</a>'; 580 } else { 581 echo '<strong>'.$strall.'</strong>'; 582 } 583 foreach ($alpha as $letter) { 584 if ($letter == $firstinitial) { 585 echo ' <strong>'.$letter.'</strong>'; 586 } else { 587 echo ' <a href="'.$baseurl->out().'&sifirst='.$letter.'">'.$letter.'</a>'; 588 } 589 } 590 echo '</div>'; 591 592 // Bar of last initials. 593 594 echo '<div class="initialbar lastinitial">'.get_string('lastname').' : '; 595 if (!empty($lastinitial)) { 596 echo '<a href="'.$baseurl->out().'&silast=">'.$strall.'</a>'; 597 } else { 598 echo '<strong>'.$strall.'</strong>'; 599 } 600 foreach ($alpha as $letter) { 601 if ($letter == $lastinitial) { 602 echo ' <strong>'.$letter.'</strong>'; 603 } else { 604 echo ' <a href="'.$baseurl->out().'&silast='.$letter.'">'.$letter.'</a>'; 605 } 606 } 607 echo '</div>'; 608 609 $pagingbar = new paging_bar($matchcount, intval($table->get_page_start() / $perpage), $perpage, $baseurl); 610 $pagingbar->pagevar = 'spage'; 611 echo $OUTPUT->render($pagingbar); 612 } 613 614 if ($matchcount > 0) { 615 $usersprinted = array(); 616 foreach ($userlist as $user) { 617 if (in_array($user->id, $usersprinted)) { // Prevent duplicates by r.hidden - MDL-13935. 618 continue; 619 } 620 $usersprinted[] = $user->id; // Add new user to the array of users printed. 621 622 context_helper::preload_from_record($user); 623 624 $context = context_course::instance($course->id); 625 $usercontext = context_user::instance($user->id); 626 627 $countries = get_string_manager()->get_list_of_countries(); 628 629 // Get the hidden field list. 630 if (has_capability('moodle/course:viewhiddenuserfields', $context)) { 631 $hiddenfields = array(); 632 } else { 633 $hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields)); 634 } 635 $table = new html_table(); 636 $table->attributes['class'] = 'userinfobox'; 637 638 $row = new html_table_row(); 639 $row->cells[0] = new html_table_cell(); 640 $row->cells[0]->attributes['class'] = 'left side'; 641 642 $row->cells[0]->text = $OUTPUT->user_picture($user, array('size' => 100, 'courseid' => $course->id)); 643 $row->cells[1] = new html_table_cell(); 644 $row->cells[1]->attributes['class'] = 'content'; 645 646 $row->cells[1]->text = $OUTPUT->container(fullname($user, has_capability('moodle/site:viewfullnames', $context)), 'username'); 647 $row->cells[1]->text .= $OUTPUT->container_start('info'); 648 649 if (!empty($user->role)) { 650 $row->cells[1]->text .= get_string('role').get_string('labelsep', 'langconfig').$user->role.'<br />'; 651 } 652 if ($user->maildisplay == 1 or ($user->maildisplay == 2 and ($course->id != SITEID) and !isguestuser()) or 653 has_capability('moodle/course:viewhiddenuserfields', $context) or 654 in_array('email', $extrafields) or ($user->id == $USER->id)) { 655 $row->cells[1]->text .= get_string('email').get_string('labelsep', 'langconfig').html_writer::link("mailto:$user->email", $user->email) . '<br />'; 656 } 657 foreach ($extrafields as $field) { 658 if ($field === 'email') { 659 // Skip email because it was displayed with different logic above 660 // because this page is intended for students too. 661 continue; 662 } 663 $row->cells[1]->text .= get_user_field_name($field) . 664 get_string('labelsep', 'langconfig') . s($user->{$field}) . '<br />'; 665 } 666 if (($user->city or $user->country) and (!isset($hiddenfields['city']) or !isset($hiddenfields['country']))) { 667 $row->cells[1]->text .= get_string('city').get_string('labelsep', 'langconfig'); 668 if ($user->city && !isset($hiddenfields['city'])) { 669 $row->cells[1]->text .= $user->city; 670 } 671 if (!empty($countries[$user->country]) && !isset($hiddenfields['country'])) { 672 if ($user->city && !isset($hiddenfields['city'])) { 673 $row->cells[1]->text .= ', '; 674 } 675 $row->cells[1]->text .= $countries[$user->country]; 676 } 677 $row->cells[1]->text .= '<br />'; 678 } 679 680 if (!isset($hiddenfields['lastaccess'])) { 681 if ($user->lastaccess) { 682 $row->cells[1]->text .= get_string('lastaccess').get_string('labelsep', 'langconfig').userdate($user->lastaccess); 683 $row->cells[1]->text .= ' ('. format_time(time() - $user->lastaccess, $datestring) .')'; 684 } else { 685 $row->cells[1]->text .= get_string('lastaccess').get_string('labelsep', 'langconfig').get_string('never'); 686 } 687 } 688 689 $row->cells[1]->text .= $OUTPUT->container_end(); 690 691 $row->cells[2] = new html_table_cell(); 692 $row->cells[2]->attributes['class'] = 'links'; 693 $row->cells[2]->text = ''; 694 695 $links = array(); 696 697 if ($CFG->enableblogs && ($CFG->bloglevel != BLOG_USER_LEVEL || $USER->id == $user->id)) { 698 $links[] = html_writer::link(new moodle_url('/blog/index.php?userid='.$user->id), get_string('blogs', 'blog')); 699 } 700 701 if (!empty($CFG->enablenotes) and (has_capability('moodle/notes:manage', $context) || has_capability('moodle/notes:view', $context))) { 702 $links[] = html_writer::link(new moodle_url('/notes/index.php?course=' . $course->id. '&user='.$user->id), get_string('notes', 'notes')); 703 } 704 705 if (has_capability('moodle/site:viewreports', $context) or has_capability('moodle/user:viewuseractivitiesreport', $usercontext)) { 706 $links[] = html_writer::link(new moodle_url('/course/user.php?id='. $course->id .'&user='. $user->id), get_string('activity')); 707 } 708 709 if ($USER->id != $user->id && !\core\session\manager::is_loggedinas() && has_capability('moodle/user:loginas', $context) && !is_siteadmin($user->id)) { 710 $links[] = html_writer::link(new moodle_url('/course/loginas.php?id='. $course->id .'&user='. $user->id .'&sesskey='. sesskey()), get_string('loginas')); 711 } 712 713 $links[] = html_writer::link(new moodle_url('/user/view.php?id='. $user->id .'&course='. $course->id), get_string('fullprofile') . '...'); 714 715 $row->cells[2]->text .= implode('', $links); 716 717 if ($bulkoperations) { 718 $row->cells[2]->text .= '<br /><input type="checkbox" class="usercheckbox" name="user'.$user->id.'" /> '; 719 } 720 $table->data = array($row); 721 echo html_writer::table($table); 722 } 723 724 } else { 725 echo $OUTPUT->heading(get_string('nothingtodisplay')); 726 } 727 } 728 729 } else { 730 $countrysort = (strpos($sort, 'country') !== false); 731 $timeformat = get_string('strftimedate'); 732 733 734 if ($userlist) { 735 736 $usersprinted = array(); 737 foreach ($userlist as $user) { 738 if (in_array($user->id, $usersprinted)) { // Prevent duplicates by r.hidden - MDL-13935. 739 continue; 740 } 741 $usersprinted[] = $user->id; // Add new user to the array of users printed. 742 743 context_helper::preload_from_record($user); 744 745 if ($user->lastaccess) { 746 $lastaccess = format_time(time() - $user->lastaccess, $datestring); 747 } else { 748 $lastaccess = $strnever; 749 } 750 751 if (empty($user->country)) { 752 $country = ''; 753 754 } else { 755 if ($countrysort) { 756 $country = '('.$user->country.') '.$countries[$user->country]; 757 } else { 758 $country = $countries[$user->country]; 759 } 760 } 761 762 $usercontext = context_user::instance($user->id); 763 764 if ($piclink = ($USER->id == $user->id || has_capability('moodle/user:viewdetails', $context) || has_capability('moodle/user:viewdetails', $usercontext))) { 765 $profilelink = '<strong><a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&course='.$course->id.'">'.fullname($user).'</a></strong>'; 766 } else { 767 $profilelink = '<strong>'.fullname($user).'</strong>'; 768 } 769 770 $data = array(); 771 if ($bulkoperations) { 772 $data[] = '<input type="checkbox" class="usercheckbox" name="user'.$user->id.'" />'; 773 } 774 $data[] = $OUTPUT->user_picture($user, array('size' => 35, 'courseid' => $course->id)); 775 $data[] = $profilelink; 776 777 if ($mode === MODE_BRIEF) { 778 foreach ($extrafields as $field) { 779 $data[] = $user->{$field}; 780 } 781 } 782 if ($mode === MODE_BRIEF && !isset($hiddenfields['city'])) { 783 $data[] = $user->city; 784 } 785 if ($mode === MODE_BRIEF && !isset($hiddenfields['country'])) { 786 $data[] = $country; 787 } 788 if (!isset($hiddenfields['lastaccess'])) { 789 $data[] = $lastaccess; 790 } 791 792 $table->add_data($data); 793 } 794 } 795 796 $table->print_html(); 797 798 } 799 800 if ($bulkoperations) { 801 echo '<br /><div class="buttons">'; 802 echo '<input type="button" id="checkall" value="'.get_string('selectall').'" /> '; 803 echo '<input type="button" id="checknone" value="'.get_string('deselectall').'" /> '; 804 $displaylist = array(); 805 $displaylist['messageselect.php'] = get_string('messageselectadd'); 806 if (!empty($CFG->enablenotes) && has_capability('moodle/notes:manage', $context) && $context->id != $frontpagectx->id) { 807 $displaylist['addnote.php'] = get_string('addnewnote', 'notes'); 808 $displaylist['groupaddnote.php'] = get_string('groupaddnewnote', 'notes'); 809 } 810 811 echo $OUTPUT->help_icon('withselectedusers'); 812 echo html_writer::tag('label', get_string("withselectedusers"), array('for' => 'formactionid')); 813 echo html_writer::select($displaylist, 'formaction', '', array('' => 'choosedots'), array('id' => 'formactionid')); 814 815 echo '<input type="hidden" name="id" value="'.$course->id.'" />'; 816 echo '<noscript style="display:inline">'; 817 echo '<div><input type="submit" value="'.get_string('ok').'" /></div>'; 818 echo '</noscript>'; 819 echo '</div></div>'; 820 echo '</form>'; 821 822 $module = array('name' => 'core_user', 'fullpath' => '/user/module.js'); 823 $PAGE->requires->js_init_call('M.core_user.init_participation', null, false, $module); 824 } 825 826 // Show a search box if all participants don't fit on a single screen. 827 if ($totalcount > $perpage) { 828 echo '<form action="index.php" class="searchform"><div><input type="hidden" name="id" value="'.$course->id.'" />'; 829 echo '<label for="search">' . get_string('search', 'search') . ' </label>'; 830 echo '<input type="text" id="search" name="search" value="'.s($search).'" /> <input type="submit" value="'.get_string('search').'" /></div></form>'."\n"; 831 } 832 833 $perpageurl = clone($baseurl); 834 $perpageurl->remove_params('perpage'); 835 if ($perpage == SHOW_ALL_PAGE_SIZE) { 836 $perpageurl->param('perpage', DEFAULT_PAGE_SIZE); 837 echo $OUTPUT->container(html_writer::link($perpageurl, get_string('showperpage', '', DEFAULT_PAGE_SIZE)), array(), 'showall'); 838 839 } else if ($matchcount > 0 && $perpage < $matchcount) { 840 $perpageurl->param('perpage', SHOW_ALL_PAGE_SIZE); 841 echo $OUTPUT->container(html_writer::link($perpageurl, get_string('showall', '', $matchcount)), array(), 'showall'); 842 } 843 844 echo '</div>'; // Userlist. 845 846 echo $OUTPUT->footer(); 847 848 if ($userlist) { 849 $userlist->close(); 850 } 851 852 /** 853 * Returns SQL that can be used to limit a query to a period where the user last accessed a course.. 854 * 855 * @param string $accesssince 856 * @return string 857 */ 858 function get_course_lastaccess_sql($accesssince='') { 859 if (empty($accesssince)) { 860 return ''; 861 } 862 if ($accesssince == -1) { // Never. 863 return 'ul.timeaccess = 0'; 864 } else { 865 return 'ul.timeaccess != 0 AND ul.timeaccess < '.$accesssince; 866 } 867 } 868 869 /** 870 * Returns SQL that can be used to limit a query to a period where the user last accessed the system. 871 * 872 * @param string $accesssince 873 * @return string 874 */ 875 function get_user_lastaccess_sql($accesssince='') { 876 if (empty($accesssince)) { 877 return ''; 878 } 879 if ($accesssince == -1) { // Never. 880 return 'u.lastaccess = 0'; 881 } else { 882 return 'u.lastaccess != 0 AND u.lastaccess < '.$accesssince; 883 } 884 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |