a9e8d2d7ea6d5b4455be49870753d21e2e57c370
[moodle.git] / group / overview.php
1 <?php
2 /**
3  * Print an overview of groupings & group membership
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');
13 $courseid   = required_param('id', PARAM_INT);
14 $groupid    = optional_param('group', 0, PARAM_INT);
15 $groupingid = optional_param('grouping', 0, PARAM_INT);
17 $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid;
18 $rooturl   = $CFG->wwwroot.'/group/overview.php?id='.$courseid;
20 if (!$course = $DB->get_record('course', array('id'=>$courseid))) {
21     print_error('invalidcourse');
22 }
24 $url = new moodle_url('/group/overview.php', array('course'=>$courseid));
25 if ($groupid !== 0) {
26     $url->param('group', $groupid);
27 }
28 if ($groupingid !== 0) {
29     $url->param('grouping', $groupingid);
30 }
31 $PAGE->set_url($url);
33 // Make sure that the user has permissions to manage groups.
34 require_login($course);
36 $context = get_context_instance(CONTEXT_COURSE, $courseid);
37 require_capability('moodle/course:managegroups', $context);
39 $strgroups           = get_string('groups');
40 $strparticipants     = get_string('participants');
41 $stroverview         = get_string('overview', 'group');
42 $strgrouping         = get_string('grouping', 'group');
43 $strgroup            = get_string('group', 'group');
44 $strnotingrouping    = get_string('notingrouping', 'group');
45 $strfiltergroups     = get_string('filtergroups', 'group');
46 $strnogroups         = get_string('nogroups', 'group');
47 $strdescription      = get_string('description');
49 // Get all groupings
50 if (empty($CFG->enablegroupings)) {
51     $groupings  = array();
52     $members    = array(-1 => array()); //groups not in a grouping
53     $groupingid = 0;
54 } else {
55     $groupings = $DB->get_records('groupings', array('courseid'=>$courseid), 'name');
56     $members = array();
57     foreach ($groupings as $grouping) {
58         $members[$grouping->id] = array();
59     }
60     $members[-1] = array(); //groups not in a grouping
61 }
63 // Get all groups
64 $groups = $DB->get_records('groups', array('courseid'=>$courseid), 'name');
66 $params = array('courseid'=>$courseid);
67 if ($groupid) {
68     $groupwhere = "AND g.id = :groupid";
69     $params['groupid']   = $groupid;
70 } else {
71     $groupwhere = "";
72 }
74 if (empty($CFG->enablegroupings)) {
75     $sql = "SELECT g.id AS groupid, NULL AS groupingid, u.id AS userid, u.firstname, u.lastname, u.idnumber, u.username
76               FROM {groups} g
77                    LEFT JOIN {groups_members} gm ON g.id = gm.groupid
78                    LEFT JOIN {user} u ON gm.userid = u.id
79              WHERE g.courseid = :courseid $groupwhere
80           ORDER BY g.name, u.lastname, u.firstname";
81 } else {
82     if ($groupingid) {
83         $groupingwhere = "AND gg.groupingid = :groupingid";
84         $params['groupingid'] = $groupingid;
85     } else {
86         $groupingwhere = "";
87     }
88     $sql = "SELECT g.id AS groupid, gg.groupingid, u.id AS userid, u.firstname, u.lastname, u.idnumber, u.username
89               FROM {groups} g
90                    LEFT JOIN {groupings_groups} gg ON g.id = gg.groupid
91                    LEFT JOIN {groups_members} gm ON g.id = gm.groupid
92                    LEFT JOIN {user} u ON gm.userid = u.id
93              WHERE g.courseid = :courseid $groupwhere $groupingwhere
94           ORDER BY g.name, u.lastname, u.firstname";
95 }
97 if ($rs = $DB->get_recordset_sql($sql, $params)) {
98     foreach ($rs as $row) {
99         $user = new object();
100         $user->id        = $row->userid;
101         $user->firstname = $row->firstname;
102         $user->lastname  = $row->lastname;
103         $user->username  = $row->username;
104         $user->idnumber  = $row->idnumber;
105         if (!$row->groupingid) {
106             $row->groupingid = -1;
107         }
108         if (!array_key_exists($row->groupid, $members[$row->groupingid])) {
109             $members[$row->groupingid][$row->groupid] = array();
110         }
111         if(isset($user->id)){
112            $members[$row->groupingid][$row->groupid][] = $user;
113         }
114     }
115     $rs->close();
118 $PAGE->navbar->add($strparticipants, new moodle_url('/user/index.php', array('id'=>$courseid)));
119 $PAGE->navbar->add($strgroups);
121 /// Print header
122 $PAGE->set_title($strgroups);
123 $PAGE->set_heading(': '.$strgroups);
124 echo $OUTPUT->header();
126 // Add tabs
127 $currenttab = 'overview';
128 require('tabs.php');
130 /// Print overview
131 echo $OUTPUT->heading(format_string($course->shortname) .' '.$stroverview, 3);
133 echo $strfiltergroups;
135 if (!empty($CFG->enablegroupings)) {
136     $options = array();
137     $options[0] = get_string('all');
138     foreach ($groupings as $grouping) {
139         $options[$grouping->id] = strip_tags(format_string($grouping->name));
140     }
141     $popupurl = new moodle_url($rooturl.'&group='.$groupid);
142     $select = new single_select($popupurl, 'grouping', $options, $groupingid);
143     $select->label = $strgrouping;
144     $select->formid = 'selectgrouping';
145     echo $OUTPUT->render($select);
148 $options = array();
149 $options[0] = get_string('all');
150 foreach ($groups as $group) {
151     $options[$group->id] = strip_tags(format_string($group->name));
153 $popupurl = new moodle_url($rooturl.'&grouping='.$groupingid);
154 $select = new single_select($popupurl, 'group', $options, $groupid);
155 $select->label = $strgroup;
156 $select->formid = 'selectgroup';
157 echo $OUTPUT->render($select);
159 /// Print table
160 $printed = false;
161 $hoverevents = array();
162 foreach ($members as $gpgid=>$groupdata) {
163     if ($groupingid and $groupingid != $gpgid) {
164         continue; // do not show
165     }
166     $table = new html_table();
167     $table->head  = array(get_string('groupscount', 'group', count($groupdata)), get_string('groupmembers', 'group'), get_string('usercount', 'group'));
168     $table->size  = array('20%', '70%', '10%');
169     $table->align = array('left', 'left', 'center');
170     $table->width = '90%';
171     $table->data  = array();
172     foreach ($groupdata as $gpid=>$users) {
173         if ($groupid and $groupid != $gpid) {
174             continue;
175         }
176         $line = array();
177         $name = format_string($groups[$gpid]->name);
178         $description = file_rewrite_pluginfile_urls($groups[$gpid]->description, 'pluginfile.php', $context->id, 'course_group_description', $gpid);
179         $options = new stdClass;
180         $options->noclean = true;
181         $jsdescription = trim(format_text($description, $groups[$gpid]->descriptionformat, $options));
182         if (empty($jsdescription)) {
183             $line[] = $name;
184         } else {
185             $line[] = html_writer::tag('span', $name, array('id'=>'group_'.$gpid));
186             $hoverevents['group_'.$gpid] = $jsdescription;
187         }
188         $fullnames = array();
189         foreach ($users as $user) {
190             $fullnames[] = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&amp;course='.$course->id.'">'.fullname($user, true).'</a>';
191         }
192         $line[] = implode(', ', $fullnames);
193         $line[] = count($users);
194         $table->data[] = $line;
195     }
196     if ($groupid and empty($table->data)) {
197         continue;
198     }
199     if (!empty($CFG->enablegroupings)) {
200         if ($gpgid < 0) {
201             echo $OUTPUT->heading($strnotingrouping, 3);
202         } else {
203             echo $OUTPUT->heading(format_string($groupings[$gpgid]->name), 3);
204             $description = file_rewrite_pluginfile_urls($groupings[$gpgid]->description, 'pluginfile.php', $context->id, 'course_grouping_description', $gpgid);
205             $options = new stdClass;
206             $options->noclean = true;
207             echo $OUTPUT->box(format_text($description, $groupings[$gpgid]->descriptionformat, $options), 'generalbox boxwidthnarrow boxaligncenter');
208         }
209     }
210     echo html_writer::table($table);
211     $printed = true;
214 if (count($hoverevents)>0) {
215     $PAGE->requires->string_for_js('description', 'moodle');
216     $PAGE->requires->js_init_call('M.core_group.init_hover_events', array($hoverevents));
219 echo $OUTPUT->footer();