Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.
/group/ -> index.php (source)

Differences Between: [Versions 310 and 403] [Versions 311 and 403] [Versions 39 and 403] [Versions 400 and 403] [Versions 401 and 403] [Versions 402 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 = optional_param('action', false, PARAM_TEXT);
  32  
  33  // Support either single group= parameter, or array groups[].
  34  if ($groupid) {
  35      $groupids = array($groupid);
  36  } else {
  37      $groupids = optional_param_array('groups', array(), PARAM_INT);
  38  }
  39  $singlegroup = (count($groupids) == 1);
  40  
  41  $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid;
  42  
  43  // Get the course information so we can print the header and
  44  // check the course id is valid.
  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      case 'enablemessaging':
 159          set_groups_messaging($groupids, true);
 160          redirect($returnurl, get_string('messagingenabled', 'group', count($groupids)), null,
 161              \core\output\notification::NOTIFY_SUCCESS);
 162          break;
 163  
 164      case 'disablemessaging':
 165          set_groups_messaging($groupids, false);
 166          redirect($returnurl, get_string('messagingdisabled', 'group', count($groupids)), null,
 167              \core\output\notification::NOTIFY_SUCCESS);
 168          break;
 169  
 170      default: // ERROR.
 171          throw new \moodle_exception('unknowaction', '', $returnurl);
 172          break;
 173  }
 174  
 175  // Print the page and form.
 176  $strgroups = get_string('groups');
 177  $strparticipants = get_string('participants');
 178  
 179  // Print header.
 180  $PAGE->set_title($strgroups);
 181  $PAGE->set_heading($course->fullname);
 182  $PAGE->set_pagelayout('standard');
 183  echo $OUTPUT->header();
 184  
 185  echo $OUTPUT->render_participants_tertiary_nav($course);
 186  
 187  $groups = groups_get_all_groups($courseid);
 188  $selectedname = null;
 189  $preventgroupremoval = array();
 190  
 191  // Get list of groups to render.
 192  $groupoptions = array();
 193  if ($groups) {
 194      foreach ($groups as $group) {
 195          $selected = false;
 196          $usercount = $DB->count_records('groups_members', array('groupid' => $group->id));
 197          $groupname = format_string($group->name, true, ['context' => $context, 'escape' => false]) . ' (' . $usercount . ')';
 198          if (in_array($group->id, $groupids)) {
 199              $selected = true;
 200              if ($singlegroup) {
 201                  // Only keep selected name if there is one group selected.
 202                  $selectedname = $groupname;
 203              }
 204          }
 205          if (!empty($group->idnumber) && !has_capability('moodle/course:changeidnumber', $context)) {
 206              $preventgroupremoval[$group->id] = true;
 207          }
 208  
 209          $groupoptions[] = (object) [
 210              'value' => $group->id,
 211              'selected' => $selected,
 212              'text' => s($groupname)
 213          ];
 214      }
 215  }
 216  
 217  // Get list of group members to render if there is a single selected group.
 218  $members = array();
 219  if ($singlegroup) {
 220      $userfieldsapi = \core_user\fields::for_identity($context)->with_userpic();
 221      [
 222          'selects' => $userfieldsselects,
 223          'joins' => $userfieldsjoin,
 224          'params' => $userfieldsparams
 225      ] = (array)$userfieldsapi->get_sql('u', true, '', '', false);
 226      $extrafields = $userfieldsapi->get_required_fields([\core_user\fields::PURPOSE_IDENTITY]);
 227      if ($groupmemberroles = groups_get_members_by_role(reset($groupids), $courseid,
 228              'u.id, ' . $userfieldsselects, null, '', $userfieldsparams, $userfieldsjoin)) {
 229  
 230          $viewfullnames = has_capability('moodle/site:viewfullnames', $context);
 231  
 232          foreach ($groupmemberroles as $roleid => $roledata) {
 233              $users = array();
 234              foreach ($roledata->users as $member) {
 235                  $shortmember = new stdClass();
 236                  $shortmember->value = $member->id;
 237                  $shortmember->text = fullname($member, $viewfullnames);
 238                  if ($extrafields) {
 239                      $extrafieldsdisplay = [];
 240                      foreach ($extrafields as $field) {
 241                          $extrafieldsdisplay[] = s($member->{$field});
 242                      }
 243                      $shortmember->text .= ' (' . implode(', ', $extrafieldsdisplay) . ')';
 244                  }
 245  
 246                  $users[] = $shortmember;
 247              }
 248  
 249              $members[] = (object)[
 250                  'role' => html_entity_decode($roledata->name, ENT_QUOTES, 'UTF-8'),
 251                  'rolemembers' => $users
 252              ];
 253          }
 254      }
 255  }
 256  
 257  $disableaddedit = !$singlegroup;
 258  $disabledelete = !empty($groupids);
 259  $caneditmessaging = \core_message\api::can_create_group_conversation($USER->id, $context);
 260  
 261  $renderable = new \core_group\output\index_page($courseid, $groupoptions, $selectedname, $members, $disableaddedit, $disabledelete,
 262          $preventgroupremoval, $caneditmessaging);
 263  $output = $PAGE->get_renderer('core_group');
 264  echo $output->render($renderable);
 265  
 266  echo $OUTPUT->footer();