Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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