Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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