f77efbe3be
In the course participants page, selecting an initials filter in one course and then moving to another (the filter would propagate) could result in few or no results being displayed. The teacher would then have no way of resetting the filter and viewing all (or possibly any) participants. Fixed by making each course participant page independent. They no longer share sort orders, collapsed column state, or initials filters.
441 lines
18 KiB
PHP
441 lines
18 KiB
PHP
<?PHP // $Id$
|
|
|
|
// Lists all the users within a given course
|
|
|
|
require_once('../config.php');
|
|
require_once($CFG->libdir.'/tablelib.php');
|
|
|
|
define('USER_SMALL_CLASS', 20); // Below this is considered small
|
|
define('USER_LARGE_CLASS', 200); // Above this is considered large
|
|
define('DEFAULT_PAGE_SIZE', 20);
|
|
|
|
$id = required_param('id', PARAM_INT); // Course id
|
|
$group = optional_param('group', -1, PARAM_INT); // Group to show
|
|
$page = optional_param('page', 0, PARAM_INT); // which page to show
|
|
$perpage = optional_param('perpage', DEFAULT_PAGE_SIZE, PARAM_INT); // how many per page
|
|
$mode = optional_param('mode', NULL); // '0' for less details, '1' for more
|
|
$showteachers = optional_param('teachers', 1, PARAM_INT); // do we want to see the teacher list?
|
|
|
|
if (! $course = get_record('course', 'id', $id)) {
|
|
error("Course ID is incorrect");
|
|
}
|
|
|
|
require_login($course->id);
|
|
|
|
if (!$course->category) {
|
|
if (!$CFG->showsiteparticipantslist and !isteacher(SITEID)) {
|
|
notice(get_string('sitepartlist0'));
|
|
}
|
|
if ($CFG->showsiteparticipantslist < 2 and !isteacherinanycourse()) {
|
|
notice(get_string('sitepartlist1'));
|
|
}
|
|
}
|
|
|
|
add_to_log($course->id, 'user', 'view all', 'index.php?id='.$course->id, '');
|
|
|
|
$isteacher = isteacher($course->id);
|
|
|
|
$countries = get_list_of_countries();
|
|
|
|
$strnever = get_string('never');
|
|
|
|
$datestring->day = get_string('day');
|
|
$datestring->days = get_string('days');
|
|
$datestring->hour = get_string('hour');
|
|
$datestring->hours = get_string('hours');
|
|
$datestring->min = get_string('min');
|
|
$datestring->mins = get_string('mins');
|
|
$datestring->sec = get_string('sec');
|
|
$datestring->secs = get_string('secs');
|
|
|
|
if ($mode !== NULL) {
|
|
$SESSION->userindexmode = $fullmode = ($mode == 1);
|
|
} else if (isset($SESSION->userindexmode)) {
|
|
$fullmode = $SESSION->userindexmode;
|
|
} else {
|
|
$fullmode = false;
|
|
}
|
|
|
|
/// Check to see if groups are being used in this forum
|
|
/// and if so, set $currentgroup to reflect the current group
|
|
|
|
$groupmode = groupmode($course); // Groups are being used
|
|
$currentgroup = get_and_set_current_group($course, $groupmode, $group);
|
|
|
|
if (!$currentgroup) { // To make some other functions work better later
|
|
$currentgroup = NULL;
|
|
}
|
|
|
|
$isseparategroups = ($course->groupmode == SEPARATEGROUPS and $course->groupmodeforce and
|
|
!isteacheredit($course->id));
|
|
|
|
if ($isseparategroups and (!$currentgroup) ) { //XXX
|
|
print_heading(get_string("notingroup", "forum"));
|
|
print_footer($course);
|
|
exit;
|
|
}
|
|
|
|
// Should use this variable so that we don't break stuff every time a variable is added or changed.
|
|
$baseurl = $CFG->wwwroot.'/user/index.php?id='.$course->id.'&group='.$currentgroup.'&perpage='.$perpage.'&teachers='.$showteachers;
|
|
|
|
/// Print headers
|
|
|
|
if ($course->category) {
|
|
print_header("$course->shortname: ".get_string('participants'), $course->fullname,
|
|
"<a href=\"../course/view.php?id=$course->id\">$course->shortname</a> -> ".
|
|
get_string('participants'), "", "", true, " ", navmenu($course));
|
|
} else {
|
|
print_header("$course->shortname: ".get_string('participants'), $course->fullname,
|
|
get_string('participants'), "", "", true, " ", navmenu($course));
|
|
}
|
|
|
|
/// Print settings and things in a table across the top
|
|
|
|
echo '<table class="controls" cellspacing="0"><tr>';
|
|
|
|
if ($groupmode == VISIBLEGROUPS or ($groupmode and isteacheredit($course->id))) {
|
|
if ($groups = get_records_menu("groups", "courseid", $course->id, "name ASC", "id,name")) {
|
|
echo '<td class="left">';
|
|
print_group_menu($groups, $groupmode, $currentgroup, $baseurl);
|
|
echo '</td>';
|
|
}
|
|
}
|
|
|
|
echo '<td class="right">';
|
|
echo get_string('userlist').': ';
|
|
$formatmenu = array( '0' => get_string('detailedless'),
|
|
'1' => get_string('detailedmore'));
|
|
echo popup_form($baseurl.'&mode=', $formatmenu, 'formatmenu', $fullmode, '', '', '', true);
|
|
echo '</td></tr></table>';
|
|
|
|
if ($currentgroup and (!$isseparategroups or isteacheredit($course->id))) { /// Display info about the group
|
|
if ($group = get_record('groups', 'id', $currentgroup)) {
|
|
if (!empty($group->description) or (!empty($group->picture) and empty($group->hidepicture))) {
|
|
echo '<table class="groupinfobox"><tr><td class="left side picture">';
|
|
print_group_picture($group, $course->id, true, false, false);
|
|
echo '</td><td class="content">';
|
|
echo '<h3>'.$group->name;
|
|
if (isteacheredit($course->id)) {
|
|
echo ' <a title="'.get_string('editgroupprofile').'" href="../course/groups.php?id='.$course->id.'&group='.$group->id.'">';
|
|
echo '<img src="'.$CFG->pixpath.'/t/edit.gif" alt="" border="0">';
|
|
echo '</a>';
|
|
}
|
|
echo '</h3>';
|
|
echo format_text($group->description);
|
|
echo '</td></tr></table>';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
$exceptions = array(); // This will be an array of userids that are shown as teachers and thus
|
|
// do not have to be shown as users as well. Only relevant on site course.
|
|
|
|
if($showteachers) {
|
|
|
|
$tablecolumns = array('picture', 'fullname', 'city', 'country', 'lastaccess');
|
|
$tableheaders = array('', get_string('fullname'), get_string('city'), get_string('country'), get_string('lastaccess'));
|
|
|
|
$table = new flexible_table('user-index-teachers-'.$course->id);
|
|
|
|
$table->define_columns($tablecolumns);
|
|
$table->define_headers($tableheaders);
|
|
$table->define_baseurl($baseurl);
|
|
|
|
$table->sortable(true, 'lastaccess', SORT_DESC);
|
|
|
|
$table->set_attribute('cellspacing', '0');
|
|
$table->set_attribute('id', 'teachers');
|
|
$table->set_attribute('class', 'generaltable generalbox');
|
|
|
|
$table->setup();
|
|
|
|
if($whereclause = $table->get_sql_where()) {
|
|
$whereclause .= ' AND ';
|
|
}
|
|
|
|
$teachersql = "SELECT u.id, u.username, u.firstname, u.lastname, u.maildisplay, u.mailformat, u.maildigest,
|
|
u.email, u.maildisplay, u.city, u.country, u.lastlogin, u.picture, u.lang, u.timezone,
|
|
u.emailstop, t.authority,t.role,t.editall,t.timeaccess as lastaccess, m.groupid
|
|
FROM {$CFG->prefix}user u
|
|
LEFT JOIN {$CFG->prefix}user_teachers t ON t.userid = u.id
|
|
LEFT JOIN {$CFG->prefix}groups_members m ON m.userid = u.id ";
|
|
|
|
if($isseparategroups) {
|
|
$whereclause .= '(t.editall OR groupid = '.$currentgroup.') AND ';
|
|
}
|
|
else if ($currentgroup) { // Displaying a group by choice
|
|
$whereclause .= 'groupid = '.$currentgroup.' AND ';
|
|
}
|
|
|
|
$teachersql .= 'WHERE '.$whereclause.' t.course = '.$course->id.' AND u.deleted = 0 AND u.confirmed = 1 AND t.authority > 0';
|
|
|
|
if($sortclause = $table->get_sql_sort()) {
|
|
$teachersql .= ' ORDER BY '.$sortclause;
|
|
}
|
|
|
|
$teachers = get_records_sql($teachersql);
|
|
|
|
if(!empty($teachers)) {
|
|
|
|
echo '<h2>'.$course->teachers;
|
|
echo ' <a href="'.$baseurl.'&teachers=0">';
|
|
echo '<img src="'.$CFG->pixpath.'/i/hide.gif" height="16" width="16" alt="'.get_string('hide').'" /></a>';
|
|
if (isadmin() or ($course->category and (iscreator() or (isteacheredit($course->id) and !empty($CFG->teacherassignteachers))))) {
|
|
echo ' <a href="'.$CFG->wwwroot.'/course/teacher.php?id='.$course->id.'">';
|
|
echo '<img src="'.$CFG->pixpath.'/i/edit.gif" height="16" width="16" alt="'.get_string('edit').'" /></a>';
|
|
}
|
|
echo '</h2>';
|
|
|
|
$exceptions = array_keys($teachers);
|
|
|
|
if ($fullmode) {
|
|
foreach ($teachers as $key => $teacher) {
|
|
print_user($teacher, $course);
|
|
}
|
|
} else {
|
|
$countrysort = (strpos($sortclause, 'country') !== false);
|
|
foreach ($teachers as $teacher) {
|
|
|
|
if ($teacher->lastaccess) {
|
|
$lastaccess = format_time(time() - $teacher->lastaccess, $datestring);
|
|
} else {
|
|
$lastaccess = $strnever;
|
|
}
|
|
|
|
if (empty($teacher->country)) {
|
|
$country = '';
|
|
}
|
|
else {
|
|
if($countrysort) {
|
|
$country = '('.$teacher->country.') '.$countries[$teacher->country];
|
|
}
|
|
else {
|
|
$country = $countries[$teacher->country];
|
|
}
|
|
}
|
|
|
|
$table->add_data(array (
|
|
//'<input type="checkbox" name="userid[]" value="'.$teacher->id.'" />',
|
|
print_user_picture($teacher->id, $course->id, $teacher->picture, false, true),
|
|
'<strong><a href="'.$CFG->wwwroot.'/user/view.php?id='.$teacher->id.'&course='.$course->id.'">'.fullname($teacher, $isteacher).'</a></strong>',
|
|
$teacher->city,
|
|
$country,
|
|
$lastaccess));
|
|
}
|
|
|
|
$table->print_html();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// Don't show teachers
|
|
echo '<h2>'.$course->teachers;
|
|
echo ' <a href="'.$baseurl.'&teachers=1">';
|
|
echo '<img src="'.$CFG->pixpath.'/i/show.gif" height="16" width="16" alt="'.get_string('show').'" /></a>';
|
|
if (isadmin() or ($course->category and (iscreator() or (isteacheredit($course->id) and !empty($CFG->teacherassignteachers))))) {
|
|
echo ' <a href="'.$CFG->wwwroot.'/course/teacher.php?id='.$course->id.'">';
|
|
echo '<img src="'.$CFG->pixpath.'/i/edit.gif" height="16" width="16" alt="'.get_string('edit').'" /></a>';
|
|
}
|
|
echo '</h2>';
|
|
}
|
|
|
|
$guest = get_guest();
|
|
$exceptions[] = $guest->id;
|
|
|
|
$tablecolumns = array('picture', 'fullname', 'city', 'country', 'lastaccess');
|
|
$tableheaders = array('', get_string('fullname'), get_string('city'), get_string('country'), get_string('lastaccess'));
|
|
|
|
$table = new flexible_table('user-index-students-'.$course->id);
|
|
|
|
$table->define_columns($tablecolumns);
|
|
$table->define_headers($tableheaders);
|
|
$table->define_baseurl($baseurl);
|
|
|
|
$table->sortable(true, 'lastaccess', SORT_DESC);
|
|
|
|
$table->set_attribute('cellspacing', '0');
|
|
$table->set_attribute('id', 'students');
|
|
$table->set_attribute('class', 'generaltable generalbox');
|
|
|
|
$table->set_control_variables(array(
|
|
TABLE_VAR_SORT => 'ssort',
|
|
TABLE_VAR_HIDE => 'shide',
|
|
TABLE_VAR_SHOW => 'sshow',
|
|
TABLE_VAR_IFIRST => 'sifirst',
|
|
TABLE_VAR_ILAST => 'silast',
|
|
TABLE_VAR_PAGE => 'spage'
|
|
));
|
|
$table->setup();
|
|
|
|
if(SITEID == $course->id) {
|
|
$select = 'SELECT u.id, u.username, u.firstname, u.lastname, u.email, u.city, u.country,
|
|
u.picture, u.lang, u.timezone, u.emailstop, u.maildisplay, u.lastaccess ';
|
|
$from = 'FROM '.$CFG->prefix.'user u ';
|
|
$where = 'WHERE confirmed = 1 AND u.deleted = 0 ';
|
|
}
|
|
else {
|
|
$select = 'SELECT u.id, u.username, u.firstname, u.lastname, u.email, u.city, u.country,
|
|
u.picture, u.lang, u.timezone, u.emailstop, u.maildisplay, s.timeaccess AS lastaccess ';
|
|
$from = 'FROM '.$CFG->prefix.'user u LEFT JOIN '.$CFG->prefix.'user_students s ON s.userid = u.id ';
|
|
$where = 'WHERE s.course = '.$course->id.' AND u.deleted = 0 ';
|
|
}
|
|
|
|
if ($currentgroup) { // Displaying a group by choice
|
|
// FIX: TODO: This will not work if $currentgroup == 0, i.e. "those not in a group"
|
|
$from .= 'LEFT JOIN '.$CFG->prefix.'groups_members gm ON u.id = gm.userid ';
|
|
$where .= ' AND gm.groupid = '.$currentgroup;
|
|
}
|
|
|
|
if($course->id == SITEID) {
|
|
$where .= ' AND u.id NOT IN ('.implode(',', $exceptions).')';
|
|
}
|
|
|
|
$totalcount = count_records_sql('SELECT COUNT(*) '.$from.$where);
|
|
|
|
if($table->get_sql_where()) {
|
|
$where .= ' AND '.$table->get_sql_where();
|
|
}
|
|
|
|
if($table->get_sql_sort()) {
|
|
$sort = ' ORDER BY '.$table->get_sql_sort();
|
|
}
|
|
else {
|
|
$sort = '';
|
|
}
|
|
|
|
$matchcount = count_records_sql('SELECT COUNT(*) '.$from.$where);
|
|
|
|
$table->initialbars($totalcount > $perpage);
|
|
$table->pagesize($perpage, $matchcount);
|
|
|
|
if($table->get_page_start() !== '' && $table->get_page_size() !== '') {
|
|
$limit = ' '.sql_paging_limit($table->get_page_start(), $table->get_page_size());
|
|
}
|
|
else {
|
|
$limit = '';
|
|
}
|
|
|
|
$students = get_records_sql($select.$from.$where.$sort.$limit);
|
|
|
|
$a->count = $totalcount;
|
|
$a->items = $totalcount == 1 ? $course->student : $course->students;
|
|
echo '<h2>'.get_string('counteditems', '', $a);
|
|
if (isteacheredit($course->id)) {
|
|
echo ' <a href="../course/student.php?id='.$course->id.'">';
|
|
echo '<img src="'.$CFG->pixpath.'/i/edit.gif" height="16" width="16" alt="" /></a>';
|
|
}
|
|
echo '</h2>';
|
|
|
|
if ($CFG->longtimenosee > 0 && $CFG->longtimenosee < 1000 && $totalcount > 0) {
|
|
echo '<p id="longtimenosee">('.get_string('unusedaccounts', '', $CFG->longtimenosee).')</p>';
|
|
}
|
|
|
|
if ($fullmode) { // Print simple listing
|
|
if ($totalcount < 1) {
|
|
print_heading(get_string("nostudentsfound", "", $course->students));
|
|
}
|
|
else {
|
|
|
|
if($totalcount > $perpage) {
|
|
|
|
$firstinitial = $table->get_initial_first();
|
|
$lastinitial = $table->get_initial_last();
|
|
$strall = get_string('all');
|
|
$alpha = explode(',', get_string('alphabet'));
|
|
|
|
// Bar of first initials
|
|
|
|
echo '<div class="initialbar firstinitial">'.get_string('firstname').' : ';
|
|
if(!empty($firstinitial)) {
|
|
echo '<a href="'.$baseurl.'&sifirst=">'.$strall.'</a>';
|
|
} else {
|
|
echo '<strong>'.$strall.'</strong>';
|
|
}
|
|
foreach ($alpha as $letter) {
|
|
if ($letter == $firstinitial) {
|
|
echo ' <strong>'.$letter.'</strong>';
|
|
} else {
|
|
echo ' <a href="'.$baseurl.'&sifirst='.$letter.'">'.$letter.'</a>';
|
|
}
|
|
}
|
|
echo '</div>';
|
|
|
|
// Bar of last initials
|
|
|
|
echo '<div class="initialbar lastinitial">'.get_string('lastname').' : ';
|
|
if(!empty($lastinitial)) {
|
|
echo '<a href="'.$baseurl.'&silast=">'.$strall.'</a>';
|
|
} else {
|
|
echo '<strong>'.$strall.'</strong>';
|
|
}
|
|
foreach ($alpha as $letter) {
|
|
if ($letter == $lastinitial) {
|
|
echo ' <strong>'.$letter.'</strong>';
|
|
} else {
|
|
echo ' <a href="'.$baseurl.'&silast='.$letter.'">'.$letter.'</a>';
|
|
}
|
|
}
|
|
echo '</div>';
|
|
|
|
print_paging_bar($matchcount, intval($table->get_page_start() / $perpage), $perpage, $baseurl.'&', 'spage');
|
|
|
|
}
|
|
|
|
if($matchcount > 0) {
|
|
foreach ($students as $student) {
|
|
print_user($student, $course);
|
|
}
|
|
}
|
|
else {
|
|
print_heading(get_string('nothingtodisplay'));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$countrysort = (strpos($sort, 'country') !== false);
|
|
if (!empty($students)) {
|
|
foreach ($students as $student) {
|
|
if ($student->lastaccess) {
|
|
$lastaccess = format_time(time() - $student->lastaccess, $datestring);
|
|
} else {
|
|
$lastaccess = $strnever;
|
|
}
|
|
|
|
if (empty($student->country)) {
|
|
$country = '';
|
|
}
|
|
else {
|
|
if($countrysort) {
|
|
$country = '('.$student->country.') '.$countries[$student->country];
|
|
}
|
|
else {
|
|
$country = $countries[$student->country];
|
|
}
|
|
}
|
|
|
|
$table->add_data(array (
|
|
//'<input type="checkbox" name="userid[]" value="'.$teacher->id.'" />',
|
|
print_user_picture($student->id, $course->id, $student->picture, false, true),
|
|
'<strong><a href="'.$CFG->wwwroot.'/user/view.php?id='.$student->id.'&course='.$course->id.'">'.fullname($student).'</a></strong>',
|
|
$student->city,
|
|
$country,
|
|
$lastaccess));
|
|
}
|
|
}
|
|
|
|
$table->print_html();
|
|
|
|
}
|
|
|
|
if ($perpage == 99999) {
|
|
echo '<div id="showall"><a href="'.$baseurl.'&perpage='.DEFAULT_PAGE_SIZE.'">'.get_string('showperpage', '', DEFAULT_PAGE_SIZE).'</a></div>';
|
|
}
|
|
else if ($matchcount > 0 && $perpage < $matchcount) {
|
|
echo '<div id="showall"><a href="'.$baseurl.'&perpage=99999">'.get_string('showall', '', $matchcount).'</a></div>';
|
|
}
|
|
|
|
print_footer($course);
|
|
|
|
?>
|