MDL-11419 - groups: interface enhancements + new features:
[moodle.git] / group / autogroup.php
1 <?php // $Id$
2 /**
3  * Create and allocate users go groups
4  *
5  * @author  Matt Clarkson mattc@catalyst.net.nz
6  * @version 0.0.1
7  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
8  * @package groups
9  */
11 require_once('../config.php');
12 require_once('autogroup_form.php');
14 $courseid = required_param('courseid', PARAM_INT);
16 if (!$course = get_record('course', 'id',$courseid)) {
17     error('invalidcourse');
18 }
20 // Make sure that the user has permissions to manage groups.
21 require_login($course);
23 $context = get_context_instance(CONTEXT_COURSE, $courseid);
24 $sitecontext = get_context_instance(CONTEXT_SYSTEM);
25 require_capability('moodle/course:managegroups', $context);
27 $returnurl = $CFG->wwwroot.'/group/index.php?id='.$course->id;
29 $strgroups = get_string('groups');
30 $strparticipants = get_string('participants');
31 $stroverview = get_string('overview', 'group');
32 $strgrouping = get_string('grouping', 'group');
33 $strgroup = get_string('group', 'group');
34 $strnotingrouping = get_string('notingrouping', 'group');
35 $strfiltergroups = get_string('filtergroups', 'group');
38 // Print the page and form
39 $navlinks = array(array('name'=>$strparticipants, 'link'=>$CFG->wwwroot.'/user/index.php?id='.$courseid, 'type'=>'misc'),
40                   array('name'=>$strgroups, 'link'=>'', 'type'=>'misc'));
41 $navigation = build_navigation($navlinks);
44 /// Get applicable roles
45 $rolenames = array();
46 $avoidroles = array();
48 if ($roles = get_roles_used_in_context($context, true)) {
49     $canviewroles    = get_roles_with_capability('moodle/course:view', CAP_ALLOW, $context);
50     $doanythingroles = get_roles_with_capability('moodle/site:doanything', CAP_ALLOW, $sitecontext);
52     foreach ($roles as $role) {
53         if (!isset($canviewroles[$role->id])) {   // Avoid this role (eg course creator)
54             $avoidroles[] = $role->id;
55             unset($roles[$role->id]);
56             continue;
57         }
58         if (isset($doanythingroles[$role->id])) {   // Avoid this role (ie admin)
59             $avoidroles[] = $role->id;
60             unset($roles[$role->id]);
61             continue;
62         }
63         $rolenames[$role->id] = strip_tags(role_get_name($role, $context));   // Used in menus etc later on
64     }
65 }
67 /// Create the form
68 $editform = new autogroup_form('autogroup.php', array('roles' => $rolenames));
69 $editform->set_data(array('courseid' => $courseid,
70                           'seed' => time()));
74 /// Handle form submission
75 if ($editform->is_cancelled()) {
76     redirect($returnurl);
77 } elseif ($data = $editform->get_data()) {
78     
79    /// Allocate members from the selected role to groups
80     if ($data->allocateby == 'random') {
81         $orderby = 'firstname';
82     } else {
83         $orderby = $data->allocateby;
84     }
85     $users = groups_get_potental_members($data->courseid, $data->roleid, $orderby);
86     $usercnt = count($users);
87     
88     if ($data->allocateby == 'random') {
89         srand ($data->seed);
90         shuffle($users);
91     }
92     
93     $groups = array();
94     $i = 0;
95     $cnt = 0;
96     
97     if ($data->groupby == 'groups') {
98         $numgrps = $data->number;
99         $userpergrp = ceil($usercnt/$numgrps);
100     } else {
101         $numgrps = ceil($data->number/$usercnt);
102         $userpergrp = $data->number;
103     }
104     
105     foreach($users as $id => $user) {
106         if (!isset($groups[$i])) { // Create a new group
107                 $groups[$i]['name'] = groups_parse_name($data->namingschemegrp['namingscheme'], $i);
108         }
109         @$groups[$i]['members'][] = &$users[$id];
110         $cnt++;
111         if ($cnt == $userpergrp) {
112                 $cnt = 0;
113             $i++;
114         }
115     }
116    
117    
118     if (isset($data->preview)) {
119        /// Print the groups preview
120         $preview = '<ul>';
121         foreach ($groups as $group) {
122                 $preview .= "<li>$group[name]\n<ul>";
123             foreach ($group['members'] as $member) {
124                 $preview .= '<li>'.fullname($member).'</li>';
125             }
126             $preview .= "</ul>\n</li>\n";
127         }
128         $preview .= '</ul>';
129     } else {
130        /// Save the groups data 
131         foreach ($groups as $group) {        
132             $newgroup->timecreated = time();
133             $newgroup->timemodified = $newgroup->timecreated;
134             $newgroup->courseid = $data->courseid;
135             $newgroup->name = $group['name'];
136             $groupid = insert_record('groups', $newgroup);
137             foreach($group['members'] as $user) {
138                 $member->groupid = $groupid;
139                 $member->userid = $user->id;
140                 $member->timeadded = time();
141                 insert_record('groups_members', $member);
142             }
143         }
144         redirect($returnurl);
145     }
148  
149 /// Print header
150 print_header_simple($strgroups, ': '.$strgroups, $navigation, '', '', true, '', navmenu($course));
152 /// Display the form
153 $editform->display();
154 if(isset($preview)) {
155         print_heading_block(get_string('groupspreview', 'group'));
156     print_box($preview);
159 print_footer($course);
160 ?>