Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_groups.php

Zuletzt modifiziert: 02.04.2025, 15:01 - Dateigröße: 42.12 KiB


0001  <?php
0002  /**
0003  *
0004  * This file is part of the phpBB Forum Software package.
0005  *
0006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007  * @license GNU General Public License, version 2 (GPL-2.0)
0008  *
0009  * For full copyright and license information, please see
0010  * the docs/CREDITS.txt file.
0011  *
0012  */
0013   
0014  /**
0015  * @ignore
0016  */
0017  if (!defined('IN_PHPBB'))
0018  {
0019      exit;
0020  }
0021   
0022  class acp_groups
0023  {
0024      var $u_action;
0025   
0026      function main($id, $mode)
0027      {
0028          global $config, $db, $user, $auth, $template, $cache;
0029          global $phpbb_root_path, $phpbb_admin_path, $phpEx;
0030          global $request, $phpbb_container, $phpbb_dispatcher;
0031   
0032          /** @var \phpbb\language\language $language Language object */
0033          $language = $phpbb_container->get('language');
0034   
0035          $user->add_lang('acp/groups');
0036          $this->tpl_name = 'acp_groups';
0037          $this->page_title = 'ACP_GROUPS_MANAGE';
0038   
0039          $form_key = 'acp_groups';
0040          add_form_key($form_key);
0041   
0042          if ($mode == 'position')
0043          {
0044              $this->manage_position();
0045              return;
0046          }
0047   
0048          if (!function_exists('group_user_attributes'))
0049          {
0050              include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
0051          }
0052   
0053          // Check and set some common vars
0054          $action        = (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', ''));
0055          $group_id    = $request->variable('g', 0);
0056          $mark_ary    = $request->variable('mark', array(0));
0057          $name_ary    = $request->variable('usernames', '', true);
0058          $leader        = $request->variable('leader', 0);
0059          $default    = $request->variable('default', 0);
0060          $start        = $request->variable('start', 0);
0061          $update        = (isset($_POST['update'])) ? true : false;
0062   
0063          /** @var \phpbb\group\helper $group_helper */
0064          $group_helper = $phpbb_container->get('group_helper');
0065   
0066          // Clear some vars
0067          $group_row = array();
0068   
0069          // Grab basic data for group, if group_id is set and exists
0070          if ($group_id)
0071          {
0072              $sql = 'SELECT g.*, t.teampage_position AS group_teampage
0073                  FROM ' . GROUPS_TABLE . ' g
0074                  LEFT JOIN ' . TEAMPAGE_TABLE . ' t
0075                      ON (t.group_id = g.group_id)
0076                  WHERE g.group_id = ' . $group_id;
0077              $result = $db->sql_query($sql);
0078              $group_row = $db->sql_fetchrow($result);
0079              $db->sql_freeresult($result);
0080   
0081              if (!$group_row)
0082              {
0083                  trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0084              }
0085   
0086              // Check if the user is allowed to manage this group if set to founder only.
0087              if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage'])
0088              {
0089                  trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0090              }
0091          }
0092   
0093          // Which page?
0094          switch ($action)
0095          {
0096              case 'approve':
0097              case 'demote':
0098              case 'promote':
0099                  if (!check_form_key($form_key))
0100                  {
0101                      trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0102                  }
0103   
0104                  if (!$group_id)
0105                  {
0106                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0107                  }
0108   
0109                  // Approve, demote or promote
0110                  $group_name = $group_helper->get_name($group_row['group_name']);
0111                  $error = group_user_attributes($action, $group_id, $mark_ary, false, $group_name);
0112   
0113                  if (!$error)
0114                  {
0115                      switch ($action)
0116                      {
0117                          case 'demote':
0118                              $message = 'GROUP_MODS_DEMOTED';
0119                          break;
0120   
0121                          case 'promote':
0122                              $message = 'GROUP_MODS_PROMOTED';
0123                          break;
0124   
0125                          case 'approve':
0126                              $message = 'USERS_APPROVED';
0127                          break;
0128                      }
0129   
0130                      trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
0131                  }
0132                  else
0133                  {
0134                      trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
0135                  }
0136   
0137              break;
0138   
0139              case 'default':
0140                  if (!$group_id)
0141                  {
0142                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0143                  }
0144                  else if (empty($mark_ary))
0145                  {
0146                      trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
0147                  }
0148   
0149                  if (confirm_box(true))
0150                  {
0151                      $group_name = $group_helper->get_name($group_row['group_name']);
0152                      group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
0153                      trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
0154                  }
0155                  else
0156                  {
0157                      confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
0158                          'mark'        => $mark_ary,
0159                          'g'            => $group_id,
0160                          'i'            => $id,
0161                          'mode'        => $mode,
0162                          'action'    => $action))
0163                      );
0164                  }
0165              break;
0166   
0167              case 'set_default_on_all':
0168                  if (confirm_box(true))
0169                  {
0170                      $group_name = $group_helper->get_name($group_row['group_name']);
0171   
0172                      $start = 0;
0173   
0174                      do
0175                      {
0176                          $sql = 'SELECT user_id
0177                              FROM ' . USER_GROUP_TABLE . "
0178                              WHERE group_id = $group_id
0179                              ORDER BY user_id";
0180                          $result = $db->sql_query_limit($sql, 200, $start);
0181   
0182                          $mark_ary = array();
0183                          if ($row = $db->sql_fetchrow($result))
0184                          {
0185                              do
0186                              {
0187                                  $mark_ary[] = $row['user_id'];
0188                              }
0189                              while ($row = $db->sql_fetchrow($result));
0190   
0191                              group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
0192   
0193                              $start = (count($mark_ary) < 200) ? 0 : $start + 200;
0194                          }
0195                          else
0196                          {
0197                              $start = 0;
0198                          }
0199                          $db->sql_freeresult($result);
0200                      }
0201                      while ($start);
0202   
0203                      trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
0204                  }
0205                  else
0206                  {
0207                      confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
0208                          'mark'        => $mark_ary,
0209                          'g'            => $group_id,
0210                          'i'            => $id,
0211                          'mode'        => $mode,
0212                          'action'    => $action))
0213                      );
0214                  }
0215              break;
0216   
0217              case 'deleteusers':
0218                  if (empty($mark_ary))
0219                  {
0220                      trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
0221                  }
0222              case 'delete':
0223                  if (!$group_id)
0224                  {
0225                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0226                  }
0227                  else if ($action === 'delete' && $group_row['group_type'] == GROUP_SPECIAL)
0228                  {
0229                      send_status_line(403, 'Forbidden');
0230                      trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0231                  }
0232   
0233                  if (confirm_box(true))
0234                  {
0235                      $error = '';
0236   
0237                      switch ($action)
0238                      {
0239                          case 'delete':
0240                              if (!$auth->acl_get('a_groupdel'))
0241                              {
0242                                  send_status_line(403, 'Forbidden');
0243                                  trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0244                              }
0245   
0246                              $error = group_delete($group_id, $group_row['group_name']);
0247                          break;
0248   
0249                          case 'deleteusers':
0250                              $group_name = $group_helper->get_name($group_row['group_name']);
0251                              $error = group_user_del($group_id, $mark_ary, false, $group_name);
0252                          break;
0253                      }
0254   
0255                      $back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&amp;action=list&amp;g=' . $group_id;
0256   
0257                      if ($error)
0258                      {
0259                          trigger_error($user->lang[$error] . adm_back_link($back_link), E_USER_WARNING);
0260                      }
0261   
0262                      $message = ($action == 'delete') ? 'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
0263                      trigger_error($user->lang[$message] . adm_back_link($back_link));
0264                  }
0265                  else
0266                  {
0267                      confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
0268                          'mark'        => $mark_ary,
0269                          'g'            => $group_id,
0270                          'i'            => $id,
0271                          'mode'        => $mode,
0272                          'action'    => $action))
0273                      );
0274                  }
0275              break;
0276   
0277              case 'addusers':
0278                  if (!check_form_key($form_key))
0279                  {
0280                      trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0281                  }
0282   
0283                  if (!$group_id)
0284                  {
0285                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0286                  }
0287   
0288                  if (!$name_ary)
0289                  {
0290                      trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
0291                  }
0292   
0293                  $name_ary = array_unique(explode("\n", $name_ary));
0294                  $group_name = $group_helper->get_name($group_row['group_name']);
0295   
0296                  // Add user/s to group
0297                  if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
0298                  {
0299                      $display_message = $language->lang($error);
0300   
0301                      if ($error == 'GROUP_USERS_INVALID')
0302                      {
0303                          // Find which users don't exist
0304                          $actual_name_ary = $name_ary;
0305                          $actual_user_id_ary = [];
0306                          user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
0307   
0308                          $display_message = $language->lang('GROUP_USERS_INVALID', implode($language->lang('COMMA_SEPARATOR'), array_udiff($name_ary, $actual_name_ary, 'strcasecmp')));
0309                      }
0310   
0311                      trigger_error($display_message . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
0312                  }
0313   
0314                  $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
0315                  trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
0316              break;
0317   
0318              case 'edit':
0319              case 'add':
0320   
0321                  if (!function_exists('display_forums'))
0322                  {
0323                      include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
0324                  }
0325   
0326                  if ($action == 'edit' && !$group_id)
0327                  {
0328                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0329                  }
0330   
0331                  if ($action == 'add' && !$auth->acl_get('a_groupadd'))
0332                  {
0333                      send_status_line(403, 'Forbidden');
0334                      trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
0335                  }
0336   
0337                  $error = array();
0338                  $user->add_lang('ucp');
0339   
0340                  // Setup avatar data for later
0341                  $avatars_enabled = false;
0342                  $avatar_drivers = null;
0343                  $avatar_data = null;
0344                  $avatar_error = array();
0345   
0346                  /** @var \phpbb\avatar\manager $phpbb_avatar_manager */
0347                  $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
0348   
0349                  if ($config['allow_avatar'])
0350                  {
0351                      $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
0352   
0353                      // This is normalised data, without the group_ prefix
0354                      $avatar_data = \phpbb\avatar\manager::clean_row($group_row, 'group');
0355                      if (!isset($avatar_data['id']))
0356                      {
0357                          $avatar_data['id'] = 'g' . $group_id;
0358                      }
0359                  }
0360   
0361                  if ($request->is_set_post('avatar_delete'))
0362                  {
0363                      if (confirm_box(true))
0364                      {
0365                          $avatar_data['id'] = substr($avatar_data['id'], 1);
0366                          $phpbb_avatar_manager->handle_avatar_delete($db, $user, $avatar_data, GROUPS_TABLE, 'group_');
0367   
0368                          $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
0369                          trigger_error($user->lang[$message] . adm_back_link($this->u_action));
0370                      }
0371                      else
0372                      {
0373                          confirm_box(false, $user->lang('CONFIRM_AVATAR_DELETE'), build_hidden_fields(array(
0374                                  'avatar_delete'     => true,
0375                                  'i'                 => $id,
0376                                  'mode'              => $mode,
0377                                  'g'                    => $group_id,
0378                                  'action'            => $action))
0379                          );
0380                      }
0381                  }
0382   
0383                  // Did we submit?
0384                  if ($update)
0385                  {
0386                      if (!check_form_key($form_key))
0387                      {
0388                          trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
0389                      }
0390   
0391                      $group_name    = $request->variable('group_name', '', true);
0392                      $group_desc = $request->variable('group_desc', '', true);
0393                      $group_type    = $request->variable('group_type', GROUP_FREE);
0394   
0395                      $allow_desc_bbcode    = $request->variable('desc_parse_bbcode', false);
0396                      $allow_desc_urls    = $request->variable('desc_parse_urls', false);
0397                      $allow_desc_smilies    = $request->variable('desc_parse_smilies', false);
0398   
0399                      $submit_ary = [
0400                          'colour'            => $request->variable('group_colour', ''),
0401                          'rank'                => $request->variable('group_rank', 0),
0402                          'receive_pm'        => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
0403                          'legend'            => isset($_REQUEST['group_legend']) ? 1 : 0,
0404                          'teampage'            => isset($_REQUEST['group_teampage']) ? 1 : 0,
0405                          'message_limit'        => $request->variable('group_message_limit', 0),
0406                          'max_recipients'    => $request->variable('group_max_recipients', 0),
0407                          'founder_manage'    => 0,
0408                          'skip_auth'            => $request->variable('group_skip_auth', 0),
0409   
0410                          // Initialize avatar data
0411                          'avatar'            => $avatar_data['avatar'] ?? '',
0412                          'avatar_type'        => $avatar_data['avatar_type'] ?? '',
0413                          'avatar_height'        => $avatar_data['avatar_height'] ?? 0,
0414                          'avatar_width'        => $avatar_data['avatar_width'] ?? 0,
0415                      ];
0416   
0417                      if ($user->data['user_type'] == USER_FOUNDER)
0418                      {
0419                          $submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ? 1 : 0;
0420                      }
0421   
0422                      if ($config['allow_avatar'])
0423                      {
0424                          // Handle avatar
0425                          $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
0426   
0427                          if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
0428                          {
0429                              $driver = $phpbb_avatar_manager->get_driver($driver_name);
0430                              $result = $driver->process_form($request, $template, $user, $avatar_data, $avatar_error);
0431   
0432                              if ($result && empty($avatar_error))
0433                              {
0434                                  $result['avatar_type'] = $driver_name;
0435                                  $submit_ary = array_merge($submit_ary, $result);
0436                              }
0437                          }
0438                          else
0439                          {
0440                              $driver = $phpbb_avatar_manager->get_driver($avatar_data['avatar_type']);
0441                              if ($driver)
0442                              {
0443                                  $driver->delete($avatar_data);
0444                              }
0445   
0446                              // Removing the avatar
0447                              $submit_ary['avatar_type'] = '';
0448                              $submit_ary['avatar'] = '';
0449                              $submit_ary['avatar_width'] = 0;
0450                              $submit_ary['avatar_height'] = 0;
0451                          }
0452   
0453                          // Merge any avatar errors into the primary error array
0454                          $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
0455                      }
0456   
0457                      /*
0458                      * Validate the length of "Maximum number of allowed recipients per
0459                      * private message" setting. We use 16777215 as a maximum because it matches
0460                      * MySQL unsigned mediumint maximum value which is the lowest amongst DBMSes
0461                      * supported by phpBB3. Also validate the submitted colour value.
0462                      */
0463                      $validation_checks = array(
0464                          'max_recipients' => array('num', false, 0, 16777215),
0465                          'colour'    => array('hex_colour', true),
0466                      );
0467   
0468                      /**
0469                      * Request group data and operate on it
0470                      *
0471                      * @event core.acp_manage_group_request_data
0472                      * @var    string    action                Type of the action: add|edit
0473                      * @var    int        group_id            The group id
0474                      * @var    array    group_row            Array with new group data
0475                      * @var    array    error                Array of errors, if you add errors
0476                      *                            ensure to update the template variables
0477                      *                            S_ERROR and ERROR_MSG to display it
0478                      * @var    string    group_name            The group name
0479                      * @var    string    group_desc            The group description
0480                      * @var    int        group_type            The group type
0481                      * @var    bool    allow_desc_bbcode    Allow bbcode in group description: true|false
0482                      * @var    bool    allow_desc_urls        Allow urls in group description: true|false
0483                      * @var    bool    allow_desc_smilies    Allow smiles in group description: true|false
0484                      * @var    array    submit_ary            Array with new group data
0485                      * @var    array    validation_checks    Array with validation data
0486                      * @since 3.1.0-b5
0487                      */
0488                      $vars = array(
0489                          'action',
0490                          'group_id',
0491                          'group_row',
0492                          'error',
0493                          'group_name',
0494                          'group_desc',
0495                          'group_type',
0496                          'allow_desc_bbcode',
0497                          'allow_desc_urls',
0498                          'allow_desc_smilies',
0499                          'submit_ary',
0500                          'validation_checks',
0501                      );
0502                      extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_request_data', compact($vars)));
0503   
0504                      if ($validation_error = validate_data($submit_ary, $validation_checks))
0505                      {
0506                          // Replace "error" string with its real, localised form
0507                          $error = array_merge($error, $validation_error);
0508                      }
0509   
0510                      if (!count($error))
0511                      {
0512                          // Only set the rank, colour, etc. if it's changed or if we're adding a new
0513                          // group. This prevents existing group members being updated if no changes
0514                          // were made.
0515                          // However there are some attributes that need to be set everytime,
0516                          // otherwise the group gets removed from the feature.
0517                          $set_attributes = array('legend', 'teampage');
0518   
0519                          $group_attributes = array();
0520                          $test_variables = array(
0521                              'rank'            => 'int',
0522                              'colour'        => 'string',
0523                              'avatar'        => 'string',
0524                              'avatar_type'    => 'string',
0525                              'avatar_width'    => 'int',
0526                              'avatar_height'    => 'int',
0527                              'receive_pm'    => 'int',
0528                              'legend'        => 'int',
0529                              'teampage'        => 'int',
0530                              'message_limit'    => 'int',
0531                              'max_recipients'=> 'int',
0532                              'founder_manage'=> 'int',
0533                              'skip_auth'        => 'int',
0534                          );
0535   
0536                          /**
0537                          * Initialise data before we display the add/edit form
0538                          *
0539                          * @event core.acp_manage_group_initialise_data
0540                          * @var    string    action                Type of the action: add|edit
0541                          * @var    int        group_id            The group id
0542                          * @var    array    group_row            Array with new group data
0543                          * @var    array    error                Array of errors, if you add errors
0544                          *                            ensure to update the template variables
0545                          *                            S_ERROR and ERROR_MSG to display it
0546                          * @var    string    group_name            The group name
0547                          * @var    string    group_desc            The group description
0548                          * @var    int        group_type            The group type
0549                          * @var    bool    allow_desc_bbcode    Allow bbcode in group description: true|false
0550                          * @var    bool    allow_desc_urls        Allow urls in group description: true|false
0551                          * @var    bool    allow_desc_smilies    Allow smiles in group description: true|false
0552                          * @var    array    submit_ary            Array with new group data
0553                          * @var    array    test_variables        Array with variables for test
0554                          * @since 3.1.0-b5
0555                          */
0556                          $vars = array(
0557                              'action',
0558                              'group_id',
0559                              'group_row',
0560                              'error',
0561                              'group_name',
0562                              'group_desc',
0563                              'group_type',
0564                              'allow_desc_bbcode',
0565                              'allow_desc_urls',
0566                              'allow_desc_smilies',
0567                              'submit_ary',
0568                              'test_variables',
0569                          );
0570                          extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_initialise_data', compact($vars)));
0571   
0572                          foreach ($test_variables as $test => $type)
0573                          {
0574                              if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test] || isset($group_attributes['group_avatar']) && strpos($test, 'avatar') === 0 || in_array($test, $set_attributes)))
0575                              {
0576                                  settype($submit_ary[$test], $type);
0577                                  $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
0578                              }
0579                          }
0580   
0581                          if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
0582                          {
0583                              $group_perm_from = $request->variable('group_perm_from', 0);
0584   
0585                              // Copy permissions?
0586                              // If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred.
0587                              // We do not limit on one auth category because this can lead to incomplete permissions being tricky to fix for the admin, roles being assigned or added non-default permissions.
0588                              // Since the user only has the option to copy permissions from non leader managed groups this seems to be a good compromise.
0589                              if ($group_perm_from && $action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth'))
0590                              {
0591                                  $sql = 'SELECT group_founder_manage
0592                                      FROM ' . GROUPS_TABLE . '
0593                                      WHERE group_id = ' . $group_perm_from;
0594                                  $result = $db->sql_query($sql);
0595                                  $check_row = $db->sql_fetchrow($result);
0596                                  $db->sql_freeresult($result);
0597   
0598                                  // Check the group if non-founder
0599                                  if ($check_row && ($user->data['user_type'] == USER_FOUNDER || $check_row['group_founder_manage'] == 0))
0600                                  {
0601                                      // From the mysql documentation:
0602                                      // Prior to MySQL 4.0.14, the target table of the INSERT statement cannot appear in the FROM clause of the SELECT part of the query. This limitation is lifted in 4.0.14.
0603                                      // Due to this we stay on the safe side if we do the insertion "the manual way"
0604   
0605                                      // Copy permisisons from/to the acl groups table (only group_id gets changed)
0606                                      $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
0607                                          FROM ' . ACL_GROUPS_TABLE . '
0608                                          WHERE group_id = ' . $group_perm_from;
0609                                      $result = $db->sql_query($sql);
0610   
0611                                      $groups_sql_ary = array();
0612                                      while ($row = $db->sql_fetchrow($result))
0613                                      {
0614                                          $groups_sql_ary[] = array(
0615                                              'group_id'            => (int) $group_id,
0616                                              'forum_id'            => (int) $row['forum_id'],
0617                                              'auth_option_id'    => (int) $row['auth_option_id'],
0618                                              'auth_role_id'        => (int) $row['auth_role_id'],
0619                                              'auth_setting'        => (int) $row['auth_setting']
0620                                          );
0621                                      }
0622                                      $db->sql_freeresult($result);
0623   
0624                                      // Now insert the data
0625                                      $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);
0626   
0627                                      $auth->acl_clear_prefetch();
0628                                  }
0629                              }
0630   
0631                              $cache->destroy('sql', array(GROUPS_TABLE, TEAMPAGE_TABLE));
0632   
0633                              $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
0634                              trigger_error($user->lang[$message] . adm_back_link($this->u_action));
0635                          }
0636                      }
0637   
0638                      if (count($error))
0639                      {
0640                          $error = array_map(array(&$user, 'lang'), $error);
0641                          $group_rank = $submit_ary['rank'];
0642   
0643                          $group_desc_data = array(
0644                              'text'            => $group_desc,
0645                              'allow_bbcode'    => $allow_desc_bbcode,
0646                              'allow_smilies'    => $allow_desc_smilies,
0647                              'allow_urls'    => $allow_desc_urls
0648                          );
0649                      }
0650                  }
0651                  else if (!$group_id)
0652                  {
0653                      $group_name = $request->variable('group_name', '', true);
0654                      $group_desc_data = array(
0655                          'text'            => '',
0656                          'allow_bbcode'    => true,
0657                          'allow_smilies'    => true,
0658                          'allow_urls'    => true
0659                      );
0660                      $group_rank = 0;
0661                      $group_type = GROUP_OPEN;
0662                  }
0663                  else
0664                  {
0665                      $group_name = $group_row['group_name'];
0666                      $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
0667                      $group_type = $group_row['group_type'];
0668                      $group_rank = $group_row['group_rank'];
0669                  }
0670   
0671                  $sql = 'SELECT *
0672                      FROM ' . RANKS_TABLE . '
0673                      WHERE rank_special = 1
0674                      ORDER BY rank_title';
0675                  $result = $db->sql_query($sql);
0676   
0677                  $rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>';
0678   
0679                  while ($row = $db->sql_fetchrow($result))
0680                  {
0681                      $selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : '';
0682                      $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
0683                  }
0684                  $db->sql_freeresult($result);
0685   
0686                  $type_free        = ($group_type == GROUP_FREE) ? ' checked="checked"' : '';
0687                  $type_open        = ($group_type == GROUP_OPEN) ? ' checked="checked"' : '';
0688                  $type_closed    = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
0689                  $type_hidden    = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
0690   
0691                  // Load up stuff for avatars
0692                  if ($config['allow_avatar'])
0693                  {
0694                      $avatars_enabled = false;
0695                      $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $avatar_data['avatar_type']));
0696   
0697                      // Assign min and max values before generating avatar driver html
0698                      $template->assign_vars(array(
0699                              'AVATAR_MIN_WIDTH'        => $config['avatar_min_width'],
0700                              'AVATAR_MAX_WIDTH'        => $config['avatar_max_width'],
0701                              'AVATAR_MIN_HEIGHT'        => $config['avatar_min_height'],
0702                              'AVATAR_MAX_HEIGHT'        => $config['avatar_max_height'],
0703                      ));
0704   
0705                      foreach ($avatar_drivers as $current_driver)
0706                      {
0707                          $driver = $phpbb_avatar_manager->get_driver($current_driver);
0708   
0709                          $avatars_enabled = true;
0710                          $template->set_filenames(array(
0711                              'avatar' => $driver->get_acp_template_name(),
0712                          ));
0713   
0714                          if ($driver->prepare_form($request, $template, $user, $avatar_data, $avatar_error))
0715                          {
0716                              $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver);
0717                              $driver_upper = strtoupper($driver_name);
0718                              $template->assign_block_vars('avatar_drivers', array(
0719                                  'L_TITLE' => $user->lang($driver_upper . '_TITLE'),
0720                                  'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'),
0721   
0722                                  'DRIVER' => $driver_name,
0723                                  'SELECTED' => $current_driver == $selected_driver,
0724                                  'OUTPUT' => $template->assign_display('avatar'),
0725                              ));
0726                          }
0727                      }
0728                  }
0729   
0730                  $avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true);
0731   
0732                  if (isset($phpbb_avatar_manager) && !$update)
0733                  {
0734                      // Merge any avatar errors into the primary error array
0735                      $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
0736                  }
0737   
0738                  $back_link = $request->variable('back_link', '');
0739   
0740                  switch ($back_link)
0741                  {
0742                      case 'acp_users_groups':
0743                          $u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=groups&amp;u=' . $request->variable('u', 0));
0744                      break;
0745   
0746                      default:
0747                          $u_back = $this->u_action;
0748                      break;
0749                  }
0750   
0751                  $template->assign_vars(array(
0752                      'S_EDIT'            => true,
0753                      'S_ADD_GROUP'        => ($action == 'add') ? true : false,
0754                      'S_GROUP_PERM'        => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false,
0755                      'S_INCLUDE_SWATCH'    => true,
0756                      'S_ERROR'            => (count($error)) ? true : false,
0757                      'S_SPECIAL_GROUP'    => ($group_type == GROUP_SPECIAL) ? true : false,
0758                      'S_USER_FOUNDER'    => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
0759                      'S_AVATARS_ENABLED'        => ($config['allow_avatar'] && $avatars_enabled),
0760   
0761                      'ERROR_MSG'                => (count($error)) ? implode('<br />', $error) : '',
0762                      'GROUP_NAME'            => $group_helper->get_name($group_name),
0763                      'GROUP_INTERNAL_NAME'    => $group_name,
0764                      'GROUP_DESC'            => $group_desc_data['text'],
0765                      'GROUP_RECEIVE_PM'        => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
0766                      'GROUP_FOUNDER_MANAGE'    => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '',
0767                      'GROUP_LEGEND'            => (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '',
0768                      'GROUP_TEAMPAGE'        => (isset($group_row['group_teampage']) && $group_row['group_teampage']) ? ' checked="checked"' : '',
0769                      'GROUP_MESSAGE_LIMIT'    => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
0770                      'GROUP_MAX_RECIPIENTS'    => (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0,
0771                      'GROUP_COLOUR'            => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
0772                      'GROUP_SKIP_AUTH'        => (!empty($group_row['group_skip_auth'])) ? ' checked="checked"' : '',
0773   
0774                      'S_DESC_BBCODE_CHECKED'    => $group_desc_data['allow_bbcode'],
0775                      'S_DESC_URLS_CHECKED'    => $group_desc_data['allow_urls'],
0776                      'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
0777   
0778                      'S_RANK_OPTIONS'        => $rank_options,
0779                      'S_GROUP_OPTIONS'        => group_select_options(false, false, (($user->data['user_type'] == USER_FOUNDER) ? false : 0)),
0780                      'AVATAR'                => empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar,
0781                      'AVATAR_MAX_FILESIZE'    => $config['avatar_filesize'],
0782                      'AVATAR_WIDTH'            => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '',
0783                      'AVATAR_HEIGHT'            => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '',
0784   
0785                      'GROUP_TYPE_FREE'        => GROUP_FREE,
0786                      'GROUP_TYPE_OPEN'        => GROUP_OPEN,
0787                      'GROUP_TYPE_CLOSED'        => GROUP_CLOSED,
0788                      'GROUP_TYPE_HIDDEN'        => GROUP_HIDDEN,
0789                      'GROUP_TYPE_SPECIAL'    => GROUP_SPECIAL,
0790   
0791                      'GROUP_FREE'        => $type_free,
0792                      'GROUP_OPEN'        => $type_open,
0793                      'GROUP_CLOSED'        => $type_closed,
0794                      'GROUP_HIDDEN'        => $type_hidden,
0795   
0796                      'U_BACK'            => $u_back,
0797                      'U_ACTION'            => "{$this->u_action}&amp;action=$action&amp;g=$group_id",
0798                      'L_AVATAR_EXPLAIN'    => phpbb_avatar_explanation_string(),
0799                  ));
0800   
0801                  /**
0802                  * Modify group template data before we display the form
0803                  *
0804                  * @event core.acp_manage_group_display_form
0805                  * @var    string    action                Type of the action: add|edit
0806                  * @var    bool    update                Do we display the form only
0807                  *                            or did the user press submit
0808                  * @var    int        group_id            The group id
0809                  * @var    array    group_row            Array with new group data
0810                  * @var    string    group_name            The group name
0811                  * @var    int        group_type            The group type
0812                  * @var    array    group_desc_data        The group description data
0813                  * @var    string    group_rank            The group rank
0814                  * @var    string    rank_options        The rank options
0815                  * @var    array    error                Array of errors, if you add errors
0816                  *                            ensure to update the template variables
0817                  *                            S_ERROR and ERROR_MSG to display it
0818                  * @since 3.1.0-b5
0819                  */
0820                  $vars = array(
0821                      'action',
0822                      'update',
0823                      'group_id',
0824                      'group_row',
0825                      'group_desc_data',
0826                      'group_name',
0827                      'group_type',
0828                      'group_rank',
0829                      'rank_options',
0830                      'error',
0831                  );
0832                  extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_display_form', compact($vars)));
0833   
0834                  return;
0835              break;
0836   
0837              case 'list':
0838   
0839                  if (!$group_id)
0840                  {
0841                      trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
0842                  }
0843   
0844                  /* @var $pagination \phpbb\pagination */
0845                  $pagination = $phpbb_container->get('pagination');
0846                  $this->page_title = 'GROUP_MEMBERS';
0847   
0848                  // Grab the leaders - always, on every page...
0849                  $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_colour, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
0850                      FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
0851                      WHERE ug.group_id = $group_id
0852                          AND u.user_id = ug.user_id
0853                          AND ug.group_leader = 1
0854                      ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
0855                  $result = $db->sql_query($sql);
0856   
0857                  while ($row = $db->sql_fetchrow($result))
0858                  {
0859                      $template->assign_block_vars('leader', array(
0860                          'U_USER_EDIT'        => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
0861   
0862                          'USERNAME'            => $row['username'],
0863                          'USERNAME_COLOUR'    => $row['user_colour'],
0864                          'S_GROUP_DEFAULT'    => ($row['group_id'] == $group_id) ? true : false,
0865                          'JOINED'            => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
0866                          'USER_POSTS'        => $row['user_posts'],
0867                          'USER_ID'            => $row['user_id'],
0868                      ));
0869                  }
0870                  $db->sql_freeresult($result);
0871   
0872                  // Total number of group members (non-leaders)
0873                  $sql = 'SELECT COUNT(user_id) AS total_members
0874                      FROM ' . USER_GROUP_TABLE . "
0875                      WHERE group_id = $group_id
0876                          AND group_leader = 0";
0877                  $result = $db->sql_query($sql);
0878                  $total_members = (int) $db->sql_fetchfield('total_members');
0879                  $db->sql_freeresult($result);
0880   
0881                  $s_action_options = '';
0882                  $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
0883   
0884                  foreach ($options as $option => $lang)
0885                  {
0886                      $s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
0887                  }
0888   
0889                  $base_url = $this->u_action . "&amp;action=$action&amp;g=$group_id";
0890                  $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_members, $config['topics_per_page'], $start);
0891   
0892                  $template->assign_vars(array(
0893                      'S_LIST'            => true,
0894                      'S_GROUP_SPECIAL'    => ($group_row['group_type'] == GROUP_SPECIAL) ? true : false,
0895                      'S_ACTION_OPTIONS'    => $s_action_options,
0896   
0897                      'GROUP_NAME'    => $group_helper->get_name($group_row['group_name']),
0898   
0899                      'U_ACTION'            => $this->u_action . "&amp;g=$group_id",
0900                      'U_BACK'            => $this->u_action,
0901                      'U_FIND_USERNAME'    => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=list&amp;field=usernames'),
0902                      'U_DEFAULT_ALL'        => "{$this->u_action}&amp;action=set_default_on_all&amp;g=$group_id",
0903                  ));
0904   
0905                  // Grab the members
0906                  $sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_colour, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
0907                      FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
0908                      WHERE ug.group_id = $group_id
0909                          AND u.user_id = ug.user_id
0910                          AND ug.group_leader = 0
0911                      ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
0912                  $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
0913   
0914                  $pending = false;
0915   
0916                  while ($row = $db->sql_fetchrow($result))
0917                  {
0918                      if ($row['user_pending'] && !$pending)
0919                      {
0920                          $template->assign_block_vars('member', array(
0921                              'S_PENDING'        => true)
0922                          );
0923   
0924                          $pending = true;
0925                      }
0926   
0927                      $template->assign_block_vars('member', array(
0928                          'U_USER_EDIT'        => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
0929   
0930                          'USERNAME'            => $row['username'],
0931                          'USERNAME_COLOUR'    => $row['user_colour'],
0932                          'S_GROUP_DEFAULT'    => ($row['group_id'] == $group_id) ? true : false,
0933                          'JOINED'            => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
0934                          'USER_POSTS'        => $row['user_posts'],
0935                          'USER_ID'            => $row['user_id'])
0936                      );
0937                  }
0938                  $db->sql_freeresult($result);
0939   
0940                  return;
0941              break;
0942          }
0943   
0944          $template->assign_vars(array(
0945              'U_ACTION'        => $this->u_action,
0946              'S_GROUP_ADD'    => ($auth->acl_get('a_groupadd')) ? true : false)
0947          );
0948   
0949          // Get us all the groups
0950          $sql = 'SELECT g.group_id, g.group_name, g.group_type, g.group_colour
0951              FROM ' . GROUPS_TABLE . ' g
0952              ORDER BY g.group_type ASC, g.group_name';
0953          $result = $db->sql_query($sql);
0954   
0955          $lookup = $cached_group_data = array();
0956          while ($row = $db->sql_fetchrow($result))
0957          {
0958              $type = ($row['group_type'] == GROUP_SPECIAL) ? 'special' : 'normal';
0959   
0960              // used to determine what type a group is
0961              $lookup[$row['group_id']] = $type;
0962   
0963              // used for easy access to the data within a group
0964              $cached_group_data[$type][$row['group_id']] = $row;
0965              $cached_group_data[$type][$row['group_id']]['total_members'] = 0;
0966              $cached_group_data[$type][$row['group_id']]['pending_members'] = 0;
0967          }
0968          $db->sql_freeresult($result);
0969   
0970          // How many people are in which group?
0971          $sql = 'SELECT COUNT(ug.user_id) AS total_members, SUM(ug.user_pending) AS pending_members, ug.group_id
0972              FROM ' . USER_GROUP_TABLE . ' ug
0973              WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . '
0974              GROUP BY ug.group_id';
0975          $result = $db->sql_query($sql);
0976   
0977          while ($row = $db->sql_fetchrow($result))
0978          {
0979              $type = $lookup[$row['group_id']];
0980              $cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
0981              $cached_group_data[$type][$row['group_id']]['pending_members'] = $row['pending_members'];
0982          }
0983          $db->sql_freeresult($result);
0984   
0985          // The order is... normal, then special
0986          ksort($cached_group_data);
0987   
0988          foreach ($cached_group_data as $type => $row_ary)
0989          {
0990              if ($type == 'special')
0991              {
0992                  $template->assign_block_vars('groups', array(
0993                      'S_SPECIAL'            => true)
0994                  );
0995              }
0996   
0997              foreach ($row_ary as $group_id => $row)
0998              {
0999                  $group_name = (!empty($user->lang['G_' . $row['group_name']]))? $user->lang['G_' . $row['group_name']] : $row['group_name'];
1000   
1001                  $template->assign_block_vars('groups', array(
1002                      'U_LIST'        => "{$this->u_action}&amp;action=list&amp;g=$group_id",
1003                      'U_EDIT'        => "{$this->u_action}&amp;action=edit&amp;g=$group_id",
1004                      'U_DELETE'        => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&amp;action=delete&amp;g=$group_id" : '',
1005   
1006                      'S_GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
1007   
1008                      'GROUP_NAME'    => $group_name,
1009                      'GROUP_COLOR'    => $row['group_colour'],
1010                      'TOTAL_MEMBERS'    => $row['total_members'],
1011                      'PENDING_MEMBERS' => $row['pending_members']
1012                  ));
1013              }
1014          }
1015      }
1016   
1017      public function manage_position()
1018      {
1019          global $config, $db, $template, $user, $request, $phpbb_container;
1020   
1021          $this->tpl_name = 'acp_groups_position';
1022          $this->page_title = 'ACP_GROUPS_POSITION';
1023   
1024          $field = $request->variable('field', '');
1025          $action = $request->variable('action', '');
1026          $group_id = $request->variable('g', 0);
1027          $teampage_id = $request->variable('t', 0);
1028          $category_id = $request->variable('c', 0);
1029   
1030          /** @var \phpbb\group\helper $group_helper */
1031          $group_helper = $phpbb_container->get('group_helper');
1032   
1033          if ($field && !in_array($field, array('legend', 'teampage')))
1034          {
1035              // Invalid mode
1036              trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING);
1037          }
1038          else if ($field && in_array($field, array('legend', 'teampage')))
1039          {
1040              /* @var $group_position \phpbb\groupposition\groupposition_interface */
1041              $group_position = $phpbb_container->get('groupposition.' . $field);
1042          }
1043   
1044          if ($field == 'teampage')
1045          {
1046              try
1047              {
1048                  switch ($action)
1049                  {
1050                      case 'add':
1051                          $group_position->add_group_teampage($group_id, $category_id);
1052                      break;
1053   
1054                      case 'add_category':
1055                          $group_position->add_category_teampage($request->variable('category_name', '', true));
1056                      break;
1057   
1058                      case 'delete':
1059                          $group_position->delete_teampage($teampage_id);
1060                      break;
1061   
1062                      case 'move_up':
1063                          $group_position->move_up_teampage($teampage_id);
1064                      break;
1065   
1066                      case 'move_down':
1067                          $group_position->move_down_teampage($teampage_id);
1068                      break;
1069                  }
1070              }
1071              catch (\phpbb\groupposition\exception $exception)
1072              {
1073                  trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING);
1074              }
1075          }
1076          else if ($field == 'legend')
1077          {
1078              try
1079              {
1080                  switch ($action)
1081                  {
1082                      case 'add':
1083                          $group_position->add_group($group_id);
1084                      break;
1085   
1086                      case 'delete':
1087                          $group_position->delete_group($group_id);
1088                      break;
1089   
1090                      case 'move_up':
1091                          $group_position->move_up($group_id);
1092                      break;
1093   
1094                      case 'move_down':
1095                          $group_position->move_down($group_id);
1096                      break;
1097                  }
1098              }
1099              catch (\phpbb\groupposition\exception $exception)
1100              {
1101                  trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING);
1102              }
1103          }
1104          else
1105          {
1106              switch ($action)
1107              {
1108                  case 'set_config_teampage':
1109                      $config->set('teampage_forums', $request->variable('teampage_forums', 0));
1110                      $config->set('teampage_memberships', $request->variable('teampage_memberships', 0));
1111                      trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
1112                  break;
1113   
1114                  case 'set_config_legend':
1115                      $config->set('legend_sort_groupname', $request->variable('legend_sort_groupname', 0));
1116                      trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
1117                  break;
1118              }
1119          }
1120   
1121          if (($action == 'move_up' || $action == 'move_down') && $request->is_ajax())
1122          {
1123              $json_response = new \phpbb\json_response;
1124              $json_response->send(array('success' => true));
1125          }
1126   
1127          $sql = 'SELECT group_id, group_name, group_colour, group_type, group_legend
1128              FROM ' . GROUPS_TABLE . '
1129              ORDER BY group_legend ASC, group_type DESC, group_name ASC';
1130          $result = $db->sql_query($sql);
1131   
1132          while ($row = $db->sql_fetchrow($result))
1133          {
1134              $group_name = $group_helper->get_name($row['group_name']);
1135              if ($row['group_legend'])
1136              {
1137                  $template->assign_block_vars('legend', array(
1138                      'GROUP_NAME'    => $group_name,
1139                      'GROUP_COLOUR'    => ($row['group_colour']) ? '#' . $row['group_colour'] : '',
1140                      'GROUP_TYPE'    => $user->lang[\phpbb\groupposition\legend::group_type_language($row['group_type'])],
1141   
1142                      'U_MOVE_DOWN'    => "{$this->u_action}&amp;field=legend&amp;action=move_down&amp;g=" . $row['group_id'],
1143                      'U_MOVE_UP'        => "{$this->u_action}&amp;field=legend&amp;action=move_up&amp;g=" . $row['group_id'],
1144                      'U_DELETE'        => "{$this->u_action}&amp;field=legend&amp;action=delete&amp;g=" . $row['group_id'],
1145                  ));
1146              }
1147              else
1148              {
1149                  $template->assign_block_vars('add_legend', array(
1150                      'GROUP_ID'        => (int) $row['group_id'],
1151                      'GROUP_NAME'    => $group_name,
1152                      'GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL),
1153                  ));
1154              }
1155          }
1156          $db->sql_freeresult($result);
1157   
1158          $category_url_param = (($category_id) ? '&amp;c=' . $category_id : '');
1159   
1160          $sql = 'SELECT t.*, g.group_name, g.group_colour, g.group_type
1161              FROM ' . TEAMPAGE_TABLE . ' t
1162              LEFT JOIN ' . GROUPS_TABLE . ' g
1163                  ON (t.group_id = g.group_id)
1164              WHERE t.teampage_parent = ' . $category_id . '
1165                  OR t.teampage_id = ' . $category_id . '
1166              ORDER BY t.teampage_position ASC';
1167          $result = $db->sql_query($sql);
1168   
1169          while ($row = $db->sql_fetchrow($result))
1170          {
1171              if ($row['teampage_id'] == $category_id)
1172              {
1173                  $template->assign_vars(array(
1174                      'CURRENT_CATEGORY_NAME'        => $row['teampage_name'],
1175                  ));
1176                  continue;
1177              }
1178   
1179              if ($row['group_id'])
1180              {
1181                  $group_name = $group_helper->get_name($row['group_name']);
1182                  $group_type = $user->lang[\phpbb\groupposition\teampage::group_type_language($row['group_type'])];
1183              }
1184              else
1185              {
1186                  $group_name = $row['teampage_name'];
1187                  $group_type = '';
1188              }
1189   
1190              $template->assign_block_vars('teampage', array(
1191                  'GROUP_NAME'    => $group_name,
1192                  'GROUP_COLOUR'    => ($row['group_colour']) ? '#' . $row['group_colour'] : '',
1193                  'GROUP_TYPE'    => $group_type,
1194   
1195                  'U_CATEGORY'    => (!$row['group_id']) ? "{$this->u_action}&amp;c=" . $row['teampage_id'] : '',
1196                  'U_MOVE_DOWN'    => "{$this->u_action}&amp;field=teampage&amp;action=move_down{$category_url_param}&amp;t=" . $row['teampage_id'],
1197                  'U_MOVE_UP'        => "{$this->u_action}&amp;field=teampage&amp;action=move_up{$category_url_param}&amp;t=" . $row['teampage_id'],
1198                  'U_DELETE'        => "{$this->u_action}&amp;field=teampage&amp;action=delete{$category_url_param}&amp;t=" . $row['teampage_id'],
1199              ));
1200          }
1201          $db->sql_freeresult($result);
1202   
1203          $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type
1204              FROM ' . GROUPS_TABLE . ' g
1205              LEFT JOIN ' . TEAMPAGE_TABLE . ' t
1206                  ON (t.group_id = g.group_id)
1207              WHERE t.teampage_id IS NULL
1208              ORDER BY g.group_type DESC, g.group_name ASC';
1209          $result = $db->sql_query($sql);
1210   
1211          while ($row = $db->sql_fetchrow($result))
1212          {
1213              $group_name = $group_helper->get_name($row['group_name']);
1214              $template->assign_block_vars('add_teampage', array(
1215                  'GROUP_ID'        => (int) $row['group_id'],
1216                  'GROUP_NAME'    => $group_name,
1217                  'GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL),
1218              ));
1219          }
1220          $db->sql_freeresult($result);
1221   
1222          $template->assign_vars(array(
1223              'U_ACTION'                    => $this->u_action,
1224              'U_ACTION_LEGEND'            => $this->u_action . '&amp;field=legend',
1225              'U_ACTION_TEAMPAGE'            => $this->u_action . '&amp;field=teampage' . $category_url_param,
1226              'U_ACTION_TEAMPAGE_CAT'        => $this->u_action . '&amp;field=teampage_cat',
1227   
1228              'S_TEAMPAGE_CATEGORY'        => $category_id,
1229              'DISPLAY_FORUMS'            => ($config['teampage_forums']) ? true : false,
1230              'DISPLAY_MEMBERSHIPS'        => $config['teampage_memberships'],
1231              'LEGEND_SORT_GROUPNAME'        => ($config['legend_sort_groupname']) ? true : false,
1232          ));
1233      }
1234  }
1235