5
* @version $Id: acp_groups.php,v 1.63 2007/10/05 14:36:32 acydburn Exp $
6
* @copyright (c) 2005 phpBB Group
7
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
14
if (!defined('IN_PHPBB'))
26
function main($id, $mode)
28
global $config, $db, $user, $auth, $template, $cache;
29
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;
31
$user->add_lang('acp/groups');
32
$this->tpl_name = 'acp_groups';
33
$this->page_title = 'ACP_GROUPS_MANAGE';
35
$form_key = 'acp_groups';
36
add_form_key($form_key);
38
include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
40
// Check and set some common vars
41
$action = (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', ''));
42
$group_id = request_var('g', 0);
43
$mark_ary = request_var('mark', array(0));
44
$name_ary = request_var('usernames', '', true);
45
$leader = request_var('leader', 0);
46
$default = request_var('default', 0);
47
$start = request_var('start', 0);
48
$update = (isset($_POST['update'])) ? true : false;
52
$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
55
// Grab basic data for group, if group_id is set and exists
59
FROM ' . GROUPS_TABLE . "
60
WHERE group_id = $group_id";
61
$result = $db->sql_query($sql);
62
$group_row = $db->sql_fetchrow($result);
63
$db->sql_freeresult($result);
67
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
70
// Check if the user is allowed to manage this group if set to founder only.
71
if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage'])
73
trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
85
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
88
// Approve, demote or promote
89
$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
90
group_user_attributes($action, $group_id, $mark_ary, false, $group_name);
95
$message = 'GROUP_MODS_DEMOTED';
99
$message = 'GROUP_MODS_PROMOTED';
103
$message = 'USERS_APPROVED';
107
trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&action=list&g=' . $group_id));
113
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
116
if (confirm_box(true))
118
$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
120
if (!sizeof($mark_ary))
126
$sql = 'SELECT user_id
127
FROM ' . USER_GROUP_TABLE . "
128
WHERE group_id = $group_id
130
$result = $db->sql_query_limit($sql, 200, $start);
133
if ($row = $db->sql_fetchrow($result))
137
$mark_ary[] = $row['user_id'];
139
while ($row = $db->sql_fetchrow($result));
141
group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
143
$start = (sizeof($mark_ary) < 200) ? 0 : $start + 200;
149
$db->sql_freeresult($result);
155
group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
158
trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id));
162
confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
167
'action' => $action))
175
if (confirm_box(true))
179
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
187
if (!$auth->acl_get('a_groupdel'))
189
trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
192
$error = group_delete($group_id, $group_row['group_name']);
196
$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
197
$error = group_user_del($group_id, $mark_ary, false, $group_name);
201
$back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&action=list&g=' . $group_id;
205
trigger_error($user->lang[$error] . adm_back_link($back_link), E_USER_WARNING);
208
$message = ($action == 'delete') ? 'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
209
trigger_error($user->lang[$message] . adm_back_link($back_link));
213
confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
218
'action' => $action))
226
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
231
trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING);
234
$name_ary = array_unique(explode("\n", $name_ary));
235
$group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
237
// Add user/s to group
238
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
240
trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING);
243
$message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
244
trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&action=list&g=' . $group_id));
250
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
252
$data = $submit_ary = array();
254
if ($action == 'edit' && !$group_id)
256
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
259
if ($action == 'add' && !$auth->acl_get('a_groupadd'))
261
trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
265
$user->add_lang('ucp');
267
$avatar_select = basename(request_var('avatar_select', ''));
268
$category = basename(request_var('category', ''));
273
if (!check_form_key($form_key))
275
trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
278
$group_name = utf8_normalize_nfc(request_var('group_name', '', true));
279
$group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
280
$group_type = request_var('group_type', GROUP_FREE);
282
$allow_desc_bbcode = request_var('desc_parse_bbcode', false);
283
$allow_desc_urls = request_var('desc_parse_urls', false);
284
$allow_desc_smilies = request_var('desc_parse_smilies', false);
286
$data['uploadurl'] = request_var('uploadurl', '');
287
$data['remotelink'] = request_var('remotelink', '');
288
$data['width'] = request_var('width', '');
289
$data['height'] = request_var('height', '');
290
$delete = request_var('delete', '');
293
'colour' => request_var('group_colour', ''),
294
'rank' => request_var('group_rank', 0),
295
'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
296
'legend' => isset($_REQUEST['group_legend']) ? 1 : 0,
297
'message_limit' => request_var('group_message_limit', 0),
298
'founder_manage' => 0,
301
if ($user->data['user_type'] == USER_FOUNDER)
303
$submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ? 1 : 0;
306
if (!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl'] || $data['remotelink'])
310
'uploadurl' => array('string', true, 5, 255),
311
'remotelink' => array('string', true, 5, 255),
312
'width' => array('string', true, 1, 3),
313
'height' => array('string', true, 1, 3),
316
if (!($error = validate_data($data, $var_ary)))
318
$data['user_id'] = "g$group_id";
320
if ((!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl']) && $can_upload)
322
list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_upload($data, $error);
324
else if ($data['remotelink'])
326
list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_remote($data, $error);
330
else if ($avatar_select && $config['allow_avatar_local'])
332
// check avatar gallery
333
if (is_dir($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category))
335
$submit_ary['avatar_type'] = AVATAR_GALLERY;
337
list($submit_ary['avatar_width'], $submit_ary['avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_select);
338
$submit_ary['avatar'] = $category . '/' . $avatar_select;
343
$submit_ary['avatar'] = '';
344
$submit_ary['avatar_type'] = $submit_ary['avatar_width'] = $submit_ary['avatar_height'] = 0;
346
else if ($data['width'] && $data['height'])
348
// Only update the dimensions?
349
if ($config['avatar_max_width'] || $config['avatar_max_height'])
351
if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height'])
353
$error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
359
if ($config['avatar_min_width'] || $config['avatar_min_height'])
361
if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height'])
363
$error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
370
$submit_ary['avatar_width'] = $data['width'];
371
$submit_ary['avatar_height'] = $data['height'];
375
if ((isset($submit_ary['avatar']) && $submit_ary['avatar'] && (!isset($group_row['group_avatar']))) || $delete)
377
if (isset($group_row['group_avatar']) && $group_row['group_avatar'])
379
avatar_delete('group', $group_row, true);
385
// Only set the rank, colour, etc. if it's changed or if we're adding a new
386
// group. This prevents existing group members being updated if no changes
389
$group_attributes = array();
390
$test_variables = array('rank', 'colour', 'avatar', 'avatar_type', 'avatar_width', 'avatar_height', 'receive_pm', 'legend', 'message_limit', 'founder_manage');
391
foreach ($test_variables as $test)
393
if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test]))
395
$group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
399
if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
401
$group_perm_from = request_var('group_perm_from', 0);
404
// If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred.
405
// 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.
406
// Since the user only has the option to copy permissions from non leader managed groups this seems to be a good compromise.
407
if ($group_perm_from && $action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth'))
409
$sql = 'SELECT group_founder_manage
410
FROM ' . GROUPS_TABLE . '
411
WHERE group_id = ' . $group_perm_from;
412
$result = $db->sql_query($sql);
413
$check_row = $db->sql_fetchrow($result);
414
$db->sql_freeresult($result);
416
// Check the group if non-founder
417
if ($check_row && ($user->data['user_type'] == USER_FOUNDER || $check_row['group_founder_manage'] == 0))
419
// From the mysql documentation:
420
// 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.
421
// Due to this we stay on the safe side if we do the insertion "the manual way"
423
// Copy permisisons from/to the acl groups table (only group_id gets changed)
424
$sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
425
FROM ' . ACL_GROUPS_TABLE . '
426
WHERE group_id = ' . $group_perm_from;
427
$result = $db->sql_query($sql);
429
$groups_sql_ary = array();
430
while ($row = $db->sql_fetchrow($result))
432
$groups_sql_ary[] = array(
433
'group_id' => (int) $group_id,
434
'forum_id' => (int) $row['forum_id'],
435
'auth_option_id' => (int) $row['auth_option_id'],
436
'auth_role_id' => (int) $row['auth_role_id'],
437
'auth_setting' => (int) $row['auth_setting']
440
$db->sql_freeresult($result);
442
// Now insert the data
443
$db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);
445
$auth->acl_clear_prefetch();
449
$cache->destroy('sql', GROUPS_TABLE);
451
$message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
452
trigger_error($user->lang[$message] . adm_back_link($this->u_action));
458
$group_rank = $submit_ary['rank'];
460
$group_desc_data = array(
461
'text' => $group_desc,
462
'allow_bbcode' => $allow_desc_bbcode,
463
'allow_smilies' => $allow_desc_smilies,
464
'allow_urls' => $allow_desc_urls
470
$group_name = utf8_normalize_nfc(request_var('group_name', '', true));
471
$group_desc_data = array(
473
'allow_bbcode' => true,
474
'allow_smilies' => true,
478
$group_type = GROUP_OPEN;
482
$group_name = $group_row['group_name'];
483
$group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
484
$group_type = $group_row['group_type'];
485
$group_rank = $group_row['group_rank'];
489
FROM ' . RANKS_TABLE . '
490
WHERE rank_special = 1
491
ORDER BY rank_title';
492
$result = $db->sql_query($sql);
494
$rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>';
496
while ($row = $db->sql_fetchrow($result))
498
$selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : '';
499
$rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
501
$db->sql_freeresult($result);
503
$type_free = ($group_type == GROUP_FREE) ? ' checked="checked"' : '';
504
$type_open = ($group_type == GROUP_OPEN) ? ' checked="checked"' : '';
505
$type_closed = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
506
$type_hidden = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
508
$avatar_img = (!empty($group_row['group_avatar'])) ? get_user_avatar($group_row['group_avatar'], $group_row['group_avatar_type'], $group_row['group_avatar_width'], $group_row['group_avatar_height'], 'GROUP_AVATAR') : '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />';
510
$display_gallery = (isset($_POST['display_gallery'])) ? true : false;
512
if ($config['allow_avatar_local'] && $display_gallery)
514
avatar_gallery($category, $avatar_select, 4);
517
$back_link = request_var('back_link', '');
521
case 'acp_users_groups':
522
$u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=groups&u=' . request_var('u', 0));
526
$u_back = $this->u_action;
530
$template->assign_vars(array(
532
'S_ADD_GROUP' => ($action == 'add') ? true : false,
533
'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false,
534
'S_INCLUDE_SWATCH' => true,
535
'S_CAN_UPLOAD' => $can_upload,
536
'S_ERROR' => (sizeof($error)) ? true : false,
537
'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
538
'S_DISPLAY_GALLERY' => ($config['allow_avatar_local'] && !$display_gallery) ? true : false,
539
'S_IN_GALLERY' => ($config['allow_avatar_local'] && $display_gallery) ? true : false,
540
'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
542
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
543
'GROUP_NAME' => ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
544
'GROUP_INTERNAL_NAME' => $group_name,
545
'GROUP_DESC' => $group_desc_data['text'],
546
'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
547
'GROUP_FOUNDER_MANAGE' => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '',
548
'GROUP_LEGEND' => (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '',
549
'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
550
'GROUP_COLOUR' => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
553
'S_DESC_BBCODE_CHECKED' => $group_desc_data['allow_bbcode'],
554
'S_DESC_URLS_CHECKED' => $group_desc_data['allow_urls'],
555
'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
557
'S_RANK_OPTIONS' => $rank_options,
558
'S_GROUP_OPTIONS' => group_select_options(false, false, (($user->data['user_type'] == USER_FOUNDER) ? false : 0)),
559
'AVATAR' => $avatar_img,
560
'AVATAR_IMAGE' => $avatar_img,
561
'AVATAR_MAX_FILESIZE' => $config['avatar_filesize'],
562
'AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '',
563
'AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '',
565
'GROUP_TYPE_FREE' => GROUP_FREE,
566
'GROUP_TYPE_OPEN' => GROUP_OPEN,
567
'GROUP_TYPE_CLOSED' => GROUP_CLOSED,
568
'GROUP_TYPE_HIDDEN' => GROUP_HIDDEN,
569
'GROUP_TYPE_SPECIAL' => GROUP_SPECIAL,
571
'GROUP_FREE' => $type_free,
572
'GROUP_OPEN' => $type_open,
573
'GROUP_CLOSED' => $type_closed,
574
'GROUP_HIDDEN' => $type_hidden,
577
'U_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&name=group_colour'),
578
'U_ACTION' => "{$this->u_action}&action=$action&g=$group_id",
579
'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)),
590
trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
593
$this->page_title = 'GROUP_MEMBERS';
595
// Grab the leaders - always, on every page...
596
$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
597
FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
598
WHERE ug.group_id = $group_id
599
AND u.user_id = ug.user_id
600
AND ug.group_leader = 1
601
ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
602
$result = $db->sql_query($sql);
604
while ($row = $db->sql_fetchrow($result))
606
$template->assign_block_vars('leader', array(
607
'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&action=edit&u={$row['user_id']}"),
609
'USERNAME' => $row['username'],
610
'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
611
'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
612
'USER_POSTS' => $row['user_posts'],
613
'USER_ID' => $row['user_id'])
616
$db->sql_freeresult($result);
618
// Total number of group members (non-leaders)
619
$sql = 'SELECT COUNT(user_id) AS total_members
620
FROM ' . USER_GROUP_TABLE . "
621
WHERE group_id = $group_id
622
AND group_leader = 0";
623
$result = $db->sql_query($sql);
624
$total_members = (int) $db->sql_fetchfield('total_members');
625
$db->sql_freeresult($result);
627
$s_action_options = '';
628
$options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
630
foreach ($options as $option => $lang)
632
$s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
635
$template->assign_vars(array(
637
'S_GROUP_SPECIAL' => ($group_row['group_type'] == GROUP_SPECIAL) ? true : false,
638
'S_ACTION_OPTIONS' => $s_action_options,
640
'S_ON_PAGE' => on_page($total_members, $config['topics_per_page'], $start),
641
'PAGINATION' => generate_pagination($this->u_action . "&action=$action&g=$group_id", $total_members, $config['topics_per_page'], $start, true),
642
'GROUP_NAME' => ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'],
644
'U_ACTION' => $this->u_action . "&g=$group_id",
645
'U_BACK' => $this->u_action,
646
'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=list&field=usernames'),
647
'U_DEFAULT_ALL' => "{$this->u_action}&action=default&g=$group_id",
651
$sql = 'SELECT u.user_id, u.username, u.username_clean, u.user_regdate, u.user_posts, u.group_id, ug.group_leader, ug.user_pending
652
FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
653
WHERE ug.group_id = $group_id
654
AND u.user_id = ug.user_id
655
AND ug.group_leader = 0
656
ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
657
$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
661
while ($row = $db->sql_fetchrow($result))
663
if ($row['user_pending'] && !$pending)
665
$template->assign_block_vars('member', array(
672
$template->assign_block_vars('member', array(
673
'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&action=edit&u={$row['user_id']}"),
675
'USERNAME' => $row['username'],
676
'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
677
'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
678
'USER_POSTS' => $row['user_posts'],
679
'USER_ID' => $row['user_id'])
682
$db->sql_freeresult($result);
688
$template->assign_vars(array(
689
'U_ACTION' => $this->u_action,
690
'S_GROUP_ADD' => ($auth->acl_get('a_groupadd')) ? true : false)
693
// Get us all the groups
694
$sql = 'SELECT g.group_id, g.group_name, g.group_type
695
FROM ' . GROUPS_TABLE . ' g
696
ORDER BY g.group_type ASC, g.group_name';
697
$result = $db->sql_query($sql);
699
$lookup = $cached_group_data = array();
700
while ($row = $db->sql_fetchrow($result))
702
$type = ($row['group_type'] == GROUP_SPECIAL) ? 'special' : 'normal';
704
// used to determine what type a group is
705
$lookup[$row['group_id']] = $type;
707
// used for easy access to the data within a group
708
$cached_group_data[$type][$row['group_id']] = $row;
709
$cached_group_data[$type][$row['group_id']]['total_members'] = 0;
711
$db->sql_freeresult($result);
713
// How many people are in which group?
714
$sql = 'SELECT COUNT(ug.user_id) AS total_members, ug.group_id
715
FROM ' . USER_GROUP_TABLE . ' ug
716
WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . '
717
GROUP BY ug.group_id';
718
$result = $db->sql_query($sql);
720
while ($row = $db->sql_fetchrow($result))
722
$type = $lookup[$row['group_id']];
723
$cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
725
$db->sql_freeresult($result);
727
// The order is... normal, then special
728
ksort($cached_group_data);
730
foreach ($cached_group_data as $type => $row_ary)
732
if ($type == 'special')
734
$template->assign_block_vars('groups', array(
739
foreach ($row_ary as $group_id => $row)
741
$group_name = (!empty($user->lang['G_' . $row['group_name']]))? $user->lang['G_' . $row['group_name']] : $row['group_name'];
743
$template->assign_block_vars('groups', array(
744
'U_LIST' => "{$this->u_action}&action=list&g=$group_id",
745
'U_EDIT' => "{$this->u_action}&action=edit&g=$group_id",
746
'U_DELETE' => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&action=delete&g=$group_id" : '',
748
'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
750
'GROUP_NAME' => $group_name,
751
'TOTAL_MEMBERS' => $row['total_members'],
b'\\ No newline at end of file'