Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 687
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
acp_groups
0.00% covered (danger)
0.00%
0 / 685
0.00% covered (danger)
0.00%
0 / 2
35156
0.00% covered (danger)
0.00%
0 / 1
 main
0.00% covered (danger)
0.00%
0 / 554
0.00% covered (danger)
0.00%
0 / 1
23256
 manage_position
0.00% covered (danger)
0.00%
0 / 131
0.00% covered (danger)
0.00%
0 / 1
1260
1<?php
2/**
3*
4* This file is part of the phpBB Forum Software package.
5*
6* @copyright (c) phpBB Limited <https://www.phpbb.com>
7* @license GNU General Public License, version 2 (GPL-2.0)
8*
9* For full copyright and license information, please see
10* the docs/CREDITS.txt file.
11*
12*/
13
14/**
15* @ignore
16*/
17if (!defined('IN_PHPBB'))
18{
19    exit;
20}
21
22class acp_groups
23{
24    var $u_action;
25
26    function main($id, $mode)
27    {
28        global $config, $db, $user, $auth, $template, $cache;
29        global $phpbb_root_path, $phpbb_admin_path, $phpEx;
30        global $request, $phpbb_container, $phpbb_dispatcher;
31
32        /** @var \phpbb\language\language $language Language object */
33        $language = $phpbb_container->get('language');
34
35        $user->add_lang('acp/groups');
36        $this->tpl_name = 'acp_groups';
37        $this->page_title = 'ACP_GROUPS_MANAGE';
38
39        $form_key = 'acp_groups';
40        add_form_key($form_key);
41
42        if ($mode == 'position')
43        {
44            $this->manage_position();
45            return;
46        }
47
48        if (!function_exists('group_user_attributes'))
49        {
50            include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
51        }
52
53        // Check and set some common vars
54        $action        = (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', ''));
55        $group_id    = $request->variable('g', 0);
56        $mark_ary    = $request->variable('mark', array(0));
57        $name_ary    = $request->variable('usernames', '', true);
58        $leader        = $request->variable('leader', 0);
59        $default    = $request->variable('default', 0);
60        $start        = $request->variable('start', 0);
61        $update        = (isset($_POST['update'])) ? true : false;
62
63        /** @var \phpbb\group\helper $group_helper */
64        $group_helper = $phpbb_container->get('group_helper');
65
66        // Clear some vars
67        $group_row = array();
68
69        // Grab basic data for group, if group_id is set and exists
70        if ($group_id)
71        {
72            $sql = 'SELECT g.*, t.teampage_position AS group_teampage
73                FROM ' . GROUPS_TABLE . ' g
74                LEFT JOIN ' . TEAMPAGE_TABLE . ' t
75                    ON (t.group_id = g.group_id)
76                WHERE g.group_id = ' . $group_id;
77            $result = $db->sql_query($sql);
78            $group_row = $db->sql_fetchrow($result);
79            $db->sql_freeresult($result);
80
81            if (!$group_row)
82            {
83                trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
84            }
85
86            // Check if the user is allowed to manage this group if set to founder only.
87            if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage'])
88            {
89                trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
90            }
91        }
92
93        // Which page?
94        switch ($action)
95        {
96            case 'approve':
97            case 'demote':
98            case 'promote':
99                if (!check_form_key($form_key))
100                {
101                    trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
102                }
103
104                if (!$group_id)
105                {
106                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
107                }
108
109                // Approve, demote or promote
110                $group_name = $group_helper->get_name($group_row['group_name']);
111                $error = group_user_attributes($action, $group_id, $mark_ary, false, $group_name);
112
113                if (!$error)
114                {
115                    switch ($action)
116                    {
117                        case 'demote':
118                            $message = 'GROUP_MODS_DEMOTED';
119                        break;
120
121                        case 'promote':
122                            $message = 'GROUP_MODS_PROMOTED';
123                        break;
124
125                        case 'approve':
126                            $message = 'USERS_APPROVED';
127                        break;
128                    }
129
130                    trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
131                }
132                else
133                {
134                    trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
135                }
136
137            break;
138
139            case 'default':
140                if (!$group_id)
141                {
142                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
143                }
144                else if (empty($mark_ary))
145                {
146                    trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
147                }
148
149                if (confirm_box(true))
150                {
151                    $group_name = $group_helper->get_name($group_row['group_name']);
152                    group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
153                    trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
154                }
155                else
156                {
157                    confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
158                        'mark'        => $mark_ary,
159                        'g'            => $group_id,
160                        'i'            => $id,
161                        'mode'        => $mode,
162                        'action'    => $action))
163                    );
164                }
165            break;
166
167            case 'set_default_on_all':
168                if (confirm_box(true))
169                {
170                    $group_name = $group_helper->get_name($group_row['group_name']);
171
172                    $start = 0;
173
174                    do
175                    {
176                        $sql = 'SELECT user_id
177                            FROM ' . USER_GROUP_TABLE . "
178                            WHERE group_id = $group_id
179                            ORDER BY user_id";
180                        $result = $db->sql_query_limit($sql, 200, $start);
181
182                        $mark_ary = array();
183                        if ($row = $db->sql_fetchrow($result))
184                        {
185                            do
186                            {
187                                $mark_ary[] = $row['user_id'];
188                            }
189                            while ($row = $db->sql_fetchrow($result));
190
191                            group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
192
193                            $start = (count($mark_ary) < 200) ? 0 : $start + 200;
194                        }
195                        else
196                        {
197                            $start = 0;
198                        }
199                        $db->sql_freeresult($result);
200                    }
201                    while ($start);
202
203                    trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
204                }
205                else
206                {
207                    confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
208                        'mark'        => $mark_ary,
209                        'g'            => $group_id,
210                        'i'            => $id,
211                        'mode'        => $mode,
212                        'action'    => $action))
213                    );
214                }
215            break;
216
217            case 'deleteusers':
218                if (empty($mark_ary))
219                {
220                    trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
221                }
222            case 'delete':
223                if (!$group_id)
224                {
225                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
226                }
227                else if ($action === 'delete' && $group_row['group_type'] == GROUP_SPECIAL)
228                {
229                    send_status_line(403, 'Forbidden');
230                    trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
231                }
232
233                if (confirm_box(true))
234                {
235                    $error = '';
236
237                    switch ($action)
238                    {
239                        case 'delete':
240                            if (!$auth->acl_get('a_groupdel'))
241                            {
242                                send_status_line(403, 'Forbidden');
243                                trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
244                            }
245
246                            $error = group_delete($group_id, $group_row['group_name']);
247                        break;
248
249                        case 'deleteusers':
250                            $group_name = $group_helper->get_name($group_row['group_name']);
251                            $error = group_user_del($group_id, $mark_ary, false, $group_name);
252                        break;
253                    }
254
255                    $back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&amp;action=list&amp;g=' . $group_id;
256
257                    if ($error)
258                    {
259                        trigger_error($user->lang[$error] . adm_back_link($back_link), E_USER_WARNING);
260                    }
261
262                    $message = ($action == 'delete') ? 'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
263                    trigger_error($user->lang[$message] . adm_back_link($back_link));
264                }
265                else
266                {
267                    confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
268                        'mark'        => $mark_ary,
269                        'g'            => $group_id,
270                        'i'            => $id,
271                        'mode'        => $mode,
272                        'action'    => $action))
273                    );
274                }
275            break;
276
277            case 'addusers':
278                if (!check_form_key($form_key))
279                {
280                    trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
281                }
282
283                if (!$group_id)
284                {
285                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
286                }
287
288                if (!$name_ary)
289                {
290                    trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
291                }
292
293                $name_ary = array_unique(explode("\n", $name_ary));
294                $group_name = $group_helper->get_name($group_row['group_name']);
295
296                // Add user/s to group
297                if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
298                {
299                    $display_message = $language->lang($error);
300
301                    if ($error == 'GROUP_USERS_INVALID')
302                    {
303                        // Find which users don't exist
304                        $actual_name_ary = $name_ary;
305                        $actual_user_id_ary = [];
306                        user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
307
308                        $display_message = $language->lang('GROUP_USERS_INVALID', implode($language->lang('COMMA_SEPARATOR'), array_udiff($name_ary, $actual_name_ary, 'strcasecmp')));
309                    }
310
311                    trigger_error($display_message . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
312                }
313
314                $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
315                trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
316            break;
317
318            case 'edit':
319            case 'add':
320
321                if (!function_exists('display_forums'))
322                {
323                    include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
324                }
325
326                if ($action == 'edit' && !$group_id)
327                {
328                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
329                }
330
331                if ($action == 'add' && !$auth->acl_get('a_groupadd'))
332                {
333                    send_status_line(403, 'Forbidden');
334                    trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
335                }
336
337                $error = array();
338                $user->add_lang('ucp');
339
340                // Setup avatar data for later
341                $avatars_enabled = false;
342                $avatar_drivers = null;
343                $avatar_data = null;
344                $avatar_error = array();
345
346                /** @var \phpbb\avatar\manager $phpbb_avatar_manager */
347                $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
348
349                if ($config['allow_avatar'])
350                {
351                    $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
352
353                    // This is normalised data, without the group_ prefix
354                    $avatar_data = \phpbb\avatar\manager::clean_row($group_row, 'group');
355                    if (!isset($avatar_data['id']))
356                    {
357                        $avatar_data['id'] = 'g' . $group_id;
358                    }
359                }
360
361                if ($request->is_set_post('avatar_delete'))
362                {
363                    if (confirm_box(true))
364                    {
365                        $avatar_data['id'] = substr($avatar_data['id'], 1);
366                        $phpbb_avatar_manager->handle_avatar_delete($db, $user, $avatar_data, GROUPS_TABLE, 'group_');
367
368                        $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
369                        trigger_error($user->lang[$message] . adm_back_link($this->u_action));
370                    }
371                    else
372                    {
373                        confirm_box(false, $user->lang('CONFIRM_AVATAR_DELETE'), build_hidden_fields(array(
374                                'avatar_delete'     => true,
375                                'i'                 => $id,
376                                'mode'              => $mode,
377                                'g'                    => $group_id,
378                                'action'            => $action))
379                        );
380                    }
381                }
382
383                // Did we submit?
384                if ($update)
385                {
386                    if (!check_form_key($form_key))
387                    {
388                        trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
389                    }
390
391                    $group_name    = $request->variable('group_name', '', true);
392                    $group_desc = $request->variable('group_desc', '', true);
393                    $group_type    = $request->variable('group_type', GROUP_FREE);
394
395                    $allow_desc_bbcode    = $request->variable('desc_parse_bbcode', false);
396                    $allow_desc_urls    = $request->variable('desc_parse_urls', false);
397                    $allow_desc_smilies    = $request->variable('desc_parse_smilies', false);
398
399                    $submit_ary = array(
400                        'colour'            => $request->variable('group_colour', ''),
401                        'rank'                => $request->variable('group_rank', 0),
402                        'receive_pm'        => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
403                        'legend'            => isset($_REQUEST['group_legend']) ? 1 : 0,
404                        'teampage'            => isset($_REQUEST['group_teampage']) ? 1 : 0,
405                        'message_limit'        => $request->variable('group_message_limit', 0),
406                        'max_recipients'    => $request->variable('group_max_recipients', 0),
407                        'founder_manage'    => 0,
408                        'skip_auth'            => $request->variable('group_skip_auth', 0),
409                    );
410
411                    if ($user->data['user_type'] == USER_FOUNDER)
412                    {
413                        $submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ? 1 : 0;
414                    }
415
416                    if ($config['allow_avatar'])
417                    {
418                        // Handle avatar
419                        $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
420
421                        if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
422                        {
423                            $driver = $phpbb_avatar_manager->get_driver($driver_name);
424                            $result = $driver->process_form($request, $template, $user, $avatar_data, $avatar_error);
425
426                            if ($result && empty($avatar_error))
427                            {
428                                $result['avatar_type'] = $driver_name;
429                                $submit_ary = array_merge($submit_ary, $result);
430                            }
431                        }
432                        else
433                        {
434                            $driver = $phpbb_avatar_manager->get_driver($avatar_data['avatar_type']);
435                            if ($driver)
436                            {
437                                $driver->delete($avatar_data);
438                            }
439
440                            // Removing the avatar
441                            $submit_ary['avatar_type'] = '';
442                            $submit_ary['avatar'] = '';
443                            $submit_ary['avatar_width'] = 0;
444                            $submit_ary['avatar_height'] = 0;
445                        }
446
447                        // Merge any avatar errors into the primary error array
448                        $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
449                    }
450
451                    /*
452                    * Validate the length of "Maximum number of allowed recipients per
453                    * private message" setting. We use 16777215 as a maximum because it matches
454                    * MySQL unsigned mediumint maximum value which is the lowest amongst DBMSes
455                    * supported by phpBB3. Also validate the submitted colour value.
456                    */
457                    $validation_checks = array(
458                        'max_recipients' => array('num', false, 0, 16777215),
459                        'colour'    => array('hex_colour', true),
460                    );
461
462                    /**
463                    * Request group data and operate on it
464                    *
465                    * @event core.acp_manage_group_request_data
466                    * @var    string    action                Type of the action: add|edit
467                    * @var    int        group_id            The group id
468                    * @var    array    group_row            Array with new group data
469                    * @var    array    error                Array of errors, if you add errors
470                    *                            ensure to update the template variables
471                    *                            S_ERROR and ERROR_MSG to display it
472                    * @var    string    group_name            The group name
473                    * @var    string    group_desc            The group description
474                    * @var    int        group_type            The group type
475                    * @var    bool    allow_desc_bbcode    Allow bbcode in group description: true|false
476                    * @var    bool    allow_desc_urls        Allow urls in group description: true|false
477                    * @var    bool    allow_desc_smilies    Allow smiles in group description: true|false
478                    * @var    array    submit_ary            Array with new group data
479                    * @var    array    validation_checks    Array with validation data
480                    * @since 3.1.0-b5
481                    */
482                    $vars = array(
483                        'action',
484                        'group_id',
485                        'group_row',
486                        'error',
487                        'group_name',
488                        'group_desc',
489                        'group_type',
490                        'allow_desc_bbcode',
491                        'allow_desc_urls',
492                        'allow_desc_smilies',
493                        'submit_ary',
494                        'validation_checks',
495                    );
496                    extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_request_data', compact($vars)));
497
498                    if ($validation_error = validate_data($submit_ary, $validation_checks))
499                    {
500                        // Replace "error" string with its real, localised form
501                        $error = array_merge($error, $validation_error);
502                    }
503
504                    if (!count($error))
505                    {
506                        // Only set the rank, colour, etc. if it's changed or if we're adding a new
507                        // group. This prevents existing group members being updated if no changes
508                        // were made.
509                        // However there are some attributes that need to be set everytime,
510                        // otherwise the group gets removed from the feature.
511                        $set_attributes = array('legend', 'teampage');
512
513                        $group_attributes = array();
514                        $test_variables = array(
515                            'rank'            => 'int',
516                            'colour'        => 'string',
517                            'avatar'        => 'string',
518                            'avatar_type'    => 'string',
519                            'avatar_width'    => 'int',
520                            'avatar_height'    => 'int',
521                            'receive_pm'    => 'int',
522                            'legend'        => 'int',
523                            'teampage'        => 'int',
524                            'message_limit'    => 'int',
525                            'max_recipients'=> 'int',
526                            'founder_manage'=> 'int',
527                            'skip_auth'        => 'int',
528                        );
529
530                        /**
531                        * Initialise data before we display the add/edit form
532                        *
533                        * @event core.acp_manage_group_initialise_data
534                        * @var    string    action                Type of the action: add|edit
535                        * @var    int        group_id            The group id
536                        * @var    array    group_row            Array with new group data
537                        * @var    array    error                Array of errors, if you add errors
538                        *                            ensure to update the template variables
539                        *                            S_ERROR and ERROR_MSG to display it
540                        * @var    string    group_name            The group name
541                        * @var    string    group_desc            The group description
542                        * @var    int        group_type            The group type
543                        * @var    bool    allow_desc_bbcode    Allow bbcode in group description: true|false
544                        * @var    bool    allow_desc_urls        Allow urls in group description: true|false
545                        * @var    bool    allow_desc_smilies    Allow smiles in group description: true|false
546                        * @var    array    submit_ary            Array with new group data
547                        * @var    array    test_variables        Array with variables for test
548                        * @since 3.1.0-b5
549                        */
550                        $vars = array(
551                            'action',
552                            'group_id',
553                            'group_row',
554                            'error',
555                            'group_name',
556                            'group_desc',
557                            'group_type',
558                            'allow_desc_bbcode',
559                            'allow_desc_urls',
560                            'allow_desc_smilies',
561                            'submit_ary',
562                            'test_variables',
563                        );
564                        extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_initialise_data', compact($vars)));
565
566                        foreach ($test_variables as $test => $type)
567                        {
568                            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)))
569                            {
570                                settype($submit_ary[$test], $type);
571                                $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
572                            }
573                        }
574
575                        if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
576                        {
577                            $group_perm_from = $request->variable('group_perm_from', 0);
578
579                            // Copy permissions?
580                            // If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred.
581                            // 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.
582                            // Since the user only has the option to copy permissions from non leader managed groups this seems to be a good compromise.
583                            if ($group_perm_from && $action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth'))
584                            {
585                                $sql = 'SELECT group_founder_manage
586                                    FROM ' . GROUPS_TABLE . '
587                                    WHERE group_id = ' . $group_perm_from;
588                                $result = $db->sql_query($sql);
589                                $check_row = $db->sql_fetchrow($result);
590                                $db->sql_freeresult($result);
591
592                                // Check the group if non-founder
593                                if ($check_row && ($user->data['user_type'] == USER_FOUNDER || $check_row['group_founder_manage'] == 0))
594                                {
595                                    // From the mysql documentation:
596                                    // 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.
597                                    // Due to this we stay on the safe side if we do the insertion "the manual way"
598
599                                    // Copy permisisons from/to the acl groups table (only group_id gets changed)
600                                    $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
601                                        FROM ' . ACL_GROUPS_TABLE . '
602                                        WHERE group_id = ' . $group_perm_from;
603                                    $result = $db->sql_query($sql);
604
605                                    $groups_sql_ary = array();
606                                    while ($row = $db->sql_fetchrow($result))
607                                    {
608                                        $groups_sql_ary[] = array(
609                                            'group_id'            => (int) $group_id,
610                                            'forum_id'            => (int) $row['forum_id'],
611                                            'auth_option_id'    => (int) $row['auth_option_id'],
612                                            'auth_role_id'        => (int) $row['auth_role_id'],
613                                            'auth_setting'        => (int) $row['auth_setting']
614                                        );
615                                    }
616                                    $db->sql_freeresult($result);
617
618                                    // Now insert the data
619                                    $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);
620
621                                    $auth->acl_clear_prefetch();
622                                }
623                            }
624
625                            $cache->destroy('sql', array(GROUPS_TABLE, TEAMPAGE_TABLE));
626
627                            $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
628                            trigger_error($user->lang[$message] . adm_back_link($this->u_action));
629                        }
630                    }
631
632                    if (count($error))
633                    {
634                        $error = array_map(array(&$user, 'lang'), $error);
635                        $group_rank = $submit_ary['rank'];
636
637                        $group_desc_data = array(
638                            'text'            => $group_desc,
639                            'allow_bbcode'    => $allow_desc_bbcode,
640                            'allow_smilies'    => $allow_desc_smilies,
641                            'allow_urls'    => $allow_desc_urls
642                        );
643                    }
644                }
645                else if (!$group_id)
646                {
647                    $group_name = $request->variable('group_name', '', true);
648                    $group_desc_data = array(
649                        'text'            => '',
650                        'allow_bbcode'    => true,
651                        'allow_smilies'    => true,
652                        'allow_urls'    => true
653                    );
654                    $group_rank = 0;
655                    $group_type = GROUP_OPEN;
656                }
657                else
658                {
659                    $group_name = $group_row['group_name'];
660                    $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
661                    $group_type = $group_row['group_type'];
662                    $group_rank = $group_row['group_rank'];
663                }
664
665                $sql = 'SELECT *
666                    FROM ' . RANKS_TABLE . '
667                    WHERE rank_special = 1
668                    ORDER BY rank_title';
669                $result = $db->sql_query($sql);
670
671                $rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>';
672
673                while ($row = $db->sql_fetchrow($result))
674                {
675                    $selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : '';
676                    $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
677                }
678                $db->sql_freeresult($result);
679
680                $type_free        = ($group_type == GROUP_FREE) ? ' checked="checked"' : '';
681                $type_open        = ($group_type == GROUP_OPEN) ? ' checked="checked"' : '';
682                $type_closed    = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
683                $type_hidden    = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
684
685                // Load up stuff for avatars
686                if ($config['allow_avatar'])
687                {
688                    $avatars_enabled = false;
689                    $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $avatar_data['avatar_type']));
690
691                    // Assign min and max values before generating avatar driver html
692                    $template->assign_vars(array(
693                            'AVATAR_MIN_WIDTH'        => $config['avatar_min_width'],
694                            'AVATAR_MAX_WIDTH'        => $config['avatar_max_width'],
695                            'AVATAR_MIN_HEIGHT'        => $config['avatar_min_height'],
696                            'AVATAR_MAX_HEIGHT'        => $config['avatar_max_height'],
697                    ));
698
699                    foreach ($avatar_drivers as $current_driver)
700                    {
701                        $driver = $phpbb_avatar_manager->get_driver($current_driver);
702
703                        $avatars_enabled = true;
704                        $template->set_filenames(array(
705                            'avatar' => $driver->get_acp_template_name(),
706                        ));
707
708                        if ($driver->prepare_form($request, $template, $user, $avatar_data, $avatar_error))
709                        {
710                            $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver);
711                            $driver_upper = strtoupper($driver_name);
712                            $template->assign_block_vars('avatar_drivers', array(
713                                'L_TITLE' => $user->lang($driver_upper . '_TITLE'),
714                                'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'),
715
716                                'DRIVER' => $driver_name,
717                                'SELECTED' => $current_driver == $selected_driver,
718                                'OUTPUT' => $template->assign_display('avatar'),
719                            ));
720                        }
721                    }
722                }
723
724                if (isset($phpbb_avatar_manager) && !$update)
725                {
726                    // Merge any avatar errors into the primary error array
727                    $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
728                }
729
730                $back_link = $request->variable('back_link', '');
731
732                switch ($back_link)
733                {
734                    case 'acp_users_groups':
735                        $u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=groups&amp;u=' . $request->variable('u', 0));
736                    break;
737
738                    default:
739                        $u_back = $this->u_action;
740                    break;
741                }
742
743                /** @var \phpbb\avatar\helper $avatar_helper */
744                $avatar_helper = $phpbb_container->get('avatar.helper');
745
746                $group_avatar = $avatar_helper->get_group_avatar($group_row, 'GROUP_AVATAR', true);
747                $template->assign_vars($avatar_helper->get_template_vars($group_avatar));
748
749                $template->assign_vars(array(
750                    'S_EDIT'            => true,
751                    'S_ADD_GROUP'        => ($action == 'add') ? true : false,
752                    'S_GROUP_PERM'        => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false,
753                    'S_INCLUDE_SWATCH'    => true,
754                    'S_ERROR'            => (count($error)) ? true : false,
755                    'S_SPECIAL_GROUP'    => ($group_type == GROUP_SPECIAL) ? true : false,
756                    'S_USER_FOUNDER'    => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
757                    'S_AVATARS_ENABLED'        => ($config['allow_avatar'] && $avatars_enabled),
758
759                    'ERROR_MSG'                => (count($error)) ? implode('<br />', $error) : '',
760                    'GROUP_NAME'            => $group_helper->get_name($group_name),
761                    'GROUP_INTERNAL_NAME'    => $group_name,
762                    'GROUP_DESC'            => $group_desc_data['text'],
763                    'GROUP_RECEIVE_PM'        => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
764                    'GROUP_FOUNDER_MANAGE'    => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '',
765                    'GROUP_LEGEND'            => (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '',
766                    'GROUP_TEAMPAGE'        => (isset($group_row['group_teampage']) && $group_row['group_teampage']) ? ' checked="checked"' : '',
767                    'GROUP_MESSAGE_LIMIT'    => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
768                    'GROUP_MAX_RECIPIENTS'    => (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0,
769                    'GROUP_COLOUR'            => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
770                    'GROUP_SKIP_AUTH'        => (!empty($group_row['group_skip_auth'])) ? ' checked="checked"' : '',
771
772                    'S_DESC_BBCODE_CHECKED'    => $group_desc_data['allow_bbcode'],
773                    'S_DESC_URLS_CHECKED'    => $group_desc_data['allow_urls'],
774                    'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
775
776                    'S_RANK_OPTIONS'        => $rank_options,
777                    'S_GROUP_OPTIONS'        => group_select_options(false, false, (($user->data['user_type'] == USER_FOUNDER) ? false : 0)),
778                    'AVATAR_MAX_FILESIZE'    => $config['avatar_filesize'],
779
780                    'GROUP_TYPE_FREE'        => GROUP_FREE,
781                    'GROUP_TYPE_OPEN'        => GROUP_OPEN,
782                    'GROUP_TYPE_CLOSED'        => GROUP_CLOSED,
783                    'GROUP_TYPE_HIDDEN'        => GROUP_HIDDEN,
784                    'GROUP_TYPE_SPECIAL'    => GROUP_SPECIAL,
785
786                    'GROUP_FREE'        => $type_free,
787                    'GROUP_OPEN'        => $type_open,
788                    'GROUP_CLOSED'        => $type_closed,
789                    'GROUP_HIDDEN'        => $type_hidden,
790
791                    'U_BACK'            => $u_back,
792                    'U_ACTION'            => "{$this->u_action}&amp;action=$action&amp;g=$group_id",
793                    'L_AVATAR_EXPLAIN'    => phpbb_avatar_explanation_string(),
794                ));
795
796                /**
797                * Modify group template data before we display the form
798                *
799                * @event core.acp_manage_group_display_form
800                * @var    string    action                Type of the action: add|edit
801                * @var    bool    update                Do we display the form only
802                *                            or did the user press submit
803                * @var    int        group_id            The group id
804                * @var    array    group_row            Array with new group data
805                * @var    string    group_name            The group name
806                * @var    int        group_type            The group type
807                * @var    array    group_desc_data        The group description data
808                * @var    string    group_rank            The group rank
809                * @var    string    rank_options        The rank options
810                * @var    array    error                Array of errors, if you add errors
811                *                            ensure to update the template variables
812                *                            S_ERROR and ERROR_MSG to display it
813                * @since 3.1.0-b5
814                */
815                $vars = array(
816                    'action',
817                    'update',
818                    'group_id',
819                    'group_row',
820                    'group_desc_data',
821                    'group_name',
822                    'group_type',
823                    'group_rank',
824                    'rank_options',
825                    'error',
826                );
827                extract($phpbb_dispatcher->trigger_event('core.acp_manage_group_display_form', compact($vars)));
828
829                return;
830            break;
831
832            case 'list':
833
834                if (!$group_id)
835                {
836                    trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
837                }
838
839                /* @var $pagination \phpbb\pagination */
840                $pagination = $phpbb_container->get('pagination');
841                $this->page_title = 'GROUP_MEMBERS';
842
843                // Grab the leaders - always, on every page...
844                $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
845                    FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
846                    WHERE ug.group_id = $group_id
847                        AND u.user_id = ug.user_id
848                        AND ug.group_leader = 1
849                    ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
850                $result = $db->sql_query($sql);
851
852                while ($row = $db->sql_fetchrow($result))
853                {
854                    $template->assign_block_vars('leader', array(
855                        'U_USER_EDIT'        => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
856
857                        'USERNAME'            => $row['username'],
858                        'USERNAME_COLOUR'    => $row['user_colour'],
859                        'S_GROUP_DEFAULT'    => ($row['group_id'] == $group_id) ? true : false,
860                        'JOINED'            => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
861                        'USER_POSTS'        => $row['user_posts'],
862                        'USER_ID'            => $row['user_id'],
863                    ));
864                }
865                $db->sql_freeresult($result);
866
867                // Total number of group members (non-leaders)
868                $sql = 'SELECT COUNT(user_id) AS total_members
869                    FROM ' . USER_GROUP_TABLE . "
870                    WHERE group_id = $group_id
871                        AND group_leader = 0";
872                $result = $db->sql_query($sql);
873                $total_members = (int) $db->sql_fetchfield('total_members');
874                $db->sql_freeresult($result);
875
876                $s_action_options = '';
877                $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
878
879                foreach ($options as $option => $lang)
880                {
881                    $s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
882                }
883
884                $base_url = $this->u_action . "&amp;action=$action&amp;g=$group_id";
885                $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_members, $config['topics_per_page'], $start);
886
887                $template->assign_vars(array(
888                    'S_LIST'            => true,
889                    'S_GROUP_SPECIAL'    => ($group_row['group_type'] == GROUP_SPECIAL) ? true : false,
890                    'S_ACTION_OPTIONS'    => $s_action_options,
891
892                    'GROUP_NAME'    => $group_helper->get_name($group_row['group_name']),
893
894                    'U_ACTION'            => $this->u_action . "&amp;g=$group_id",
895                    'U_BACK'            => $this->u_action,
896                    'U_FIND_USERNAME'    => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=list&amp;field=usernames'),
897                    'U_DEFAULT_ALL'        => "{$this->u_action}&amp;action=set_default_on_all&amp;g=$group_id",
898                ));
899
900                // Grab the members
901                $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
902                    FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
903                    WHERE ug.group_id = $group_id
904                        AND u.user_id = ug.user_id
905                        AND ug.group_leader = 0
906                    ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
907                $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
908
909                $pending = false;
910
911                while ($row = $db->sql_fetchrow($result))
912                {
913                    if ($row['user_pending'] && !$pending)
914                    {
915                        $template->assign_block_vars('member', array(
916                            'S_PENDING'        => true)
917                        );
918
919                        $pending = true;
920                    }
921
922                    $template->assign_block_vars('member', array(
923                        'U_USER_EDIT'        => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
924
925                        'USERNAME'            => $row['username'],
926                        'USERNAME_COLOUR'    => $row['user_colour'],
927                        'S_GROUP_DEFAULT'    => ($row['group_id'] == $group_id) ? true : false,
928                        'JOINED'            => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
929                        'USER_POSTS'        => $row['user_posts'],
930                        'USER_ID'            => $row['user_id'])
931                    );
932                }
933                $db->sql_freeresult($result);
934
935                return;
936            break;
937        }
938
939        $template->assign_vars(array(
940            'U_ACTION'        => $this->u_action,
941            'S_GROUP_ADD'    => ($auth->acl_get('a_groupadd')) ? true : false)
942        );
943
944        // Get us all the groups
945        $sql = 'SELECT g.group_id, g.group_name, g.group_type, g.group_colour
946            FROM ' . GROUPS_TABLE . ' g
947            ORDER BY g.group_type ASC, g.group_name';
948        $result = $db->sql_query($sql);
949
950        $lookup = $cached_group_data = array();
951        while ($row = $db->sql_fetchrow($result))
952        {
953            $type = ($row['group_type'] == GROUP_SPECIAL) ? 'special' : 'normal';
954
955            // used to determine what type a group is
956            $lookup[$row['group_id']] = $type;
957
958            // used for easy access to the data within a group
959            $cached_group_data[$type][$row['group_id']] = $row;
960            $cached_group_data[$type][$row['group_id']]['total_members'] = 0;
961            $cached_group_data[$type][$row['group_id']]['pending_members'] = 0;
962        }
963        $db->sql_freeresult($result);
964
965        // How many people are in which group?
966        $sql = 'SELECT COUNT(ug.user_id) AS total_members, SUM(ug.user_pending) AS pending_members, ug.group_id
967            FROM ' . USER_GROUP_TABLE . ' ug
968            WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . '
969            GROUP BY ug.group_id';
970        $result = $db->sql_query($sql);
971
972        while ($row = $db->sql_fetchrow($result))
973        {
974            $type = $lookup[$row['group_id']];
975            $cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
976            $cached_group_data[$type][$row['group_id']]['pending_members'] = $row['pending_members'];
977        }
978        $db->sql_freeresult($result);
979
980        // The order is... normal, then special
981        ksort($cached_group_data);
982
983        foreach ($cached_group_data as $type => $row_ary)
984        {
985            if ($type == 'special')
986            {
987                $template->assign_block_vars('groups', array(
988                    'S_SPECIAL'            => true)
989                );
990            }
991
992            foreach ($row_ary as $group_id => $row)
993            {
994                $group_name = (!empty($user->lang['G_' . $row['group_name']]))? $user->lang['G_' . $row['group_name']] : $row['group_name'];
995
996                $template->assign_block_vars('groups', array(
997                    'U_LIST'        => "{$this->u_action}&amp;action=list&amp;g=$group_id",
998                    'U_EDIT'        => "{$this->u_action}&amp;action=edit&amp;g=$group_id",
999                    'U_DELETE'        => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&amp;action=delete&amp;g=$group_id" : '',
1000
1001                    'S_GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
1002
1003                    'GROUP_NAME'    => $group_name,
1004                    'GROUP_COLOR'    => $row['group_colour'],
1005                    'TOTAL_MEMBERS'    => $row['total_members'],
1006                    'PENDING_MEMBERS' => $row['pending_members']
1007                ));
1008            }
1009        }
1010    }
1011
1012    public function manage_position()
1013    {
1014        global $config, $db, $template, $user, $request, $phpbb_container;
1015
1016        $this->tpl_name = 'acp_groups_position';
1017        $this->page_title = 'ACP_GROUPS_POSITION';
1018
1019        $field = $request->variable('field', '');
1020        $action = $request->variable('action', '');
1021        $group_id = $request->variable('g', 0);
1022        $teampage_id = $request->variable('t', 0);
1023        $category_id = $request->variable('c', 0);
1024
1025        /** @var \phpbb\group\helper $group_helper */
1026        $group_helper = $phpbb_container->get('group_helper');
1027
1028        if ($field && !in_array($field, array('legend', 'teampage')))
1029        {
1030            // Invalid mode
1031            trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING);
1032        }
1033        else if ($field && in_array($field, array('legend', 'teampage')))
1034        {
1035            /* @var $group_position \phpbb\groupposition\groupposition_interface */
1036            $group_position = $phpbb_container->get('groupposition.' . $field);
1037        }
1038
1039        if ($field == 'teampage')
1040        {
1041            try
1042            {
1043                switch ($action)
1044                {
1045                    case 'add':
1046                        $group_position->add_group_teampage($group_id, $category_id);
1047                    break;
1048
1049                    case 'add_category':
1050                        $group_position->add_category_teampage($request->variable('category_name', '', true));
1051                    break;
1052
1053                    case 'delete':
1054                        $group_position->delete_teampage($teampage_id);
1055                    break;
1056
1057                    case 'move_up':
1058                        $group_position->move_up_teampage($teampage_id);
1059                    break;
1060
1061                    case 'move_down':
1062                        $group_position->move_down_teampage($teampage_id);
1063                    break;
1064                }
1065            }
1066            catch (\phpbb\groupposition\exception $exception)
1067            {
1068                trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING);
1069            }
1070        }
1071        else if ($field == 'legend')
1072        {
1073            try
1074            {
1075                switch ($action)
1076                {
1077                    case 'add':
1078                        $group_position->add_group($group_id);
1079                    break;
1080
1081                    case 'delete':
1082                        $group_position->delete_group($group_id);
1083                    break;
1084
1085                    case 'move_up':
1086                        $group_position->move_up($group_id);
1087                    break;
1088
1089                    case 'move_down':
1090                        $group_position->move_down($group_id);
1091                    break;
1092                }
1093            }
1094            catch (\phpbb\groupposition\exception $exception)
1095            {
1096                trigger_error($user->lang($exception->getMessage()) . adm_back_link($this->u_action), E_USER_WARNING);
1097            }
1098        }
1099        else
1100        {
1101            switch ($action)
1102            {
1103                case 'set_config_teampage':
1104                    $config->set('teampage_forums', $request->variable('teampage_forums', 0));
1105                    $config->set('teampage_memberships', $request->variable('teampage_memberships', 0));
1106                    trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
1107                break;
1108
1109                case 'set_config_legend':
1110                    $config->set('legend_sort_groupname', $request->variable('legend_sort_groupname', 0));
1111                    trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
1112                break;
1113            }
1114        }
1115
1116        if (($action == 'move_up' || $action == 'move_down') && $request->is_ajax())
1117        {
1118            $json_response = new \phpbb\json_response;
1119            $json_response->send(array('success' => true));
1120        }
1121
1122        $sql = 'SELECT group_id, group_name, group_colour, group_type, group_legend
1123            FROM ' . GROUPS_TABLE . '
1124            ORDER BY group_legend ASC, group_type DESC, group_name ASC';
1125        $result = $db->sql_query($sql);
1126
1127        while ($row = $db->sql_fetchrow($result))
1128        {
1129            $group_name = $group_helper->get_name($row['group_name']);
1130            if ($row['group_legend'])
1131            {
1132                $template->assign_block_vars('legend', array(
1133                    'GROUP_NAME'    => $group_name,
1134                    'GROUP_COLOUR'    => ($row['group_colour']) ? '#' . $row['group_colour'] : '',
1135                    'GROUP_TYPE'    => $user->lang[\phpbb\groupposition\legend::group_type_language($row['group_type'])],
1136
1137                    'U_MOVE_DOWN'    => "{$this->u_action}&amp;field=legend&amp;action=move_down&amp;g=" . $row['group_id'],
1138                    'U_MOVE_UP'        => "{$this->u_action}&amp;field=legend&amp;action=move_up&amp;g=" . $row['group_id'],
1139                    'U_DELETE'        => "{$this->u_action}&amp;field=legend&amp;action=delete&amp;g=" . $row['group_id'],
1140                ));
1141            }
1142            else
1143            {
1144                $template->assign_block_vars('add_legend', array(
1145                    'GROUP_ID'        => (int) $row['group_id'],
1146                    'GROUP_NAME'    => $group_name,
1147                    'GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL),
1148                ));
1149            }
1150        }
1151        $db->sql_freeresult($result);
1152
1153        $category_url_param = (($category_id) ? '&amp;c=' . $category_id : '');
1154
1155        $sql = 'SELECT t.*, g.group_name, g.group_colour, g.group_type
1156            FROM ' . TEAMPAGE_TABLE . ' t
1157            LEFT JOIN ' . GROUPS_TABLE . ' g
1158                ON (t.group_id = g.group_id)
1159            WHERE t.teampage_parent = ' . $category_id . '
1160                OR t.teampage_id = ' . $category_id . '
1161            ORDER BY t.teampage_position ASC';
1162        $result = $db->sql_query($sql);
1163
1164        while ($row = $db->sql_fetchrow($result))
1165        {
1166            if ($row['teampage_id'] == $category_id)
1167            {
1168                $template->assign_vars(array(
1169                    'CURRENT_CATEGORY_NAME'        => $row['teampage_name'],
1170                ));
1171                continue;
1172            }
1173
1174            if ($row['group_id'])
1175            {
1176                $group_name = $group_helper->get_name($row['group_name']);
1177                $group_type = $user->lang[\phpbb\groupposition\teampage::group_type_language($row['group_type'])];
1178            }
1179            else
1180            {
1181                $group_name = $row['teampage_name'];
1182                $group_type = '';
1183            }
1184
1185            $template->assign_block_vars('teampage', array(
1186                'GROUP_NAME'    => $group_name,
1187                'GROUP_COLOUR'    => ($row['group_colour']) ? '#' . $row['group_colour'] : '',
1188                'GROUP_TYPE'    => $group_type,
1189
1190                'U_CATEGORY'    => (!$row['group_id']) ? "{$this->u_action}&amp;c=" . $row['teampage_id'] : '',
1191                'U_MOVE_DOWN'    => "{$this->u_action}&amp;field=teampage&amp;action=move_down{$category_url_param}&amp;t=" . $row['teampage_id'],
1192                'U_MOVE_UP'        => "{$this->u_action}&amp;field=teampage&amp;action=move_up{$category_url_param}&amp;t=" . $row['teampage_id'],
1193                'U_DELETE'        => "{$this->u_action}&amp;field=teampage&amp;action=delete{$category_url_param}&amp;t=" . $row['teampage_id'],
1194            ));
1195        }
1196        $db->sql_freeresult($result);
1197
1198        $sql = 'SELECT g.group_id, g.group_name, g.group_colour, g.group_type
1199            FROM ' . GROUPS_TABLE . ' g
1200            LEFT JOIN ' . TEAMPAGE_TABLE . ' t
1201                ON (t.group_id = g.group_id)
1202            WHERE t.teampage_id IS NULL
1203            ORDER BY g.group_type DESC, g.group_name ASC';
1204        $result = $db->sql_query($sql);
1205
1206        while ($row = $db->sql_fetchrow($result))
1207        {
1208            $group_name = $group_helper->get_name($row['group_name']);
1209            $template->assign_block_vars('add_teampage', array(
1210                'GROUP_ID'        => (int) $row['group_id'],
1211                'GROUP_NAME'    => $group_name,
1212                'GROUP_SPECIAL'    => ($row['group_type'] == GROUP_SPECIAL),
1213            ));
1214        }
1215        $db->sql_freeresult($result);
1216
1217        $template->assign_vars(array(
1218            'U_ACTION'                    => $this->u_action,
1219            'U_ACTION_LEGEND'            => $this->u_action . '&amp;field=legend',
1220            'U_ACTION_TEAMPAGE'            => $this->u_action . '&amp;field=teampage' . $category_url_param,
1221            'U_ACTION_TEAMPAGE_CAT'        => $this->u_action . '&amp;field=teampage_cat',
1222
1223            'S_TEAMPAGE_CATEGORY'        => $category_id,
1224            'DISPLAY_FORUMS'            => ($config['teampage_forums']) ? true : false,
1225            'DISPLAY_MEMBERSHIPS'        => $config['teampage_memberships'],
1226            'LEGEND_SORT_GROUPNAME'        => ($config['legend_sort_groupname']) ? true : false,
1227        ));
1228    }
1229}