wwwroot.'/group/index.php?id='.$course->id; $strgroups = get_string('groups'); $strparticipants = get_string('participants'); $stroverview = get_string('overview', 'group'); $strgrouping = get_string('grouping', 'group'); $strgroup = get_string('group', 'group'); $strnotingrouping = get_string('notingrouping', 'group'); $strfiltergroups = get_string('filtergroups', 'group'); // Print the page and form $navlinks = array(array('name'=>$strparticipants, 'link'=>$CFG->wwwroot.'/user/index.php?id='.$courseid, 'type'=>'misc'), array('name'=>$strgroups, 'link'=>'', 'type'=>'misc')); $navigation = build_navigation($navlinks); /// Get applicable roles $rolenames = array(); $avoidroles = array(); if ($roles = get_roles_used_in_context($context, true)) { $canviewroles = get_roles_with_capability('moodle/course:view', CAP_ALLOW, $context); $doanythingroles = get_roles_with_capability('moodle/site:doanything', CAP_ALLOW, $sitecontext); foreach ($roles as $role) { if (!isset($canviewroles[$role->id])) { // Avoid this role (eg course creator) $avoidroles[] = $role->id; unset($roles[$role->id]); continue; } if (isset($doanythingroles[$role->id])) { // Avoid this role (ie admin) $avoidroles[] = $role->id; unset($roles[$role->id]); continue; } $rolenames[$role->id] = strip_tags(role_get_name($role, $context)); // Used in menus etc later on } } /// Create the form $editform = new autogroup_form('autogroup.php', array('roles' => $rolenames)); $editform->set_data(array('courseid' => $courseid, 'seed' => time())); /// Handle form submission if ($editform->is_cancelled()) { redirect($returnurl); } elseif ($data = $editform->get_data()) { /// Allocate members from the selected role to groups if ($data->allocateby == 'random') { $orderby = 'firstname'; } else { $orderby = $data->allocateby; } $users = groups_get_potental_members($data->courseid, $data->roleid, $orderby); $usercnt = count($users); if ($data->allocateby == 'random') { srand ($data->seed); shuffle($users); } $groups = array(); $i = 0; $cnt = 0; // Plan the allocation if ($data->groupby == 'groups') { $numgrps = $data->number; $userpergrp = ceil($usercnt/$numgrps); } else { $numgrps = ceil($usercnt/$data->number); $userpergrp = $data->number > $usercnt ? $usercnt : $data->number; // If there would be one group with a small number of member reduce the number of groups $remainder = $userpergrp - ($userpergrp * $numgrps - $usercnt); if ($remainder && $remainder < $userpergrp * AUTOGROUP_MIN_RATIO) { $numgrps--; } } // Do the allocation $remainggroups = $numgrps; $remaingusers = $usercnt; foreach($users as $id => $user) { if (!isset($groups[$i])) { // Create a new group $groups[$i]['name'] = groups_parse_name($data->namingschemegrp['namingscheme'], $i); } @$groups[$i]['members'][] = &$users[$id]; $cnt++; if ($cnt >= round($usercnt / $remainggroups)) { $usercnt -= $cnt; $cnt = 0; $i++; $remainggroups--; } } if (isset($data->preview)) { /// Print the groups preview $preview = ''; if (isset($remainder) && $remainder != $userpergrp && $data->groupby == 'members') { $preview .= '
'.get_string('evenallocation', 'group').'
'; } $preview .= '