Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/group/ -> index.php (source)

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401] [Versions 401 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  
  18  /**
  19   * The main group management user interface.
  20   *
  21   * @copyright 2006 The Open University, N.D.Freear AT open.ac.uk, J.White AT open.ac.uk
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   * @package   core_group
  24   */
  25  require_once('../config.php');
  26  require_once ('lib.php');
  27  
  28  $courseid = required_param('id', PARAM_INT);
  29  $groupid  = optional_param('group', false, PARAM_INT);
  30  $userid   = optional_param('user', false, PARAM_INT);
  31  $action   = groups_param_action();
  32  // Support either single group= parameter, or array groups[]
  33  if ($groupid) {
  34      $groupids = array($groupid);
  35  } else {
  36      $groupids = optional_param_array('groups', array(), PARAM_INT);
  37  }
  38  $singlegroup = (count($groupids) == 1);
  39  
  40  $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid;
  41  
  42  // Get the course information so we can print the header and
  43  // check the course id is valid
  44  
  45  $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
  46  
  47  $url = new moodle_url('/group/index.php', array('id'=>$courseid));
  48  navigation_node::override_active_url($url);
  49  if ($userid) {
  50      $url->param('user', $userid);
  51  }
  52  if ($groupid) {
  53      $url->param('group', $groupid);
  54  }
  55  $PAGE->set_url($url);
  56  
  57  // Make sure that the user has permissions to manage groups.
  58  require_login($course);
  59  
  60  $context = context_course::instance($course->id);
  61  require_capability('moodle/course:managegroups', $context);
  62  
  63  $PAGE->requires->js('/group/clientlib.js', true);
  64  $PAGE->requires->js('/group/module.js', true);
  65  
  66  // Check for multiple/no group errors
  67  if (!$singlegroup) {
  68      switch($action) {
  69          case 'ajax_getmembersingroup':
  70          case 'showgroupsettingsform':
  71          case 'showaddmembersform':
  72          case 'updatemembers':
  73              throw new \moodle_exception('errorselectone', 'group', $returnurl);
  74      }
  75  }
  76  
  77  switch ($action) {
  78      case false: //OK, display form.
  79          break;
  80  
  81      case 'ajax_getmembersingroup':
  82          $roles = array();
  83  
  84          $userfieldsapi = \core_user\fields::for_identity($context)->with_userpic();
  85          [
  86              'selects' => $userfieldsselects,
  87              'joins' => $userfieldsjoin,
  88              'params' => $userfieldsparams
  89          ] = (array)$userfieldsapi->get_sql('u', true, '', '', false);
  90          $extrafields = $userfieldsapi->get_required_fields([\core_user\fields::PURPOSE_IDENTITY]);
  91          if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid,
  92                  'u.id, ' . $userfieldsselects, null, '', $userfieldsparams, $userfieldsjoin)) {
  93  
  94              $viewfullnames = has_capability('moodle/site:viewfullnames', $context);
  95  
  96              foreach($groupmemberroles as $roleid=>$roledata) {
  97                  $shortroledata = new stdClass();
  98                  $shortroledata->name = html_entity_decode($roledata->name, ENT_QUOTES, 'UTF-8');
  99                  $shortroledata->users = array();
 100                  foreach($roledata->users as $member) {
 101                      $shortmember = new stdClass();
 102                      $shortmember->id = $member->id;
 103                      $shortmember->name = fullname($member, $viewfullnames);
 104                      if ($extrafields) {
 105                          $extrafieldsdisplay = [];
 106                          foreach ($extrafields as $field) {
 107                              // No escaping here, handled client side in response to AJAX request.
 108                              $extrafieldsdisplay[] = $member->{$field};
 109                          }
 110                          $shortmember->name .= ' (' . implode(', ', $extrafieldsdisplay) . ')';
 111                      }
 112  
 113                      $shortroledata->users[] = $shortmember;
 114                  }
 115                  $roles[] = $shortroledata;
 116              }
 117          }
 118          echo json_encode($roles);
 119          die;  // Client side JavaScript takes it from here.
 120  
 121      case 'deletegroup':
 122          if (count($groupids) == 0) {
 123              throw new \moodle_exception('errorselectsome', 'group', $returnurl);
 124          }
 125          $groupidlist = implode(',', $groupids);
 126          redirect(new moodle_url('/group/delete.php', array('courseid'=>$courseid, 'groups'=>$groupidlist)));
 127          break;
 128  
 129      case 'showcreateorphangroupform':
 130          redirect(new moodle_url('/group/group.php', array('courseid'=>$courseid)));
 131          break;
 132  
 133      case 'showautocreategroupsform':
 134          redirect(new moodle_url('/group/autogroup.php', array('courseid'=>$courseid)));
 135          break;
 136  
 137      case 'showimportgroups':
 138          redirect(new moodle_url('/group/import.php', array('id'=>$courseid)));
 139          break;
 140  
 141      case 'showgroupsettingsform':
 142          redirect(new moodle_url('/group/group.php', array('courseid'=>$courseid, 'id'=>$groupids[0])));
 143          break;
 144  
 145      case 'updategroups': //Currently reloading.
 146          break;
 147  
 148      case 'removemembers':
 149          break;
 150  
 151      case 'showaddmembersform':
 152          redirect(new moodle_url('/group/members.php', array('group'=>$groupids[0])));
 153          break;
 154  
 155      case 'updatemembers': //Currently reloading.
 156          break;
 157  
 158      default: //ERROR.
 159          throw new \moodle_exception('unknowaction', '', $returnurl);
 160          break;
 161  }
 162  
 163  // Print the page and form
 164  $strgroups = get_string('groups');
 165  $strparticipants = get_string('participants');
 166  
 167  /// Print header
 168  $PAGE->set_title($strgroups);
 169  $PAGE->set_heading($course->fullname);
 170  $PAGE->set_pagelayout('standard');
 171  echo $OUTPUT->header();
 172  
 173  echo $OUTPUT->render_participants_tertiary_nav($course);
 174  echo $OUTPUT->heading(format_string($course->shortname, true, array('context' => $context)) .' '.$strgroups, 3);
 175  
 176  $groups = groups_get_all_groups($courseid);
 177  $selectedname = null;
 178  $preventgroupremoval = array();
 179  
 180  // Get list of groups to render.
 181  $groupoptions = array();
 182  if ($groups) {
 183      foreach ($groups as $group) {
 184          $selected = false;
 185          $usercount = $DB->count_records('groups_members', array('groupid' => $group->id));
 186          $groupname = format_string($group->name, true, ['context' => $context, 'escape' => false]) . ' (' . $usercount . ')';
 187          if (in_array($group->id, $groupids)) {
 188              $selected = true;
 189              if ($singlegroup) {
 190                  // Only keep selected name if there is one group selected.
 191                  $selectedname = $groupname;
 192              }
 193          }
 194          if (!empty($group->idnumber) && !has_capability('moodle/course:changeidnumber', $context)) {
 195              $preventgroupremoval[$group->id] = true;
 196          }
 197  
 198          $groupoptions[] = (object) [
 199              'value' => $group->id,
 200              'selected' => $selected,
 201              'text' => s($groupname)
 202          ];
 203      }
 204  }
 205  
 206  // Get list of group members to render if there is a single selected group.
 207  $members = array();
 208  if ($singlegroup) {
 209      $userfieldsapi = \core_user\fields::for_identity($context)->with_userpic();
 210      [
 211          'selects' => $userfieldsselects,
 212          'joins' => $userfieldsjoin,
 213          'params' => $userfieldsparams
 214      ] = (array)$userfieldsapi->get_sql('u', true, '', '', false);
 215      $extrafields = $userfieldsapi->get_required_fields([\core_user\fields::PURPOSE_IDENTITY]);
 216      if ($groupmemberroles = groups_get_members_by_role(reset($groupids), $courseid,
 217              'u.id, ' . $userfieldsselects, null, '', $userfieldsparams, $userfieldsjoin)) {
 218  
 219          $viewfullnames = has_capability('moodle/site:viewfullnames', $context);
 220  
 221          foreach ($groupmemberroles as $roleid => $roledata) {
 222              $users = array();
 223              foreach ($roledata->users as $member) {
 224                  $shortmember = new stdClass();
 225                  $shortmember->value = $member->id;
 226                  $shortmember->text = fullname($member, $viewfullnames);
 227                  if ($extrafields) {
 228                      $extrafieldsdisplay = [];
 229                      foreach ($extrafields as $field) {
 230                          $extrafieldsdisplay[] = s($member->{$field});
 231                      }
 232                      $shortmember->text .= ' (' . implode(', ', $extrafieldsdisplay) . ')';
 233                  }
 234  
 235                  $users[] = $shortmember;
 236              }
 237  
 238              $members[] = (object)[
 239                  'role' => html_entity_decode($roledata->name, ENT_QUOTES, 'UTF-8'),
 240                  'rolemembers' => $users
 241              ];
 242          }
 243      }
 244  }
 245  
 246  $disableaddedit = !$singlegroup;
 247  $disabledelete = !empty($groupids);
 248  $renderable = new \core_group\output\index_page($courseid, $groupoptions, $selectedname, $members, $disableaddedit, $disabledelete,
 249          $preventgroupremoval);
 250  $output = $PAGE->get_renderer('core_group');
 251  echo $output->render($renderable);
 252  
 253  echo $OUTPUT->footer();
 254  
 255  /**
 256   * Returns the first button action with the given prefix, taken from
 257   * POST or GET, otherwise returns false.
 258   * @see /lib/moodlelib.php function optional_param().
 259   * @param string $prefix 'act_' as in 'action'.
 260   * @return string The action without the prefix, or false if no action found.
 261   */
 262  function groups_param_action($prefix = 'act_') {
 263      $action = false;
 264  //($_SERVER['QUERY_STRING'] && preg_match("/$prefix(.+?)=(.+)/", $_SERVER['QUERY_STRING'], $matches)) { //b_(.*?)[&;]{0,1}/
 265  
 266      if ($_POST) {
 267          $form_vars = $_POST;
 268      }
 269      elseif ($_GET) {
 270          $form_vars = $_GET;
 271      }
 272      if ($form_vars) {
 273          foreach ($form_vars as $key => $value) {
 274              if (preg_match("/$prefix(.+)/", $key, $matches)) {
 275                  $action = $matches[1];
 276                  break;
 277              }
 278          }
 279      }
 280      if ($action && !preg_match('/^\w+$/', $action)) {
 281          $action = false;
 282          throw new \moodle_exception('unknowaction');
 283      }
 284      ///if (debugging()) echo 'Debug: '.$action;
 285      return $action;
 286  }