2001-11-22 06:23:56 +00:00
< ? PHP // $Id$
// Lists all the users within a given course
2005-06-03 23:20:01 +00:00
require_once ( '../config.php' );
2005-04-27 18:30:02 +00:00
require_once ( $CFG -> libdir . '/tablelib.php' );
2004-01-10 16:41:29 +00:00
define ( 'USER_SMALL_CLASS' , 20 ); // Below this is considered small
define ( 'USER_LARGE_CLASS' , 200 ); // Above this is considered large
2005-06-03 23:20:01 +00:00
define ( 'DEFAULT_PAGE_SIZE' , 20 );
2006-09-15 14:32:35 +00:00
define ( 'SHOW_ALL_PAGE_SIZE' , 5000 );
2007-11-23 00:23:39 +00:00
define ( 'MODE_BRIEF' , 0 );
define ( 'MODE_USERDETAILS' , 1 );
define ( 'MODE_ENROLDETAILS' , 2 );
2001-11-22 06:23:56 +00:00
2005-06-03 23:20:01 +00:00
$page = optional_param ( 'page' , 0 , PARAM_INT ); // which page to show
$perpage = optional_param ( 'perpage' , DEFAULT_PAGE_SIZE , PARAM_INT ); // how many per page
2007-11-23 00:23:39 +00:00
$mode = optional_param ( 'mode' , NULL ); // use the MODE_ constants
2005-11-17 02:46:27 +00:00
$accesssince = optional_param ( 'accesssince' , 0 , PARAM_INT ); // filter by last access. -1 = never
2005-11-19 13:19:34 +00:00
$search = optional_param ( 'search' , '' , PARAM_CLEAN );
2006-08-09 13:53:12 +00:00
$roleid = optional_param ( 'roleid' , 0 , PARAM_INT ); // optional roleid
2006-08-14 08:38:49 +00:00
2006-09-19 06:36:54 +00:00
$contextid = optional_param ( 'contextid' , 0 , PARAM_INT ); // one of this or
$courseid = optional_param ( 'id' , 0 , PARAM_INT ); // this are required
2005-11-17 03:09:07 +00:00
2006-08-14 08:38:49 +00:00
if ( $contextid ) {
if ( ! $context = get_context_instance_by_id ( $contextid )) {
error ( " Context ID is incorrect " );
}
if ( ! $course = get_record ( 'course' , 'id' , $context -> instanceid )) {
error ( " Course ID is incorrect " );
}
} else {
if ( ! $course = get_record ( 'course' , 'id' , $courseid )) {
error ( " Course ID is incorrect " );
}
if ( ! $context = get_context_instance ( CONTEXT_COURSE , $course -> id )) {
error ( " Context ID is incorrect " );
}
2001-11-22 06:23:56 +00:00
}
2006-10-01 19:55:47 +00:00
// not needed anymore
unset ( $contextid );
unset ( $courseid );
2001-11-22 06:23:56 +00:00
2007-03-05 20:13:16 +00:00
require_login ( $course );
2001-11-22 06:23:56 +00:00
2007-03-05 20:13:16 +00:00
$sitecontext = get_context_instance ( CONTEXT_SYSTEM );
2007-10-02 03:37:30 +00:00
$frontpagectx = get_context_instance ( CONTEXT_COURSE , SITEID );
2007-03-05 20:13:16 +00:00
2007-10-02 03:37:30 +00:00
if ( $context -> id != $frontpagectx -> id ) {
2007-12-20 15:11:05 +00:00
require_capability ( 'moodle/course:viewparticipants' , $context );
2007-10-02 03:37:30 +00:00
} else {
2007-12-20 15:11:05 +00:00
require_capability ( 'moodle/site:viewparticipants' , $sitecontext );
2006-11-20 20:47:17 +00:00
}
2007-10-02 03:37:30 +00:00
/// front page course is different
2006-11-20 20:47:17 +00:00
$rolenames = array ();
2007-03-30 16:01:44 +00:00
$avoidroles = array ();
2006-11-20 20:47:17 +00:00
if ( $roles = get_roles_used_in_context ( $context , true )) {
2007-08-17 19:09:11 +00:00
// We should ONLY allow roles with moodle/course:view because otherwise we get little niggly issues
2007-03-30 16:01:44 +00:00
// like MDL-8093
2007-08-17 19:09:11 +00:00
// We should further exclude "admin" users (those with "doanything" at site level) because
2006-11-20 20:47:17 +00:00
// Otherwise they appear in every participant list
2007-03-30 16:01:44 +00:00
$canviewroles = get_roles_with_capability ( 'moodle/course:view' , CAP_ALLOW , $context );
2006-11-20 20:47:17 +00:00
$doanythingroles = get_roles_with_capability ( 'moodle/site:doanything' , CAP_ALLOW , $sitecontext );
2006-08-25 08:27:27 +00:00
foreach ( $roles as $role ) {
2007-03-30 16:01:44 +00:00
if ( ! isset ( $canviewroles [ $role -> id ])) { // Avoid this role (eg course creator)
$avoidroles [] = $role -> id ;
unset ( $roles [ $role -> id ]);
continue ;
}
2006-11-20 20:47:17 +00:00
if ( isset ( $doanythingroles [ $role -> id ])) { // Avoid this role (ie admin)
2007-03-30 16:01:44 +00:00
$avoidroles [] = $role -> id ;
2006-11-20 20:47:17 +00:00
unset ( $roles [ $role -> id ]);
continue ;
}
2007-03-22 08:11:30 +00:00
$rolenames [ $role -> id ] = strip_tags ( role_get_name ( $role , $context )); // Used in menus etc later on
2006-08-25 08:27:27 +00:00
}
2006-11-20 20:47:17 +00:00
}
2007-10-02 03:37:30 +00:00
// no roles to display yet?
// frontpage course is an exception, on the front page course we should display all users
if ( empty ( $rolenames ) && $context -> id != $frontpagectx -> id ) {
2007-08-31 08:21:16 +00:00
if ( has_capability ( 'moodle/role:assign' , $context )) {
2006-10-01 19:55:47 +00:00
redirect ( $CFG -> wwwroot . '/' . $CFG -> admin . '/roles/assign.php?contextid=' . $context -> id );
2006-08-25 08:27:27 +00:00
} else {
2006-11-20 20:47:17 +00:00
error ( 'No participants found for this course' );
2006-08-25 08:27:27 +00:00
}
}
2005-06-03 23:20:01 +00:00
add_to_log ( $course -> id , 'user' , 'view all' , 'index.php?id=' . $course -> id , '' );
2001-11-22 06:23:56 +00:00
2006-09-28 06:41:07 +00:00
$bulkoperations = has_capability ( 'moodle/course:bulkmessaging' , $context );
2005-11-17 03:09:07 +00:00
2005-04-27 18:30:02 +00:00
$countries = get_list_of_countries ();
2005-06-03 23:20:01 +00:00
$strnever = get_string ( 'never' );
2005-04-27 18:30:02 +00:00
2007-02-15 03:14:40 +00:00
$datestring -> year = get_string ( 'year' );
$datestring -> years = get_string ( 'years' );
2005-06-03 23:20:01 +00:00
$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' );
2002-09-22 14:06:38 +00:00
2005-03-22 16:04:10 +00:00
if ( $mode !== NULL ) {
2007-11-23 00:23:39 +00:00
$mode = ( int ) $mode ;
$SESSION -> userindexmode = $mode ;
2005-03-22 16:04:10 +00:00
} else if ( isset ( $SESSION -> userindexmode )) {
2007-11-23 00:23:39 +00:00
$mode = ( int ) $SESSION -> userindexmode ;
2005-03-22 16:04:10 +00:00
} else {
2007-11-23 00:23:39 +00:00
$mode = MODE_BRIEF ;
2005-03-22 16:04:10 +00:00
}
/// Check to see if groups are being used in this forum
/// and if so, set $currentgroup to reflect the current group
2007-09-08 20:53:05 +00:00
$groupmode = groups_get_course_groupmode ( $course ); // Groups are being used
$currentgroup = groups_get_course_group ( $course , true );
2005-03-22 16:04:10 +00:00
2005-06-03 23:20:01 +00:00
if ( ! $currentgroup ) { // To make some other functions work better later
$currentgroup = NULL ;
}
2005-03-22 16:04:10 +00:00
2004-09-01 13:56:12 +00:00
$isseparategroups = ( $course -> groupmode == SEPARATEGROUPS and $course -> groupmodeforce and
2007-03-05 20:13:16 +00:00
! has_capability ( 'moodle/site:accessallgroups' , $context ));
2004-01-31 04:08:10 +00:00
2007-08-17 19:09:11 +00:00
if ( $isseparategroups and ( ! $currentgroup ) ) {
$navlinks = array ();
$navlinks [] = array ( 'name' => get_string ( 'participants' ), 'link' => null , 'type' => 'misc' );
$navigation = build_navigation ( $navlinks );
print_header ( " $course->shortname : " . get_string ( 'participants' ), $course -> fullname , $navigation , " " , " " , true , " " , navmenu ( $course ));
2005-03-22 16:04:10 +00:00
print_heading ( get_string ( " notingroup " , " forum " ));
print_footer ( $course );
exit ;
}
2005-06-03 23:20:01 +00:00
// Should use this variable so that we don't break stuff every time a variable is added or changed.
2007-09-08 20:53:05 +00:00
$baseurl = $CFG -> wwwroot . '/user/index.php?contextid=' . $context -> id . '&roleid=' . $roleid . '&id=' . $course -> id . '&perpage=' . $perpage . '&accesssince=' . $accesssince . '&search=' . s ( $search );
2005-03-22 16:04:10 +00:00
/// Print headers
2004-01-31 04:08:10 +00:00
2007-08-17 19:09:11 +00:00
$navlinks = array ();
$navlinks [] = array ( 'name' => get_string ( 'participants' ), 'link' => null , 'type' => 'misc' );
$navigation = build_navigation ( $navlinks );
2006-03-09 09:09:20 +00:00
2007-08-17 19:09:11 +00:00
print_header ( " $course->shortname : " . get_string ( 'participants' ), $course -> fullname , $navigation , " " , " " , true , " " , navmenu ( $course ));
2007-03-30 16:01:44 +00:00
2007-03-05 20:13:16 +00:00
/// setting up tags
2006-08-14 08:38:49 +00:00
if ( $course -> id == SITEID ) {
2006-03-09 09:09:20 +00:00
$filtertype = 'site' ;
2006-08-14 08:38:49 +00:00
} else if ( $course -> id && ! $currentgroup ) {
2006-03-09 09:09:20 +00:00
$filtertype = 'course' ;
2006-08-14 08:38:49 +00:00
$filterselect = $course -> id ;
2006-03-09 09:09:20 +00:00
} else {
$filtertype = 'group' ;
$filterselect = $currentgroup ;
}
$currenttab = 'participants' ;
$user = $USER ;
require_once ( $CFG -> dirroot . '/user/tabs.php' );
2005-11-20 21:29:59 +00:00
/// Get the hidden field list
2007-03-05 20:13:16 +00:00
if ( has_capability ( 'moodle/course:viewhiddenuserfields' , $context )) {
2005-11-20 21:29:59 +00:00
$hiddenfields = array (); // teachers and admins are allowed to see everything
} else {
$hiddenfields = array_flip ( explode ( ',' , $CFG -> hiddenuserfields ));
}
2006-08-08 05:13:06 +00:00
2005-03-22 16:04:10 +00:00
/// Print settings and things in a table across the top
2005-06-03 23:20:01 +00:00
echo '<table class="controls" cellspacing="0"><tr>' ;
2005-03-22 16:04:10 +00:00
2006-08-25 08:54:22 +00:00
/// Print my course menus
2006-09-13 05:05:17 +00:00
if ( $mycourses = get_my_courses ( $USER -> id )) {
echo '<td class="left">' ;
$courselist = array ();
foreach ( $mycourses as $mycourse ) {
2007-03-15 15:46:53 +00:00
$courselist [ $mycourse -> id ] = format_string ( $mycourse -> shortname );
2006-09-13 05:05:17 +00:00
}
2006-10-01 19:55:47 +00:00
popup_form ( $CFG -> wwwroot . '/user/index.php?roleid=' . $roleid . '&sifirst=&silast=&id=' ,
2007-03-05 20:13:16 +00:00
$courselist , 'courseform' , $course -> id , '' , '' , '' , false , 'self' , get_string ( 'mycourses' ));
2006-09-13 05:05:17 +00:00
echo '</td>' ;
}
2006-10-01 19:55:47 +00:00
2007-05-22 02:08:22 +00:00
echo '<td class="left">' ;
2007-09-08 20:53:05 +00:00
groups_print_course_menu ( $course , $baseurl );
2007-05-22 02:08:22 +00:00
echo '</td>' ;
2005-03-22 16:04:10 +00:00
2006-09-28 06:41:07 +00:00
// get minimum lastaccess for this course and display a dropbox to filter by lastaccess going back this far.
// this might not work anymore because you always going to get yourself as the most recent entry? added $USER!=$user ch
$minlastaccess = get_field_sql ( 'SELECT min(timeaccess) FROM ' . $CFG -> prefix . 'user_lastaccess WHERE courseid = ' . $course -> id . ' AND timeaccess != 0 AND userid!=' . $USER -> id );
$lastaccess0exists = record_exists ( 'user_lastaccess' , 'courseid' , $course -> id , 'timeaccess' , 0 );
$now = usergetmidnight ( time ());
$timeaccess = array ();
2006-10-01 19:55:47 +00:00
2006-09-28 06:41:07 +00:00
// makes sense for this to go first.
$timeoptions [ 0 ] = get_string ( 'selectperiod' );
2006-10-01 19:55:47 +00:00
2006-09-28 06:41:07 +00:00
// days
for ( $i = 1 ; $i < 7 ; $i ++ ) {
if ( strtotime ( '-' . $i . ' days' , $now ) >= $minlastaccess ) {
$timeoptions [ strtotime ( '-' . $i . ' days' , $now )] = get_string ( 'numdays' , 'moodle' , $i );
2006-06-15 21:37:20 +00:00
}
2006-09-28 06:41:07 +00:00
}
// weeks
for ( $i = 1 ; $i < 10 ; $i ++ ) {
if ( strtotime ( '-' . $i . ' weeks' , $now ) >= $minlastaccess ) {
$timeoptions [ strtotime ( '-' . $i . ' weeks' , $now )] = get_string ( 'numweeks' , 'moodle' , $i );
2006-06-15 21:37:20 +00:00
}
2006-09-28 06:41:07 +00:00
}
2006-10-01 19:55:47 +00:00
// months
2006-09-28 06:41:07 +00:00
for ( $i = 2 ; $i < 12 ; $i ++ ) {
if ( strtotime ( '-' . $i . ' months' , $now ) >= $minlastaccess ) {
$timeoptions [ strtotime ( '-' . $i . ' months' , $now )] = get_string ( 'nummonths' , 'moodle' , $i );
2005-11-17 02:46:27 +00:00
}
}
2006-09-28 06:41:07 +00:00
// try a year
if ( strtotime ( '-1 year' , $now ) >= $minlastaccess ) {
$timeoptions [ strtotime ( '-1 year' , $now )] = get_string ( 'lastyear' );
}
2006-10-01 19:55:47 +00:00
2006-09-28 06:41:07 +00:00
if ( ! empty ( $lastaccess0exists )) {
$timeoptions [ - 1 ] = get_string ( 'never' );
2006-10-01 19:55:47 +00:00
}
2006-09-28 06:41:07 +00:00
if ( count ( $timeoptions ) > 1 ) {
echo '<td class="left">' ;
$baseurl = preg_replace ( '/&accesssince=' . $accesssince . '/' , '' , $baseurl );
2007-03-05 20:13:16 +00:00
popup_form ( $baseurl . '&accesssince=' , $timeoptions , 'timeoptions' , $accesssince , '' , '' , '' , false , 'self' , get_string ( 'usersnoaccesssince' ));
2006-09-28 06:41:07 +00:00
echo '</td>' ;
}
2006-10-01 19:55:47 +00:00
2007-11-23 00:23:39 +00:00
// Decide wheteher we will fetch extra enrolment/groups data.
//
// MODE_ENROLDETAILS is expensive, and only suitable where the listing is small
// (at or below DEFAULT_PAGE_SIZE) and $USER can enrol/unenrol
// (will take 1 extra DB query - 2 on Oracle)
//
if ( $course -> id != SITEID && $perpage <= DEFAULT_PAGE_SIZE
&& has_capability ( 'moodle/role:assign' , $context )) {
$allowenroldetails = true ;
} else {
$allowenroldetails = false ;
}
if ( $mode === MODE_ENROLDETAILS && ! ( $allowenroldetails )) {
// conditions haven't been met - reset
$mode = MODE_BRIEF ;
}
2005-11-17 02:46:27 +00:00
2005-06-03 23:20:01 +00:00
echo '<td class="right">' ;
2007-11-23 00:23:39 +00:00
$formatmenu = array ( '0' => get_string ( 'brief' ),
'1' => get_string ( 'userdetails' ));
if ( $allowenroldetails ) {
$formatmenu [ '2' ] = get_string ( 'enroldetails' );
}
popup_form ( $baseurl . '&mode=' , $formatmenu , 'formatmenu' , $mode , '' , '' , '' , false , 'self' , get_string ( 'userlist' ));
2005-03-22 16:04:10 +00:00
echo '</td></tr></table>' ;
2007-03-05 20:13:16 +00:00
if ( $currentgroup and ( ! $isseparategroups or has_capability ( 'moodle/site:accessallgroups' , $context ))) { /// Display info about the group
2007-09-08 20:53:05 +00:00
if ( $group = groups_get_group ( $currentgroup )) {
2006-10-01 19:55:47 +00:00
if ( ! empty ( $group -> description ) or ( ! empty ( $group -> picture ) and empty ( $group -> hidepicture ))) {
2005-03-22 16:04:10 +00:00
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 ;
2007-03-05 20:13:16 +00:00
if ( has_capability ( 'moodle/course:managegroups' , $context )) {
2007-08-15 20:33:17 +00:00
echo ' <a title="' . get_string ( 'editgroupprofile' ) . '" href="' . $CFG -> wwwroot . '/group/group.php?id=' . $group -> id . '&courseid=' . $group -> courseid . '">' ;
2007-01-04 13:15:04 +13:00
echo '<img src="' . $CFG -> pixpath . '/t/edit.gif" alt="' . get_string ( 'editgroupprofile' ) . '" />' ;
2005-05-03 18:11:34 +00:00
echo '</a>' ;
}
2005-03-22 16:04:10 +00:00
echo '</h3>' ;
echo format_text ( $group -> description );
echo '</td></tr></table>' ;
}
}
}
2006-09-28 06:41:07 +00:00
/// Define a table showing a list of users in the current role selection
2006-11-13 03:43:12 +00:00
$tablecolumns = array ( 'userpic' , 'fullname' );
$tableheaders = array ( get_string ( 'userpic' ), get_string ( 'fullname' ));
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_BRIEF && ! isset ( $hiddenfields [ 'city' ])) {
2006-09-28 06:41:07 +00:00
$tablecolumns [] = 'city' ;
$tableheaders [] = get_string ( 'city' );
}
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_BRIEF && ! isset ( $hiddenfields [ 'country' ])) {
2006-09-28 06:41:07 +00:00
$tablecolumns [] = 'country' ;
$tableheaders [] = get_string ( 'country' );
}
if ( ! isset ( $hiddenfields [ 'lastaccess' ])) {
$tablecolumns [] = 'lastaccess' ;
$tableheaders [] = get_string ( 'lastaccess' );
}
if ( $course -> enrolperiod ) {
$tablecolumns [] = 'timeend' ;
$tableheaders [] = get_string ( 'enrolmentend' );
}
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_ENROLDETAILS ) {
2007-11-23 00:22:56 +00:00
$tablecolumns [] = 'roles' ;
$tableheaders [] = get_string ( 'roles' );
2007-11-23 00:23:24 +00:00
if ( $groupmode != 0 ) {
$tablecolumns [] = 'groups' ;
$tableheaders [] = get_string ( 'groups' );
if ( ! empty ( $CFG -> enablegroupings )) {
$tablecolumns [] = 'groupings' ;
$tableheaders [] = get_string ( 'groupings' , 'group' );
}
2007-11-23 00:22:56 +00:00
}
}
2006-09-28 06:41:07 +00:00
if ( $bulkoperations ) {
2007-11-23 00:22:56 +00:00
$tablecolumns [] = 'select' ;
2006-09-28 06:41:07 +00:00
$tableheaders [] = get_string ( 'select' );
}
2006-10-01 06:18:18 +00:00
$table = new flexible_table ( 'user-index-participants-' . $course -> id );
2006-09-28 06:41:07 +00:00
$table -> define_columns ( $tablecolumns );
$table -> define_headers ( $tableheaders );
$table -> define_baseurl ( $baseurl );
2007-08-17 19:09:11 +00:00
2006-09-28 06:41:07 +00:00
$table -> sortable ( true , 'lastaccess' , SORT_DESC );
2007-11-23 00:22:56 +00:00
$table -> no_sorting ( 'roles' );
$table -> no_sorting ( 'groups' );
$table -> no_sorting ( 'groupings' );
$table -> no_sorting ( 'select' );
2006-09-28 06:41:07 +00:00
$table -> set_attribute ( 'cellspacing' , '0' );
2006-10-01 06:18:18 +00:00
$table -> set_attribute ( 'id' , 'participants' );
2006-09-28 06:41:07 +00:00
$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 ();
// we are looking for all users with this role assigned in this context or higher
if ( $usercontexts = get_parent_contexts ( $context )) {
$listofcontexts = '(' . implode ( ',' , $usercontexts ) . ')' ;
} else {
2006-10-01 19:55:47 +00:00
$listofcontexts = '(' . $sitecontext -> id . ')' ; // must be site
2006-09-28 06:41:07 +00:00
}
2006-08-09 13:53:12 +00:00
if ( $roleid ) {
2006-09-28 06:41:07 +00:00
$selectrole = " AND r.roleid = $roleid " ;
} else {
$selectrole = " " ;
}
2007-10-02 03:37:30 +00:00
if ( $context -> id != $frontpagectx -> id ) {
2007-10-02 06:18:30 +00:00
$select = ' SELECT DISTINCT u . id , u . username , u . firstname , u . lastname ,
2007-09-19 07:55:00 +00:00
u . email , u . city , u . country , u . picture ,
u . lang , u . timezone , u . emailstop , u . maildisplay , u . imagealt ,
COALESCE ( ul . timeaccess , 0 ) AS lastaccess ,
r . hidden ,
ctx . id AS ctxid , ctx . path AS ctxpath ,
2007-10-02 03:37:30 +00:00
ctx . depth AS ctxdepth , ctx . contextlevel AS ctxlevel ' ;
$select .= $course -> enrolperiod ? ', r.timeend ' : '' ;
} else {
2007-10-02 09:45:00 +00:00
$select = ' SELECT u . id , u . username , u . firstname , u . lastname ,
2007-10-02 03:37:30 +00:00
u . email , u . city , u . country , u . picture ,
u . lang , u . timezone , u . emailstop , u . maildisplay , u . imagealt ,
u . lastaccess ,
ctx . id AS ctxid , ctx . path AS ctxpath ,
2007-09-19 07:55:00 +00:00
ctx . depth AS ctxdepth , ctx . contextlevel AS ctxlevel ' ;
2007-10-02 03:37:30 +00:00
}
2007-09-19 07:55:00 +00:00
2007-10-02 03:37:30 +00:00
if ( $context -> id != $frontpagectx -> id ) {
$from = " FROM { $CFG -> prefix } user u
LEFT OUTER JOIN { $CFG -> prefix } context ctx
ON ( u . id = ctx . instanceid AND ctx . contextlevel = " .CONTEXT_USER. " )
JOIN { $CFG -> prefix } role_assignments r
ON u . id = r . userid
LEFT OUTER JOIN { $CFG -> prefix } user_lastaccess ul
ON ( r . userid = ul . userid and ul . courseid = $course -> id ) " ;
} else {
$from = " FROM { $CFG -> prefix } user u
LEFT OUTER JOIN { $CFG -> prefix } context ctx
ON ( u . id = ctx . instanceid AND ctx . contextlevel = " .CONTEXT_USER. " ) " ;
}
2007-08-17 19:09:11 +00:00
$hiddensql = has_capability ( 'moodle/role:viewhiddenassigns' , $context ) ? '' : ' AND r.hidden = 0 ' ;
2006-12-04 03:05:40 +00:00
2007-03-30 16:01:44 +00:00
// exclude users with roles we are avoiding
if ( $avoidroles ) {
2006-12-08 04:28:58 +00:00
$adminroles = 'AND r.roleid NOT IN (' ;
2007-03-30 16:01:44 +00:00
$adminroles .= implode ( ',' , $avoidroles );
2006-12-04 03:05:40 +00:00
$adminroles .= ')' ;
} else {
$adminroles = '' ;
}
2007-08-17 19:09:11 +00:00
2006-10-05 08:54:35 +00:00
// join on 2 conditions
// otherwise we run into the problem of having records in ul table, but not relevant course
// and user record is not pulled out
2007-10-02 03:37:30 +00:00
if ( $context -> id != $frontpagectx -> id ) {
$where = " WHERE (r.contextid = $context->id OR r.contextid in $listofcontexts )
AND u . deleted = 0 $selectrole
AND ( ul . courseid = $course -> id OR ul . courseid IS NULL )
AND u . username != 'guest'
$adminroles
$hiddensql " ;
$where .= get_lastaccess_sql ( $accesssince );
} else {
$where = " WHERE u.deleted = 0
AND u . username != 'guest' " ;
$where .= get_lastaccess_sql ( $accesssince );
}
2006-09-28 06:41:07 +00:00
$wheresearch = '' ;
if ( ! empty ( $search )) {
$LIKE = sql_ilike ();
$fullname = sql_fullname ( 'u.firstname' , 'u.lastname' );
$wheresearch .= ' AND (' . $fullname . ' ' . $LIKE . '\'%' . $search . '%\' OR email ' . $LIKE . '\'%' . $search . '%\' OR idnumber ' . $LIKE . ' \'%' . $search . '%\') ' ;
}
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 ;
}
$totalcount = count_records_sql ( 'SELECT COUNT(distinct u.id) ' . $from . $where ); // Each user could have > 1 role
if ( $table -> get_sql_where ()) {
$where .= ' AND ' . $table -> get_sql_where ();
}
2008-03-15 21:57:25 +00:00
/// Always add r.hidden to sort in order to guarantee hiddens to "win"
/// in the resolution of duplicates later - MDL-13935
2006-09-28 06:41:07 +00:00
if ( $table -> get_sql_sort ()) {
2008-03-15 21:57:25 +00:00
$sort = ' ORDER BY ' . $table -> get_sql_sort () . ', r.hidden DESC' ;
2006-09-28 06:41:07 +00:00
} else {
2008-03-15 21:57:25 +00:00
$sort = ' r.hidden DESC' ;
2006-09-28 06:41:07 +00:00
}
2006-12-06 04:54:31 +00:00
$matchcount = count_records_sql ( 'SELECT COUNT(distinct u.id) ' . $from . $where . $wheresearch );
2006-09-28 06:41:07 +00:00
2007-12-20 17:43:19 +00:00
$table -> initialbars ( true );
2006-09-28 06:41:07 +00:00
$table -> pagesize ( $perpage , $matchcount );
2007-09-19 07:55:15 +00:00
$userlist = get_recordset_sql ( $select . $from . $where . $wheresearch . $sort ,
2006-09-28 06:41:07 +00:00
$table -> get_page_start (), $table -> get_page_size ());
2006-09-28 06:04:39 +00:00
2007-11-23 00:22:56 +00:00
//
// The SELECT behind get_participants_extra() is cheaper if we pass an array
// if IDs. We could pass the SELECT we did before (with the limit bits - tricky!)
// but this is much cheaper. And in any case, it is only doable with limited numbers
// of rows anyway. On a large course it will explode badly...
//
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_ENROLDETAILS ) {
2007-11-23 00:22:56 +00:00
$userids = array ();
while ( $user = rs_fetch_next_record ( $userlist )) {
$userids [] = $user -> id ;
}
$userlist_extra = get_participants_extra ( $userids , $avoidroles , $course , $context );
// Only Oracle cannot seek backwards
// and must re-query...
if ( $userlist -> canSeek === true ) {
$userlist -> MoveFirst ();
} else {
$userlist = get_recordset_sql ( $select . $from . $where . $wheresearch . $sort ,
$table -> get_page_start (), $table -> get_page_size ());
}
}
2006-09-28 06:04:39 +00:00
/// If there are multiple Roles in the course, then show a drop down menu for switching
2006-11-20 20:47:17 +00:00
if ( count ( $rolenames ) > 1 ) {
2006-09-28 06:41:07 +00:00
echo '<div class="rolesform">' ;
echo get_string ( 'currentrole' , 'role' ) . ': ' ;
$rolenames = array ( 0 => get_string ( 'all' )) + $rolenames ;
2006-11-20 20:47:17 +00:00
popup_form ( " $CFG->wwwroot /user/index.php?contextid= $context->id &sifirst=&silast=&roleid= " , $rolenames ,
2006-09-28 06:41:07 +00:00
'rolesform' , $roleid , '' );
2007-07-31 20:10:05 +00:00
echo '</div>' ;
2006-09-28 06:41:07 +00:00
}
2006-09-28 06:04:39 +00:00
2006-09-28 06:41:07 +00:00
if ( $roleid ) {
2006-08-14 08:38:49 +00:00
if ( ! $currentrole = get_record ( 'role' , 'id' , $roleid )) {
error ( 'That role does not exist' );
}
2006-09-28 04:45:39 +00:00
$a -> number = $totalcount ;
2007-11-19 04:13:15 +00:00
// MDL-12217, use course specific rolename
if ( isset ( $rolenames [ $currentrole -> id ])){
$a -> role = $rolenames [ $currentrole -> id ];
} else {
$a -> role = $currentrole -> name ; //safety net
}
2008-03-13 12:13:26 +00:00
$heading = format_string ( get_string ( 'xuserswiththerole' , 'role' , $a ));
if ( $currentgroup and $group ) {
$a -> group = $group -> name ;
$heading .= ' ' . format_string ( get_string ( 'ingroup' , 'role' , $a ));
}
if ( $accesssince ) {
$a -> timeperiod = $timeoptions [ $accesssince ];
$heading .= ' ' . format_string ( get_string ( 'inactiveformorethan' , 'role' , $a ));
}
$heading .= " : $a->number " ;
2006-09-06 08:55:23 +00:00
if ( user_can_assign ( $context , $roleid )) {
2006-09-28 06:04:39 +00:00
$heading .= ' <a href="' . $CFG -> wwwroot . '/' . $CFG -> admin . '/roles/assign.php?roleid=' . $roleid . '&contextid=' . $context -> id . '">' ;
2007-01-08 09:14:05 +00:00
$heading .= '<img src="' . $CFG -> pixpath . '/i/edit.gif" class="icon" alt="" /></a>' ;
2006-09-28 06:04:39 +00:00
}
print_heading ( $heading , 'center' , 3 );
} else {
2008-02-29 04:30:27 +00:00
if ( $course -> id !== SITEID && has_capability ( 'moodle/role:assign' , $context )) {
$editlink = ' <a href="' . $CFG -> wwwroot . '/' . $CFG -> admin . '/roles/assign.php?contextid=' . $context -> id . '">' ;
$editlink .= '<img src="' . $CFG -> pixpath . '/i/edit.gif" class="icon" alt="" /></a>' ;
} else {
$editlink = '' ;
}
2006-10-31 01:21:48 +00:00
if ( $matchcount < $totalcount ) {
2008-02-29 04:30:27 +00:00
print_heading ( get_string ( 'allparticipants' ) . ': ' . $matchcount . '/' . $totalcount . $editlink , '' , 3 );
2006-10-31 01:21:48 +00:00
} else {
2008-02-29 04:30:27 +00:00
print_heading ( get_string ( 'allparticipants' ) . ': ' . $matchcount . $editlink , '' , 3 );
2006-10-31 01:21:48 +00:00
}
2006-09-28 06:04:39 +00:00
}
2006-09-28 06:41:07 +00:00
if ( $bulkoperations ) {
echo '
2006-11-28 10:23:26 +00:00
< script type = " text/javascript " >
2006-12-22 04:25:00 +00:00
//<![CDATA[
2006-09-28 06:41:07 +00:00
function checksubmit ( form ) {
var destination = form . formaction . options [ form . formaction . selectedIndex ] . value ;
if ( destination == " " || ! checkchecked ( form )) {
form . formaction . selectedIndex = 0 ;
return false ;
} else {
return true ;
}
2006-08-09 13:53:12 +00:00
}
2006-09-28 06:41:07 +00:00
function checkchecked ( form ) {
var inputs = document . getElementsByTagName ( \ ' INPUT\ ' );
var checked = false ;
inputs = filterByParent ( inputs , function () { return form ;});
for ( var i = 0 ; i < inputs . length ; ++ i ) {
if ( inputs [ i ] . type == \ ' checkbox\ ' && inputs [ i ] . checked ) {
checked = true ;
}
2006-08-09 13:53:12 +00:00
}
2006-09-28 06:41:07 +00:00
return checked ;
}
2006-12-22 04:25:00 +00:00
//]]>
2006-09-28 06:41:07 +00:00
</ script >
' ;
2007-01-06 14:07:00 +00:00
echo '<form action="action_redir.php" method="post" id="participantsform" onsubmit="return checksubmit(this);">' ;
echo '<div>' ;
2006-09-28 06:41:07 +00:00
echo '<input type="hidden" name="sesskey" value="' . $USER -> sesskey . '" />' ;
2007-05-09 10:05:08 +00:00
echo '<input type="hidden" name="returnto" value="' . s ( $_SERVER [ 'REQUEST_URI' ]) . '" />' ;
2006-09-28 06:41:07 +00:00
}
if ( $CFG -> longtimenosee > 0 && $CFG -> longtimenosee < 1000 && $totalcount > 0 ) {
echo '<p id="longtimenosee">(' . get_string ( 'unusedaccounts' , '' , $CFG -> longtimenosee ) . ')</p>' ;
}
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_USERDETAILS ) { // Print simple listing
2006-09-28 06:41:07 +00:00
if ( $totalcount < 1 ) {
2006-10-01 06:18:18 +00:00
print_heading ( get_string ( 'nothingtodisplay' ));
2006-09-28 06:41:07 +00:00
} 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>' ;
2006-08-09 13:53:12 +00:00
} else {
2006-09-28 06:41:07 +00:00
echo ' <a href="' . $baseurl . '&sifirst=' . $letter . '">' . $letter . '</a>' ;
2006-08-09 13:53:12 +00:00
}
}
2006-09-28 06:41:07 +00:00
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>' ;
2006-08-09 13:53:12 +00:00
}
}
2006-09-28 06:41:07 +00:00
echo '</div>' ;
print_paging_bar ( $matchcount , intval ( $table -> get_page_start () / $perpage ), $perpage , $baseurl . '&' , 'spage' );
}
if ( $matchcount > 0 ) {
2008-03-15 21:57:25 +00:00
$usersprinted = array ();
2007-09-19 07:55:15 +00:00
while ( $user = rs_fetch_next_record ( $userlist )) {
2008-03-15 21:57:25 +00:00
if ( in_array ( $user -> id , $usersprinted )) { /// Prevent duplicates by r.hidden - MDL-13935
continue ;
}
$usersprinted [] = $user -> id ; /// Add new user to the array of users printed
2007-09-19 07:55:00 +00:00
$user = make_context_subobj ( $user );
2006-10-01 06:18:18 +00:00
print_user ( $user , $course , $bulkoperations );
2006-08-09 13:53:12 +00:00
}
2006-09-28 06:41:07 +00:00
} else {
print_heading ( get_string ( 'nothingtodisplay' ));
2006-08-09 13:53:12 +00:00
}
}
2006-09-28 06:41:07 +00:00
} else {
$countrysort = ( strpos ( $sort , 'country' ) !== false );
$timeformat = get_string ( 'strftimedate' );
2006-11-15 04:28:18 +00:00
2007-10-10 12:19:27 +00:00
if ( $userlist ) {
2007-11-23 00:22:56 +00:00
// only show the plugin if multiple enrolment plugins
// are enabled...
if ( strpos ( $CFG -> enrol_plugins_enabled , ',' ) === false ) {
$showenrolplugin = true ;
} else {
$showenrolplugin = false ;
}
2008-03-15 21:57:25 +00:00
$usersprinted = array ();
2007-09-19 07:55:15 +00:00
while ( $user = rs_fetch_next_record ( $userlist )) {
2008-03-15 21:57:25 +00:00
if ( in_array ( $user -> id , $usersprinted )) { /// Prevent duplicates by r.hidden - MDL-13935
continue ;
}
$usersprinted [] = $user -> id ; /// Add new user to the array of users printed
2007-09-19 07:55:00 +00:00
$user = make_context_subobj ( $user );
2007-12-15 23:30:38 +00:00
if ( ! empty ( $user -> hidden ) ) {
2006-11-15 04:28:18 +00:00
// if the assignment is hidden, display icon
2007-12-15 23:30:38 +00:00
$hidden = " <img src= \" { $CFG -> pixpath } /t/hide.gif \" alt= \" " . get_string ( 'hiddenassign' ) . " \" class= \" hide-show-image \" /> " ;
2006-11-15 04:28:18 +00:00
} else {
2007-08-17 19:09:11 +00:00
$hidden = '' ;
2006-11-15 04:28:18 +00:00
}
2007-08-17 19:09:11 +00:00
2006-10-01 06:18:18 +00:00
if ( $user -> lastaccess ) {
$lastaccess = format_time ( time () - $user -> lastaccess , $datestring );
2006-09-28 06:41:07 +00:00
} else {
$lastaccess = $strnever ;
}
2006-10-01 06:18:18 +00:00
if ( empty ( $user -> country )) {
2006-09-28 06:41:07 +00:00
$country = '' ;
} else {
if ( $countrysort ) {
2006-10-01 06:18:18 +00:00
$country = '(' . $user -> country . ') ' . $countries [ $user -> country ];
2006-08-09 13:53:12 +00:00
}
else {
2006-10-01 06:18:18 +00:00
$country = $countries [ $user -> country ];
2006-08-09 13:53:12 +00:00
}
2006-09-28 06:41:07 +00:00
}
2007-08-17 19:09:11 +00:00
2007-09-19 07:55:00 +00:00
if ( ! isset ( $user -> context )) {
$usercontext = get_context_instance ( CONTEXT_USER , $user -> id );
} else {
$usercontext = $user -> context ;
}
2007-08-17 19:09:11 +00:00
2008-02-08 03:59:38 +00:00
if ( $piclink = ( $USER -> id == $user -> id || has_capability ( 'moodle/user:viewdetails' , $context ) || has_capability ( 'moodle/user:viewdetails' , $usercontext ))) {
2006-12-07 06:14:52 +00:00
$profilelink = '<strong><a href="' . $CFG -> wwwroot . '/user/view.php?id=' . $user -> id . '&course=' . $course -> id . '">' . fullname ( $user ) . '</a></strong>' ;
} else {
2007-08-17 19:09:11 +00:00
$profilelink = '<strong>' . fullname ( $user ) . '</strong>' ;
2006-12-07 06:14:52 +00:00
}
2007-08-17 19:09:11 +00:00
2006-09-28 06:41:07 +00:00
$data = array (
2007-09-19 07:20:01 +00:00
print_user_picture ( $user , $course -> id , $user -> picture , false , true , $piclink ),
2007-12-15 23:30:38 +00:00
$profilelink . $hidden );
2006-12-07 06:14:52 +00:00
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_BRIEF && ! isset ( $hiddenfields [ 'city' ])) {
2006-10-01 06:18:18 +00:00
$data [] = $user -> city ;
2006-09-28 06:41:07 +00:00
}
2007-11-23 00:23:39 +00:00
if ( $mode === MODE_BRIEF && ! isset ( $hiddenfields [ 'country' ])) {
2006-09-28 06:41:07 +00:00
$data [] = $country ;
}
if ( ! isset ( $hiddenfields [ 'lastaccess' ])) {
$data [] = $lastaccess ;
}
if ( $course -> enrolperiod ) {
2006-10-01 06:18:18 +00:00
if ( $user -> timeend ) {
$data [] = userdate ( $user -> timeend , $timeformat );
2006-09-28 06:41:07 +00:00
} else {
$data [] = get_string ( 'unlimited' );
2006-08-09 13:53:12 +00:00
}
}
2007-11-23 00:22:56 +00:00
if ( isset ( $userlist_extra ) && isset ( $userlist_extra [ $user -> id ])) {
$ras = $userlist_extra [ $user -> id ][ 'ra' ];
$rastring = '' ;
foreach ( $ras AS $key => $ra ) {
$rolename = $rolenames [ $ra [ 'roleid' ] ] ;
if ( $ra [ 'ctxlevel' ] == CONTEXT_COURSECAT ) {
2007-11-23 00:23:39 +00:00
$rastring .= $rolename . ' @ ' . '<a href="' . $CFG -> wwwroot . '/course/category.php?id=' . $ra [ 'ctxinstanceid' ] . '">' . s ( $ra [ 'ccname' ]) . '</a>' ;
2007-11-23 00:22:56 +00:00
} elseif ( $ra [ 'ctxlevel' ] == CONTEXT_SYSTEM ) {
2007-11-23 00:23:39 +00:00
$rastring .= $rolename . ' - ' . get_string ( 'globalrole' , 'role' );
2007-11-23 00:22:56 +00:00
} else {
$rastring .= $rolename ;
}
if ( $showenrolplugin ) {
$rastring .= '<br />' ;
} else {
$rastring .= ' (' . $ra [ 'enrolplugin' ] . ')<br />' ;
}
}
$data [] = $rastring ;
2007-11-23 00:23:24 +00:00
if ( $groupmode != 0 ) {
2007-11-23 00:22:56 +00:00
// htmlescape with s() and implode the array
$data [] = implode ( ', ' , array_map ( 's' , $userlist_extra [ $user -> id ][ 'group' ]));
2007-11-23 00:23:24 +00:00
if ( ! empty ( $CFG -> enablegroupings )) {
$data [] = implode ( ', ' , array_map ( 's' , $userlist_extra [ $user -> id ][ 'gping' ]));
}
2007-11-23 00:22:56 +00:00
}
}
2006-09-28 06:41:07 +00:00
if ( $bulkoperations ) {
2006-10-01 06:18:18 +00:00
$data [] = '<input type="checkbox" name="user' . $user -> id . '" />' ;
2006-09-28 06:41:07 +00:00
}
$table -> add_data ( $data );
2006-08-09 13:53:12 +00:00
}
}
2006-09-28 04:45:39 +00:00
2006-09-28 06:41:07 +00:00
$table -> print_html ();
}
if ( $bulkoperations ) {
2007-01-06 14:07:00 +00:00
echo '<br /><div class="buttons">' ;
2006-09-28 06:41:07 +00:00
echo '<input type="button" onclick="checkall()" value="' . get_string ( 'selectall' ) . '" /> ' ;
echo '<input type="button" onclick="checknone()" value="' . get_string ( 'deselectall' ) . '" /> ' ;
2007-03-14 01:50:54 +00:00
$displaylist = array ();
2007-11-21 07:53:42 +00:00
$displaylist [ 'messageselect.php' ] = get_string ( 'messageselectadd' );
2007-10-02 03:37:30 +00:00
if ( has_capability ( 'moodle/notes:manage' , $context ) && $context -> id != $frontpagectx -> id ) {
2007-07-05 06:53:17 +00:00
$displaylist [ 'addnote.php' ] = get_string ( 'addnewnote' , 'notes' );
$displaylist [ 'groupaddnote.php' ] = get_string ( 'groupaddnewnote' , 'notes' );
}
2007-11-21 07:53:42 +00:00
2007-10-02 03:37:30 +00:00
if ( $context -> id != $frontpagectx -> id ) {
$displaylist [ 'extendenrol.php' ] = get_string ( 'extendenrol' );
$displaylist [ 'groupextendenrol.php' ] = get_string ( 'groupextendenrol' );
}
2007-08-17 19:09:11 +00:00
2006-09-28 06:41:07 +00:00
helpbutton ( " participantswithselectedusers " , get_string ( " withselectedusers " ));
2007-01-06 14:07:00 +00:00
choose_from_menu ( $displaylist , " formaction " , " " , get_string ( " withselectedusers " ), " if(checksubmit(this.form))this.form.submit(); " , " " );
2006-09-28 06:48:50 +00:00
echo '<input type="hidden" name="id" value="' . $course -> id . '" />' ;
2006-09-28 06:41:07 +00:00
echo '<input type="submit" value="' . get_string ( 'ok' ) . '" />' ;
2007-01-06 14:07:00 +00:00
echo '</div>' ;
echo '</div>' ;
echo '</form>' ;
2007-03-26 09:28:58 +00:00
2006-09-28 06:41:07 +00:00
}
2006-09-28 04:45:39 +00:00
2006-09-28 06:41:07 +00:00
if ( $bulkoperations && $totalcount > ( $perpage * 3 )) {
2007-03-01 04:30:42 +00:00
echo '<form action="index.php"><div><input type="hidden" name="id" value="' . $course -> id . '" />' . get_string ( 'search' ) . ': ' . " \n " ;
2007-07-04 08:31:54 +00:00
echo '<input type="text" name="search" value="' . s ( $search ) . '" /> <input type="submit" value="' . get_string ( 'search' ) . '" /></div></form>' . " \n " ;
2006-09-28 06:41:07 +00:00
}
2006-09-28 04:45:39 +00:00
2007-04-15 16:09:55 +00:00
$perpageurl = preg_replace ( '/&perpage=\d*/' , '' , $baseurl );
2006-09-28 06:41:07 +00:00
if ( $perpage == SHOW_ALL_PAGE_SIZE ) {
2007-04-15 16:09:55 +00:00
echo '<div id="showall"><a href="' . $perpageurl . '&perpage=' . DEFAULT_PAGE_SIZE . '">' . get_string ( 'showperpage' , '' , DEFAULT_PAGE_SIZE ) . '</a></div>' ;
2006-09-28 06:41:07 +00:00
} else if ( $matchcount > 0 && $perpage < $matchcount ) {
2007-04-15 16:09:55 +00:00
echo '<div id="showall"><a href="' . $perpageurl . '&perpage=' . SHOW_ALL_PAGE_SIZE . '">' . get_string ( 'showall' , '' , $matchcount ) . '</a></div>' ;
2006-09-28 04:45:39 +00:00
}
2006-09-28 06:41:07 +00:00
2005-06-03 23:20:01 +00:00
print_footer ( $course );
2001-11-22 06:23:56 +00:00
2007-10-10 12:19:27 +00:00
if ( $userlist ) {
rs_close ( $userlist );
}
2006-09-28 06:41:07 +00:00
2005-11-17 02:46:27 +00:00
function get_lastaccess_sql ( $accesssince = '' ) {
if ( empty ( $accesssince )) {
return '' ;
}
if ( $accesssince == - 1 ) { // never
2006-09-12 07:39:25 +00:00
return ' AND ul.timeaccess = 0' ;
2005-11-17 02:46:27 +00:00
} else {
2006-09-13 05:05:17 +00:00
return ' AND ul.timeaccess != 0 AND timeaccess < ' . $accesssince ;
2005-11-17 02:46:27 +00:00
}
}
2007-11-23 00:22:56 +00:00
function get_participants_extra ( $userids , $avoidroles , $course , $context ) {
global $CFG ;
if ( count ( $userids ) === 0 || count ( $avoidroles ) === 0 ) {
return array ();
}
$userids = implode ( ',' , $userids );
// turn the path into a list of context ids
$contextids = substr ( $context -> path , 1 ); // kill leading slash
$contextids = str_replace ( '/' , ',' , $contextids );;
if ( count ( $avoidroles ) > 0 ) {
$avoidroles = implode ( ',' , $avoidroles );
$avoidrolescond = " AND ra.roleid NOT IN ( $avoidroles ) " ;
} else {
$avoidrolescond = '' ;
}
if ( ! empty ( $CFG -> enablegroupings )) {
$gpjoin = " LEFT OUTER JOIN { $CFG -> prefix } groupings_groups gpg
ON gpg . groupid = g . id
LEFT OUTER JOIN { $CFG -> prefix } groupings gp
ON ( gp . courseid = { $course -> id } AND gp . id = gpg . groupingid ) " ;
$gpselect = ',gp.id AS gpid, gp.name AS gpname ' ;
} else {
$gpjoin = '' ;
$gpselect = '' ;
}
// Note: this returns strange redundant rows, perhaps
// due to the multiple OUTER JOINs. If we can tweak the
// JOINs to avoid it ot
$sql = " SELECT DISTINCT ra.userid,
ctx . id AS ctxid , ctx . path AS ctxpath , ctx . depth AS ctxdepth ,
ctx . contextlevel AS ctxlevel , ctx . instanceid AS ctxinstanceid ,
cc . name AS ccname ,
ra . roleid AS roleid ,
ra . enrol AS enrolplugin ,
g . id AS gid , g . name AS gname
$gpselect
FROM { $CFG -> prefix } role_assignments ra
JOIN { $CFG -> prefix } context ctx
ON ( ra . contextid = ctx . id )
LEFT OUTER JOIN { $CFG -> prefix } course_categories cc
ON ( ctx . contextlevel = 40 AND ctx . instanceid = cc . id )
/* only if groups active */
LEFT OUTER JOIN { $CFG -> prefix } groups_members gm
ON ( ra . userid = gm . userid )
LEFT OUTER JOIN { $CFG -> prefix } groups g
ON ( gm . groupid = g . id AND g . courseid = { $course -> id })
/* and if groupings is enabled... */
$gpjoin
WHERE ra . userid IN ( $userids )
AND ra . contextid in ( $contextids )
$avoidrolescond
ORDER BY ra . userid , ctx . depth DESC " ;
$rs = get_recordset_sql ( $sql );
$extra = array ();
// Data structure -
// $extra [ $userid ] [ 'group' ] [ $groupid => 'group name']
// [ 'gping' ] [ $gpingid => 'gping name']
// [ 'ra' ] [ [ "$ctxid:$roleid" => [ctxid => $ctxid
// ctxdepth => $ctxdepth,
// ctxpath => $ctxpath,
// ctxname => 'name' (categories only)
// ctxinstid =>
// roleid => $roleid
// enrol => $pluginname
//
// Might be interesting to add to RA timestart, timeend, timemodified,
// and modifierid (with an outer join to mdl_user!
//
while ( $rec = rs_fetch_next_record ( $rs )) {
$userid = $rec -> userid ;
// Prime an initial user rec...
if ( ! isset ( $extra [ $userid ])) {
$extra [ $userid ] = array ( 'group' => array (),
'gping' => array (),
'ra' => array () );
}
if ( ! empty ( $rec -> gid )) {
$extra [ $userid ][ 'group' ][ $rec -> gid ] = $rec -> gname ;
}
if ( ! empty ( $rec -> gpid )) {
$extra [ $userid ][ 'gping' ][ $rec -> gpid ] = $rec -> gpname ;
}
$rakey = $rec -> ctxid . ':' . $rec -> roleid ;
if ( ! isset ( $extra [ $userid ][ 'ra' ][ $rakey ])) {
$extra [ $userid ][ 'ra' ][ $rakey ] = array ( 'ctxid' => $rec -> ctxid ,
'ctxlevel' => $rec -> ctxlevel ,
'ctxinstanceid' => $rec -> ctxinstanceid ,
'ccname' => $rec -> ccname ,
'roleid' => $rec -> roleid ,
'enrolplugin' => $rec -> enrolplugin );
}
}
return $extra ;
}
2001-11-22 06:23:56 +00:00
?>