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, $file_uploads;
30 $user->add_lang('acp/groups');
31 $this->tpl_name
= 'acp_groups';
32 $this->page_title
= 'ACP_GROUPS_MANAGE';
34 $form_key = 'acp_groups';
35 add_form_key($form_key);
37 include(PHPBB_ROOT_PATH
. 'includes/functions_user.' . PHP_EXT
);
39 // Check and set some common vars
40 $action = (isset($_POST['add'])) ?
'add' : ((isset($_POST['addusers'])) ?
'addusers' : request_var('action', ''));
41 $group_id = request_var('g', 0);
42 $mark_ary = request_var('mark', array(0));
43 $name_ary = request_var('usernames', '', true);
44 $leader = request_var('leader', 0);
45 $default = request_var('default', 0);
46 $start = request_var('start', 0);
47 $update = (isset($_POST['update'])) ?
true : false;
51 $can_upload = (file_exists(PHPBB_ROOT_PATH
. $config['avatar_path']) && @is_writable
(PHPBB_ROOT_PATH
. $config['avatar_path']) && $file_uploads) ?
true : false;
54 // Grab basic data for group, if group_id is set and exists
58 FROM ' . GROUPS_TABLE
. "
59 WHERE group_id = $group_id";
60 $result = $db->sql_query($sql);
61 $group_row = $db->sql_fetchrow($result);
62 $db->sql_freeresult($result);
66 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
69 // Check if the user is allowed to manage this group if set to founder only.
70 if ($user->data
['user_type'] != USER_FOUNDER
&& $group_row['group_founder_manage'])
72 trigger_error($user->lang
['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
84 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
87 // Approve, demote or promote
88 $group_name = ($group_row['group_type'] == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'];
89 $error = group_user_attributes($action, $group_id, $mark_ary, false, $group_name);
96 $message = 'GROUP_MODS_DEMOTED';
100 $message = 'GROUP_MODS_PROMOTED';
104 $message = 'USERS_APPROVED';
108 trigger_error($user->lang
[$message] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id));
112 trigger_error($user->lang
[$error] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id), E_USER_WARNING
);
120 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
123 if (confirm_box(true))
125 $group_name = ($group_row['group_type'] == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'];
127 if (!sizeof($mark_ary))
133 $sql = 'SELECT user_id
134 FROM ' . USER_GROUP_TABLE
. "
135 WHERE group_id = $group_id
137 $result = $db->sql_query_limit($sql, 200, $start);
140 if ($row = $db->sql_fetchrow($result))
144 $mark_ary[] = $row['user_id'];
146 while ($row = $db->sql_fetchrow($result));
148 group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
150 $start = (sizeof($mark_ary) < 200) ?
0 : $start +
200;
156 $db->sql_freeresult($result);
162 group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
165 trigger_error($user->lang
['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id));
169 confirm_box(false, $user->lang
['CONFIRM_OPERATION'], build_hidden_fields(array(
174 'action' => $action))
184 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
186 else if ($action === 'delete' && $group_row['group_type'] == GROUP_SPECIAL
)
188 trigger_error($user->lang
['NO_AUTH_OPERATION'] . adm_back_link($this->u_action
), E_USER_WARNING
);
191 if (confirm_box(true))
198 if (!$auth->acl_get('a_groupdel'))
200 trigger_error($user->lang
['NO_AUTH_OPERATION'] . adm_back_link($this->u_action
), E_USER_WARNING
);
203 $error = group_delete($group_id, $group_row['group_name']);
207 $group_name = ($group_row['group_type'] == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'];
208 $error = group_user_del($group_id, $mark_ary, false, $group_name);
212 $back_link = ($action == 'delete') ?
$this->u_action
: $this->u_action
. '&action=list&g=' . $group_id;
216 trigger_error($user->lang
[$error] . adm_back_link($back_link), E_USER_WARNING
);
219 $message = ($action == 'delete') ?
'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
220 trigger_error($user->lang
[$message] . adm_back_link($back_link));
224 confirm_box(false, $user->lang
['CONFIRM_OPERATION'], build_hidden_fields(array(
229 'action' => $action))
237 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
242 trigger_error($user->lang
['NO_USERS'] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id), E_USER_WARNING
);
245 $name_ary = array_unique(explode("\n", $name_ary));
246 $group_name = ($group_row['group_type'] == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'];
248 // Add user/s to group
249 if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
251 trigger_error($user->lang
[$error] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id), E_USER_WARNING
);
254 $message = ($leader) ?
'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
255 trigger_error($user->lang
[$message] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id));
261 include(PHPBB_ROOT_PATH
. 'includes/functions_display.' . PHP_EXT
);
263 $data = $submit_ary = array();
265 if ($action == 'edit' && !$group_id)
267 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
270 if ($action == 'add' && !$auth->acl_get('a_groupadd'))
272 trigger_error($user->lang
['NO_AUTH_OPERATION'] . adm_back_link($this->u_action
), E_USER_WARNING
);
276 $user->add_lang('ucp');
278 $avatar_select = basename(request_var('avatar_select', ''));
279 $category = basename(request_var('category', ''));
284 if (!check_form_key($form_key))
286 trigger_error($user->lang
['FORM_INVALID'] . adm_back_link($this->u_action
), E_USER_WARNING
);
289 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
290 $group_desc = utf8_normalize_nfc(request_var('group_desc', '', true));
291 $group_type = request_var('group_type', GROUP_FREE
);
293 $allow_desc_bbcode = request_var('desc_parse_bbcode', false);
294 $allow_desc_urls = request_var('desc_parse_urls', false);
295 $allow_desc_smilies = request_var('desc_parse_smilies', false);
297 $data['uploadurl'] = request_var('uploadurl', '');
298 $data['remotelink'] = request_var('remotelink', '');
299 $data['width'] = request_var('width', '');
300 $data['height'] = request_var('height', '');
301 $delete = request_var('delete', '');
304 'colour' => request_var('group_colour', ''),
305 'rank' => request_var('group_rank', 0),
306 'receive_pm' => isset($_REQUEST['group_receive_pm']) ?
1 : 0,
307 'legend' => isset($_REQUEST['group_legend']) ?
1 : 0,
308 'message_limit' => request_var('group_message_limit', 0),
309 'max_recipients' => request_var('group_max_recipients', 0),
310 'founder_manage' => 0,
313 if ($user->data
['user_type'] == USER_FOUNDER
)
315 $submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ?
1 : 0;
318 if (!empty($_FILES['uploadfile']['tmp_name']) ||
$data['uploadurl'] ||
$data['remotelink'])
322 'uploadurl' => array('string', true, 5, 255),
323 'remotelink' => array('string', true, 5, 255),
324 'width' => array('string', true, 1, 3),
325 'height' => array('string', true, 1, 3),
328 if (!($error = validate_data($data, $var_ary)))
330 $data['user_id'] = "g$group_id";
332 if ((!empty($_FILES['uploadfile']['tmp_name']) ||
$data['uploadurl']) && $can_upload)
334 list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_upload($data, $error);
336 else if ($data['remotelink'])
338 list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_remote($data, $error);
342 else if ($avatar_select && $config['allow_avatar_local'])
344 // check avatar gallery
345 if (is_dir(PHPBB_ROOT_PATH
. $config['avatar_gallery_path'] . '/' . $category))
347 $submit_ary['avatar_type'] = AVATAR_GALLERY
;
349 list($submit_ary['avatar_width'], $submit_ary['avatar_height']) = getimagesize(PHPBB_ROOT_PATH
. $config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_select);
350 $submit_ary['avatar'] = $category . '/' . $avatar_select;
355 $submit_ary['avatar'] = '';
356 $submit_ary['avatar_type'] = $submit_ary['avatar_width'] = $submit_ary['avatar_height'] = 0;
358 else if ($data['width'] && $data['height'])
360 // Only update the dimensions?
361 if ($config['avatar_max_width'] ||
$config['avatar_max_height'])
363 if ($data['width'] > $config['avatar_max_width'] ||
$data['height'] > $config['avatar_max_height'])
365 $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']);
371 if ($config['avatar_min_width'] ||
$config['avatar_min_height'])
373 if ($data['width'] < $config['avatar_min_width'] ||
$data['height'] < $config['avatar_min_height'])
375 $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']);
382 $submit_ary['avatar_width'] = $data['width'];
383 $submit_ary['avatar_height'] = $data['height'];
387 if ((isset($submit_ary['avatar']) && $submit_ary['avatar'] && (!isset($group_row['group_avatar']))) ||
$delete)
389 if (isset($group_row['group_avatar']) && $group_row['group_avatar'])
391 avatar_delete('group', $group_row, true);
397 // Only set the rank, colour, etc. if it's changed or if we're adding a new
398 // group. This prevents existing group members being updated if no changes
401 $group_attributes = array();
402 $test_variables = array('rank', 'colour', 'avatar', 'avatar_type', 'avatar_width', 'avatar_height', 'receive_pm', 'legend', 'message_limit', 'max_recipients', 'founder_manage');
403 foreach ($test_variables as $test)
405 if (isset($submit_ary[$test]) && ($action == 'add' ||
$group_row['group_' . $test] != $submit_ary[$test]))
407 $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
411 if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
413 $group_perm_from = request_var('group_perm_from', 0);
416 // If the user has the a_authgroups permission and at least one additional permission ability set the permissions are fully transferred.
417 // 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.
418 // Since the user only has the option to copy permissions from non leader managed groups this seems to be a good compromise.
419 if ($group_perm_from && $action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth'))
421 $sql = 'SELECT group_founder_manage
422 FROM ' . GROUPS_TABLE
. '
423 WHERE group_id = ' . $group_perm_from;
424 $result = $db->sql_query($sql);
425 $check_row = $db->sql_fetchrow($result);
426 $db->sql_freeresult($result);
428 // Check the group if non-founder
429 if ($check_row && ($user->data
['user_type'] == USER_FOUNDER ||
$check_row['group_founder_manage'] == 0))
431 // From the mysql documentation:
432 // 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.
433 // Due to this we stay on the safe side if we do the insertion "the manual way"
435 // Copy permisisons from/to the acl groups table (only group_id gets changed)
436 $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
437 FROM ' . ACL_GROUPS_TABLE
. '
438 WHERE group_id = ' . $group_perm_from;
439 $result = $db->sql_query($sql);
441 $groups_sql_ary = array();
442 while ($row = $db->sql_fetchrow($result))
444 $groups_sql_ary[] = array(
445 'group_id' => (int) $group_id,
446 'forum_id' => (int) $row['forum_id'],
447 'auth_option_id' => (int) $row['auth_option_id'],
448 'auth_role_id' => (int) $row['auth_role_id'],
449 'auth_setting' => (int) $row['auth_setting']
452 $db->sql_freeresult($result);
454 // Now insert the data
455 $db->sql_multi_insert(ACL_GROUPS_TABLE
, $groups_sql_ary);
457 $auth->acl_clear_prefetch();
461 $cache->destroy('sql', GROUPS_TABLE
);
463 $message = ($action == 'edit') ?
'GROUP_UPDATED' : 'GROUP_CREATED';
464 trigger_error($user->lang
[$message] . adm_back_link($this->u_action
));
470 $group_rank = $submit_ary['rank'];
472 $group_desc_data = array(
473 'text' => $group_desc,
474 'allow_bbcode' => $allow_desc_bbcode,
475 'allow_smilies' => $allow_desc_smilies,
476 'allow_urls' => $allow_desc_urls
482 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
483 $group_desc_data = array(
485 'allow_bbcode' => true,
486 'allow_smilies' => true,
490 $group_type = GROUP_OPEN
;
494 $group_name = $group_row['group_name'];
495 $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
496 $group_type = $group_row['group_type'];
497 $group_rank = $group_row['group_rank'];
501 FROM ' . RANKS_TABLE
. '
502 WHERE rank_special = 1
503 ORDER BY rank_title';
504 $result = $db->sql_query($sql);
506 $rank_options = '<option value="0"' . ((!$group_rank) ?
' selected="selected"' : '') . '>' . $user->lang
['USER_DEFAULT'] . '</option>';
508 while ($row = $db->sql_fetchrow($result))
510 $selected = ($group_rank && $row['rank_id'] == $group_rank) ?
' selected="selected"' : '';
511 $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
513 $db->sql_freeresult($result);
515 $type_free = ($group_type == GROUP_FREE
) ?
' checked="checked"' : '';
516 $type_open = ($group_type == GROUP_OPEN
) ?
' checked="checked"' : '';
517 $type_closed = ($group_type == GROUP_CLOSED
) ?
' checked="checked"' : '';
518 $type_hidden = ($group_type == GROUP_HIDDEN
) ?
' checked="checked"' : '';
520 $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="" />';
522 $display_gallery = (isset($_POST['display_gallery'])) ?
true : false;
524 if ($config['allow_avatar_local'] && $display_gallery)
526 avatar_gallery($category, $avatar_select, 4);
529 $back_link = request_var('back_link', '');
533 case 'acp_users_groups':
534 $u_back = append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, 'i=users&mode=groups&u=' . request_var('u', 0));
538 $u_back = $this->u_action
;
542 $template->assign_vars(array(
544 'S_ADD_GROUP' => ($action == 'add') ?
true : false,
545 'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ?
true : false,
546 'S_INCLUDE_SWATCH' => true,
547 'S_CAN_UPLOAD' => $can_upload,
548 'S_ERROR' => (sizeof($error)) ?
true : false,
549 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL
) ?
true : false,
550 'S_DISPLAY_GALLERY' => ($config['allow_avatar_local'] && !$display_gallery) ?
true : false,
551 'S_IN_GALLERY' => ($config['allow_avatar_local'] && $display_gallery) ?
true : false,
552 'S_USER_FOUNDER' => ($user->data
['user_type'] == USER_FOUNDER
) ?
true : false,
554 'ERROR_MSG' => (sizeof($error)) ?
implode('<br />', $error) : '',
555 'GROUP_NAME' => ($group_type == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_name] : $group_name,
556 'GROUP_INTERNAL_NAME' => $group_name,
557 'GROUP_DESC' => $group_desc_data['text'],
558 'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ?
' checked="checked"' : '',
559 'GROUP_FOUNDER_MANAGE' => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ?
' checked="checked"' : '',
560 'GROUP_LEGEND' => (isset($group_row['group_legend']) && $group_row['group_legend']) ?
' checked="checked"' : '',
561 'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ?
$group_row['group_message_limit'] : 0,
562 'GROUP_MAX_RECIPIENTS' => (isset($group_row['group_max_recipients'])) ?
$group_row['group_max_recipients'] : 0,
563 'GROUP_COLOUR' => (isset($group_row['group_colour'])) ?
$group_row['group_colour'] : '',
566 'S_DESC_BBCODE_CHECKED' => $group_desc_data['allow_bbcode'],
567 'S_DESC_URLS_CHECKED' => $group_desc_data['allow_urls'],
568 'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
570 'S_RANK_OPTIONS' => $rank_options,
571 'S_GROUP_OPTIONS' => group_select_options(false, false, (($user->data
['user_type'] == USER_FOUNDER
) ?
false : 0)),
572 'AVATAR' => $avatar_img,
573 'AVATAR_IMAGE' => $avatar_img,
574 'AVATAR_MAX_FILESIZE' => $config['avatar_filesize'],
575 'AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ?
$group_row['group_avatar_width'] : '',
576 'AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ?
$group_row['group_avatar_height'] : '',
578 'GROUP_TYPE_FREE' => GROUP_FREE
,
579 'GROUP_TYPE_OPEN' => GROUP_OPEN
,
580 'GROUP_TYPE_CLOSED' => GROUP_CLOSED
,
581 'GROUP_TYPE_HIDDEN' => GROUP_HIDDEN
,
582 'GROUP_TYPE_SPECIAL' => GROUP_SPECIAL
,
584 'GROUP_FREE' => $type_free,
585 'GROUP_OPEN' => $type_open,
586 'GROUP_CLOSED' => $type_closed,
587 'GROUP_HIDDEN' => $type_hidden,
590 'U_SWATCH' => append_sid(PHPBB_ADMIN_PATH
. 'swatch.' . PHP_EXT
, 'form=settings&name=group_colour'),
591 'U_ACTION' => "{$this->u_action}&action=$action&g=$group_id",
592 'L_AVATAR_EXPLAIN' => sprintf($user->lang
['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)),
603 trigger_error($user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
606 $this->page_title
= 'GROUP_MEMBERS';
608 // Grab the leaders - always, on every page...
609 $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
610 FROM ' . USERS_TABLE
. ' u, ' . USER_GROUP_TABLE
. " ug
611 WHERE ug.group_id = $group_id
612 AND u.user_id = ug.user_id
613 AND ug.group_leader = 1
614 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
615 $result = $db->sql_query($sql);
617 while ($row = $db->sql_fetchrow($result))
619 $template->assign_block_vars('leader', array(
620 'U_USER_EDIT' => append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, "i=users&action=edit&u={$row['user_id']}"),
622 'USERNAME' => $row['username'],
623 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ?
true : false,
624 'JOINED' => ($row['user_regdate']) ?
$user->format_date($row['user_regdate']) : ' - ',
625 'USER_POSTS' => $row['user_posts'],
626 'USER_ID' => $row['user_id'])
629 $db->sql_freeresult($result);
631 // Total number of group members (non-leaders)
632 $sql = 'SELECT COUNT(user_id) AS total_members
633 FROM ' . USER_GROUP_TABLE
. "
634 WHERE group_id = $group_id
635 AND group_leader = 0";
636 $result = $db->sql_query($sql);
637 $total_members = (int) $db->sql_fetchfield('total_members');
638 $db->sql_freeresult($result);
640 $s_action_options = '';
641 $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
643 foreach ($options as $option => $lang)
645 $s_action_options .= '<option value="' . $option . '">' . $user->lang
['GROUP_' . $lang] . '</option>';
648 $template->assign_vars(array(
650 'S_GROUP_SPECIAL' => ($group_row['group_type'] == GROUP_SPECIAL
) ?
true : false,
651 'S_ACTION_OPTIONS' => $s_action_options,
653 'S_ON_PAGE' => on_page($total_members, $config['topics_per_page'], $start),
654 'PAGINATION' => generate_pagination($this->u_action
. "&action=$action&g=$group_id", $total_members, $config['topics_per_page'], $start, true),
655 'GROUP_NAME' => ($group_row['group_type'] == GROUP_SPECIAL
) ?
$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'],
657 'U_ACTION' => $this->u_action
. "&g=$group_id",
658 'U_BACK' => $this->u_action
,
659 'U_FIND_USERNAME' => append_sid('memberlist', 'mode=searchuser&form=list&field=usernames'),
660 'U_DEFAULT_ALL' => "{$this->u_action}&action=default&g=$group_id",
664 $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
665 FROM ' . USERS_TABLE
. ' u, ' . USER_GROUP_TABLE
. " ug
666 WHERE ug.group_id = $group_id
667 AND u.user_id = ug.user_id
668 AND ug.group_leader = 0
669 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
670 $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
674 while ($row = $db->sql_fetchrow($result))
676 if ($row['user_pending'] && !$pending)
678 $template->assign_block_vars('member', array(
685 $template->assign_block_vars('member', array(
686 'U_USER_EDIT' => append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, "i=users&action=edit&u={$row['user_id']}"),
688 'USERNAME' => $row['username'],
689 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ?
true : false,
690 'JOINED' => ($row['user_regdate']) ?
$user->format_date($row['user_regdate']) : ' - ',
691 'USER_POSTS' => $row['user_posts'],
692 'USER_ID' => $row['user_id'])
695 $db->sql_freeresult($result);
701 $template->assign_vars(array(
702 'U_ACTION' => $this->u_action
,
703 'S_GROUP_ADD' => ($auth->acl_get('a_groupadd')) ?
true : false)
706 // Get us all the groups
707 $sql = 'SELECT g.group_id, g.group_name, g.group_type
708 FROM ' . GROUPS_TABLE
. ' g
709 ORDER BY g.group_type ASC, g.group_name';
710 $result = $db->sql_query($sql);
712 $lookup = $cached_group_data = array();
713 while ($row = $db->sql_fetchrow($result))
715 $type = ($row['group_type'] == GROUP_SPECIAL
) ?
'special' : 'normal';
717 // used to determine what type a group is
718 $lookup[$row['group_id']] = $type;
720 // used for easy access to the data within a group
721 $cached_group_data[$type][$row['group_id']] = $row;
722 $cached_group_data[$type][$row['group_id']]['total_members'] = 0;
724 $db->sql_freeresult($result);
726 // How many people are in which group?
727 $sql = 'SELECT COUNT(ug.user_id) AS total_members, ug.group_id
728 FROM ' . USER_GROUP_TABLE
. ' ug
729 WHERE ' . $db->sql_in_set('ug.group_id', array_keys($lookup)) . '
730 GROUP BY ug.group_id';
731 $result = $db->sql_query($sql);
733 while ($row = $db->sql_fetchrow($result))
735 $type = $lookup[$row['group_id']];
736 $cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
738 $db->sql_freeresult($result);
740 // The order is... normal, then special
741 ksort($cached_group_data);
743 foreach ($cached_group_data as $type => $row_ary)
745 if ($type == 'special')
747 $template->assign_block_vars('groups', array(
752 foreach ($row_ary as $group_id => $row)
754 $group_name = (!empty($user->lang
['G_' . $row['group_name']]))?
$user->lang
['G_' . $row['group_name']] : $row['group_name'];
756 $template->assign_block_vars('groups', array(
757 'U_LIST' => "{$this->u_action}&action=list&g=$group_id",
758 'U_EDIT' => "{$this->u_action}&action=edit&g=$group_id",
759 'U_DELETE' => ($auth->acl_get('a_groupdel')) ?
"{$this->u_action}&action=delete&g=$group_id" : '',
761 'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL
) ?
true : false,
763 'GROUP_NAME' => $group_name,
764 'TOTAL_MEMBERS' => $row['total_members'],