From: toyomoyo Date: Tue, 14 Aug 2007 06:41:16 +0000 (+0000) Subject: adding searchtext support when assinging group members, also made retrieving non... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=234315671161c2c9ae0459d6d8676445faebaaef;p=moodle.git adding searchtext support when assinging group members, also made retrieving non-members faster --- diff --git a/group/assign.php b/group/assign.php index 83cca1a52b..0bd3d7628f 100644 --- a/group/assign.php +++ b/group/assign.php @@ -11,7 +11,16 @@ require_once('../config.php'); require_once('lib.php'); -$groupid = required_param('group', PARAM_INT); +define("MAX_USERS_PER_PAGE", 5000); + +$groupid = required_param('group', PARAM_INT); +$searchtext = optional_param('searchtext', '', PARAM_RAW); // search string +$showall = optional_param('showall', 0, PARAM_BOOL); + +if ($showall) { + $searchtext = ''; +} + require_login(); if (!$group = get_record('groups', 'id', $groupid)) { @@ -25,6 +34,8 @@ if (! $course = get_record('course', 'id', $group->courseid)) { require_login($course); $courseid = $course->id; +$strsearch = get_string('search'); +$strshowall = get_string('showall'); $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid.'&group='.$groupid; $context = get_context_instance(CONTEXT_COURSE, $courseid); @@ -87,22 +98,30 @@ require_capability('moodle/course:managegroups', $context); $potentialmembers = array(); $potentialmembersoptions = ''; $potentialmemberscount = 0; - $potentialmembers = groups_get_users_not_in_group($courseid, $groupid); - if ($potentialmembers != false) { - // Put the groupings into a hash and sorts them - foreach ($potentialmembers as $userid) { - $nonmembers[$userid] = groups_get_user_displayname($userid, $courseid); - $potentialmemberscount++; - } - natcasesort($nonmembers); + $potentialmembers = groups_get_users_not_in_group($courseid, $groupid, $searchtext); + if (!empty($potentialmembers)) { + $potentialmemberscount = count($potentialmembers); + } else { + $potentialmemberscount = 0; + } + if ($potentialmemberscount <= MAX_USERS_PER_PAGE) { - // Print out the HTML - foreach($nonmembers as $id => $name) { - $potentialmembersoptions .= "\n"; + if ($potentialmembers != false) { + // Put the groupings into a hash and sorts them + foreach ($potentialmembers as $userid => $user) { + $nonmembers[$userid] = fullname($user); + //$nonmembers[$userid] = groups_get_user_displayname($userid, $courseid); + } + natcasesort($nonmembers); + + // Print out the HTML + foreach($nonmembers as $id => $name) { + $potentialmembersoptions .= "\n"; + } + } else { + $potentialmembersoptions .= ''; } - } else { - $potentialmembersoptions .= ''; } // Print the page and form @@ -155,14 +174,32 @@ require_capability('moodle/course:managegroups', $context); onfocus="document.getElementById('assignform').add.disabled=false; document.getElementById('assignform').remove.disabled=true; document.getElementById('assignform').removeselect.selectedIndex=-1;"> - + MAX_USERS_PER_PAGE) { + echo ''."\n" + .''."\n"; + } else { + echo $potentialmembersoptions; + } + ?>
- '."\n"; - }*/ + + + + '."\n"; + } ?> @@ -176,6 +213,4 @@ require_capability('moodle/course:managegroups', $context); diff --git a/group/lib/basicgrouplib.php b/group/lib/basicgrouplib.php index 33d44255c9..625939f09c 100644 --- a/group/lib/basicgrouplib.php +++ b/group/lib/basicgrouplib.php @@ -152,21 +152,73 @@ function groups_get_group_name($groupid) { /** * Gets the users for a course who are not in a specified group * @param int $groupid The id of the group + * @param string searchtext similar to searchtext in role assign, search * @return array An array of the userids of the non-group members, or false if - * an error occurred. + * an error occurred. + * This function was changed to get_users_by_capability style + * mostly because of the searchtext requirement */ -function groups_get_users_not_in_group($courseid, $groupid) { - $users = get_course_users($courseid); - $userids = groups_users_to_userids($users); - $nongroupmembers = array(); +function groups_get_users_not_in_group($courseid, $groupid, $searchtext='') { - foreach($userids as $userid) { - if (!groups_is_member($groupid, $userid)) { - array_push($nongroupmembers, $userid); + global $CFG; + + $context = get_context_instance(CONTEXT_COURSE, $courseid); + + if ($searchtext !== '') { // Search for a subset of remaining users + $LIKE = sql_ilike(); + $FULLNAME = sql_fullname(); + $wheresearch = " AND u.id IN (SELECT id FROM {$CFG->prefix}user WHERE $FULLNAME $LIKE '%$searchtext%' OR email $LIKE '%$searchtext%' )"; + } else { + $wheresearch = ''; + } + + $capability = 'moodle/course:view'; + $doanything = false; + + // find all possible "student" roles + if ($possibleroles = get_roles_with_capability($capability, CAP_ALLOW, $context)) { + if (!$doanything) { + if (!$sitecontext = get_context_instance(CONTEXT_SYSTEM)) { + return false; // Something is seriously wrong + } + $doanythingroles = get_roles_with_capability('moodle/site:doanything', CAP_ALLOW, $sitecontext); } + + $validroleids = array(); + foreach ($possibleroles as $possiblerole) { + if (!$doanything) { + if (isset($doanythingroles[$possiblerole->id])) { // We don't want these included + continue; + } + } + if ($caps = role_context_capabilities($possiblerole->id, $context, $capability)) { // resolved list + if (isset($caps[$capability]) && $caps[$capability] > 0) { // resolved capability > 0 + $validroleids[] = $possiblerole->id; + } + } + } + if (empty($validroleids)) { + return false; + } + $roleids = '('.implode(',', $validroleids).')'; + } else { + return false; // No need to continue, since no roles have this capability set } - return $nongroupmembers; +/// Construct the main SQL + $select = " SELECT u.id, u.firstname, u.lastname"; + $from = " FROM {$CFG->prefix}user u + INNER JOIN {$CFG->prefix}role_assignments ra ON ra.userid = u.id + INNER JOIN {$CFG->prefix}role r ON r.id = ra.roleid"; + $where = " WHERE ra.contextid ".get_related_contexts_string($context)." + AND u.deleted = 0 + AND ra.roleid in $roleids + AND u.id NOT IN (SELECT userid + FROM {$CFG->prefix}groups_members + WHERE groupid = $groupid) + $wheresearch"; + + return get_records_sql($select.$from.$where);; } /**