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)
30 phpbb
::$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 = (phpbb_request
::is_set_post('add')) ?
'add' : ((phpbb_request
::is_set_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 = phpbb_request
::is_set_post('update');
51 $can_upload = (file_exists(PHPBB_ROOT_PATH
. phpbb
::$config['avatar_path']) && @is_writable
(PHPBB_ROOT_PATH
. phpbb
::$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 = phpbb
::$db->sql_query($sql);
61 $group_row = phpbb
::$db->sql_fetchrow($result);
62 phpbb
::$db->sql_freeresult($result);
66 trigger_error(phpbb
::$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 (!phpbb
::phpbb
::$user->is_founder
&& $group_row['group_founder_manage'])
72 trigger_error(phpbb
::$user->lang
['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
84 trigger_error(phpbb
::$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
) ? phpbb
::$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(phpbb
::$user->lang
[$message] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id));
112 trigger_error(phpbb
::$user->lang
[$error] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id), E_USER_WARNING
);
120 trigger_error(phpbb
::$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
) ? phpbb
::$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 = phpbb
::$db->sql_query_limit($sql, 200, $start);
140 if ($row = phpbb
::$db->sql_fetchrow($result))
144 $mark_ary[] = $row['user_id'];
146 while ($row = phpbb
::$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 phpbb
::$db->sql_freeresult($result);
162 group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
165 trigger_error(phpbb
::$user->lang
['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action
. '&action=list&g=' . $group_id));
169 confirm_box(false, phpbb
::$user->lang
['CONFIRM_OPERATION'], build_hidden_fields(array(
174 'action' => $action))
184 trigger_error(phpbb
::$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(phpbb
::$user->lang
['NO_AUTH_OPERATION'] . adm_back_link($this->u_action
), E_USER_WARNING
);
191 if (confirm_box(true))
198 if (!phpbb
::$acl->acl_get('a_groupdel'))
200 trigger_error(phpbb
::$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
) ? phpbb
::$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(phpbb
::$user->lang
[$error] . adm_back_link($back_link), E_USER_WARNING
);
219 $message = ($action == 'delete') ?
'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
220 trigger_error(phpbb
::$user->lang
[$message] . adm_back_link($back_link));
224 confirm_box(false, phpbb
::$user->lang
['CONFIRM_OPERATION'], build_hidden_fields(array(
229 'action' => $action))
237 trigger_error(phpbb
::$user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
242 trigger_error(phpbb
::$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
) ? phpbb
::$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(phpbb
::$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(phpbb
::$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(phpbb
::$user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
270 if ($action == 'add' && !phpbb
::$acl->acl_get('a_groupadd'))
272 trigger_error(phpbb
::$user->lang
['NO_AUTH_OPERATION'] . adm_back_link($this->u_action
), E_USER_WARNING
);
276 phpbb
::$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(phpbb
::$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' => phpbb_request
::is_set('group_receive_pm') ?
1 : 0,
307 'legend' => phpbb_request
::is_set('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 (phpbb
::$user->is_founder
)
315 $submit_ary['founder_manage'] = phpbb_request
::is_set('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 && phpbb
::$config['allow_avatar_local'])
344 // check avatar gallery
345 if (is_dir(PHPBB_ROOT_PATH
. phpbb
::$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
. phpbb
::$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 (phpbb
::$config['avatar_max_width'] || phpbb
::$config['avatar_max_height'])
363 if ($data['width'] > phpbb
::$config['avatar_max_width'] ||
$data['height'] > phpbb
::$config['avatar_max_height'])
365 $error[] = sprintf(phpbb
::$user->lang
['AVATAR_WRONG_SIZE'], phpbb
::$config['avatar_min_width'], phpbb
::$config['avatar_min_height'], phpbb
::$config['avatar_max_width'], phpbb
::$config['avatar_max_height'], $data['width'], $data['height']);
371 if (phpbb
::$config['avatar_min_width'] || phpbb
::$config['avatar_min_height'])
373 if ($data['width'] < phpbb
::$config['avatar_min_width'] ||
$data['height'] < phpbb
::$config['avatar_min_height'])
375 $error[] = sprintf(phpbb
::$user->lang
['AVATAR_WRONG_SIZE'], phpbb
::$config['avatar_min_width'], phpbb
::$config['avatar_min_height'], phpbb
::$config['avatar_max_width'], phpbb
::$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' && phpbb
::$acl->acl_get('a_authgroups') && phpbb
::$acl->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 = phpbb
::$db->sql_query($sql);
425 $check_row = phpbb
::$db->sql_fetchrow($result);
426 phpbb
::$db->sql_freeresult($result);
428 // Check the group if non-founder
429 if ($check_row && (phpbb
::$user->is_founder ||
$check_row['group_founder_manage'] == 0))
431 // @todo CHANGE - do we support < 4.0.14?
432 // From the mysql documentation:
433 // 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.
434 // Due to this we stay on the safe side if we do the insertion "the manual way"
436 // Copy permisisons from/to the acl groups table (only group_id gets changed)
437 $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
438 FROM ' . ACL_GROUPS_TABLE
. '
439 WHERE group_id = ' . $group_perm_from;
440 $result = phpbb
::$db->sql_query($sql);
442 $groups_sql_ary = array();
443 while ($row = phpbb
::$db->sql_fetchrow($result))
445 $groups_sql_ary[] = array(
446 'group_id' => (int) $group_id,
447 'forum_id' => (int) $row['forum_id'],
448 'auth_option_id' => (int) $row['auth_option_id'],
449 'auth_role_id' => (int) $row['auth_role_id'],
450 'auth_setting' => (int) $row['auth_setting']
453 phpbb
::$db->sql_freeresult($result);
455 // Now insert the data
456 phpbb
::$db->sql_multi_insert(ACL_GROUPS_TABLE
, $groups_sql_ary);
458 phpbb
::$acl->acl_clear_prefetch();
462 phpbb
::$acm->destroy_sql(GROUPS_TABLE
);
464 $message = ($action == 'edit') ?
'GROUP_UPDATED' : 'GROUP_CREATED';
465 trigger_error(phpbb
::$user->lang
[$message] . adm_back_link($this->u_action
));
471 $group_rank = $submit_ary['rank'];
473 $group_desc_data = array(
474 'text' => $group_desc,
475 'allow_bbcode' => $allow_desc_bbcode,
476 'allow_smilies' => $allow_desc_smilies,
477 'allow_urls' => $allow_desc_urls
483 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
484 $group_desc_data = array(
486 'allow_bbcode' => true,
487 'allow_smilies' => true,
491 $group_type = GROUP_OPEN
;
495 $group_name = $group_row['group_name'];
496 $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
497 $group_type = $group_row['group_type'];
498 $group_rank = $group_row['group_rank'];
502 FROM ' . RANKS_TABLE
. '
503 WHERE rank_special = 1
504 ORDER BY rank_title';
505 $result = phpbb
::$db->sql_query($sql);
507 $rank_options = '<option value="0"' . ((!$group_rank) ?
' selected="selected"' : '') . '>' . phpbb
::$user->lang
['USER_DEFAULT'] . '</option>';
509 while ($row = phpbb
::$db->sql_fetchrow($result))
511 $selected = ($group_rank && $row['rank_id'] == $group_rank) ?
' selected="selected"' : '';
512 $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
514 phpbb
::$db->sql_freeresult($result);
516 $type_free = ($group_type == GROUP_FREE
) ?
' checked="checked"' : '';
517 $type_open = ($group_type == GROUP_OPEN
) ?
' checked="checked"' : '';
518 $type_closed = ($group_type == GROUP_CLOSED
) ?
' checked="checked"' : '';
519 $type_hidden = ($group_type == GROUP_HIDDEN
) ?
' checked="checked"' : '';
521 $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="" />';
523 $display_gallery = phpbb_request
::is_set_post('display_gallery');
525 if (phpbb
::$config['allow_avatar_local'] && $display_gallery)
527 avatar_gallery($category, $avatar_select, 4);
530 $back_link = request_var('back_link', '');
534 case 'acp_users_groups':
535 $u_back = append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, 'i=users&mode=groups&u=' . request_var('u', 0));
539 $u_back = $this->u_action
;
543 phpbb
::$template->assign_vars(array(
545 'S_ADD_GROUP' => ($action == 'add') ?
true : false,
546 'S_GROUP_PERM' => ($action == 'add' && phpbb
::$acl->acl_get('a_authgroups') && phpbb
::$acl->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ?
true : false,
547 'S_INCLUDE_SWATCH' => true,
548 'S_CAN_UPLOAD' => $can_upload,
549 'S_ERROR' => (sizeof($error)) ?
true : false,
550 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL
) ?
true : false,
551 'S_DISPLAY_GALLERY' => (phpbb
::$config['allow_avatar_local'] && !$display_gallery) ?
true : false,
552 'S_IN_GALLERY' => (phpbb
::$config['allow_avatar_local'] && $display_gallery) ?
true : false,
553 'S_USER_FOUNDER' => phpbb
::$user->is_founder
,
555 'ERROR_MSG' => (sizeof($error)) ?
implode('<br />', $error) : '',
556 'GROUP_NAME' => ($group_type == GROUP_SPECIAL
) ? phpbb
::$user->lang
['G_' . $group_name] : $group_name,
557 'GROUP_INTERNAL_NAME' => $group_name,
558 'GROUP_DESC' => $group_desc_data['text'],
559 'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ?
' checked="checked"' : '',
560 'GROUP_FOUNDER_MANAGE' => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ?
' checked="checked"' : '',
561 'GROUP_LEGEND' => (isset($group_row['group_legend']) && $group_row['group_legend']) ?
' checked="checked"' : '',
562 'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ?
$group_row['group_message_limit'] : 0,
563 'GROUP_MAX_RECIPIENTS' => (isset($group_row['group_max_recipients'])) ?
$group_row['group_max_recipients'] : 0,
564 '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, ((phpbb
::$user->is_founder
) ?
false : 0)),
572 'AVATAR' => $avatar_img,
573 'AVATAR_IMAGE' => $avatar_img,
574 'AVATAR_MAX_FILESIZE' => phpbb
::$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(phpbb
::$user->lang
['AVATAR_EXPLAIN'], phpbb
::$config['avatar_max_width'], phpbb
::$config['avatar_max_height'], round(phpbb
::$config['avatar_filesize'] / 1024)),
602 trigger_error(phpbb
::$user->lang
['NO_GROUP'] . adm_back_link($this->u_action
), E_USER_WARNING
);
605 $this->page_title
= 'GROUP_MEMBERS';
607 // Grab the leaders - always, on every page...
608 $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
609 FROM ' . USERS_TABLE
. ' u, ' . USER_GROUP_TABLE
. " ug
610 WHERE ug.group_id = $group_id
611 AND u.user_id = ug.user_id
612 AND ug.group_leader = 1
613 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
614 $result = phpbb
::$db->sql_query($sql);
616 while ($row = phpbb
::$db->sql_fetchrow($result))
618 phpbb
::$template->assign_block_vars('leader', array(
619 'U_USER_EDIT' => append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, "i=users&action=edit&u={$row['user_id']}"),
621 'USERNAME' => $row['username'],
622 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ?
true : false,
623 'JOINED' => ($row['user_regdate']) ? phpbb
::$user->format_date($row['user_regdate']) : ' - ',
624 'USER_POSTS' => $row['user_posts'],
625 'USER_ID' => $row['user_id'],
628 phpbb
::$db->sql_freeresult($result);
630 // Total number of group members (non-leaders)
631 $sql = 'SELECT COUNT(user_id) AS total_members
632 FROM ' . USER_GROUP_TABLE
. "
633 WHERE group_id = $group_id
634 AND group_leader = 0";
635 $result = phpbb
::$db->sql_query($sql);
636 $total_members = (int) phpbb
::$db->sql_fetchfield('total_members');
637 phpbb
::$db->sql_freeresult($result);
639 $s_action_options = '';
640 $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
642 foreach ($options as $option => $lang)
644 $s_action_options .= '<option value="' . $option . '">' . phpbb
::$user->lang
['GROUP_' . $lang] . '</option>';
647 phpbb
::$template->assign_vars(array(
649 'S_GROUP_SPECIAL' => ($group_row['group_type'] == GROUP_SPECIAL
) ?
true : false,
650 'S_ACTION_OPTIONS' => $s_action_options,
652 'S_ON_PAGE' => on_page($total_members, phpbb
::$config['topics_per_page'], $start),
653 'PAGINATION' => generate_pagination($this->u_action
. "&action=$action&g=$group_id", $total_members, phpbb
::$config['topics_per_page'], $start, true),
654 'GROUP_NAME' => ($group_row['group_type'] == GROUP_SPECIAL
) ? phpbb
::$user->lang
['G_' . $group_row['group_name']] : $group_row['group_name'],
656 'U_ACTION' => $this->u_action
. "&g=$group_id",
657 'U_BACK' => $this->u_action
,
658 'U_FIND_USERNAME' => append_sid('memberlist', 'mode=searchuser&form=list&field=usernames'),
659 'U_DEFAULT_ALL' => "{$this->u_action}&action=default&g=$group_id",
663 $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
664 FROM ' . USERS_TABLE
. ' u, ' . USER_GROUP_TABLE
. " ug
665 WHERE ug.group_id = $group_id
666 AND u.user_id = ug.user_id
667 AND ug.group_leader = 0
668 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
669 $result = phpbb
::$db->sql_query_limit($sql, phpbb
::$config['topics_per_page'], $start);
673 while ($row = phpbb
::$db->sql_fetchrow($result))
675 if ($row['user_pending'] && !$pending)
677 phpbb
::$template->assign_block_vars('member', array(
684 phpbb
::$template->assign_block_vars('member', array(
685 'U_USER_EDIT' => append_sid(PHPBB_ADMIN_PATH
. 'index.' . PHP_EXT
, "i=users&action=edit&u={$row['user_id']}"),
687 'USERNAME' => $row['username'],
688 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ?
true : false,
689 'JOINED' => ($row['user_regdate']) ? phpbb
::$user->format_date($row['user_regdate']) : ' - ',
690 'USER_POSTS' => $row['user_posts'],
691 'USER_ID' => $row['user_id'],
694 phpbb
::$db->sql_freeresult($result);
700 phpbb
::$template->assign_vars(array(
701 'U_ACTION' => $this->u_action
,
702 'S_GROUP_ADD' => (phpbb
::$acl->acl_get('a_groupadd')) ?
true : false,
705 // Get us all the groups
706 $sql = 'SELECT g.group_id, g.group_name, g.group_type
707 FROM ' . GROUPS_TABLE
. ' g
708 ORDER BY g.group_type ASC, g.group_name';
709 $result = phpbb
::$db->sql_query($sql);
711 $lookup = $cached_group_data = array();
712 while ($row = phpbb
::$db->sql_fetchrow($result))
714 $type = ($row['group_type'] == GROUP_SPECIAL
) ?
'special' : 'normal';
716 // used to determine what type a group is
717 $lookup[$row['group_id']] = $type;
719 // used for easy access to the data within a group
720 $cached_group_data[$type][$row['group_id']] = $row;
721 $cached_group_data[$type][$row['group_id']]['total_members'] = 0;
723 phpbb
::$db->sql_freeresult($result);
725 // How many people are in which group?
726 $sql = 'SELECT COUNT(ug.user_id) AS total_members, ug.group_id
727 FROM ' . USER_GROUP_TABLE
. ' ug
728 WHERE ' . phpbb
::$db->sql_in_set('ug.group_id', array_keys($lookup)) . '
729 GROUP BY ug.group_id';
730 $result = phpbb
::$db->sql_query($sql);
732 while ($row = phpbb
::$db->sql_fetchrow($result))
734 $type = $lookup[$row['group_id']];
735 $cached_group_data[$type][$row['group_id']]['total_members'] = $row['total_members'];
737 phpbb
::$db->sql_freeresult($result);
739 // The order is... normal, then special
740 ksort($cached_group_data);
742 foreach ($cached_group_data as $type => $row_ary)
744 if ($type == 'special')
746 phpbb
::$template->assign_block_vars('groups', array(
751 foreach ($row_ary as $group_id => $row)
753 $group_name = (!empty(phpbb
::$user->lang
['G_' . $row['group_name']]))? phpbb
::$user->lang
['G_' . $row['group_name']] : $row['group_name'];
755 phpbb
::$template->assign_block_vars('groups', array(
756 'U_LIST' => "{$this->u_action}&action=list&g=$group_id",
757 'U_EDIT' => "{$this->u_action}&action=edit&g=$group_id",
758 'U_DELETE' => (phpbb
::$acl->acl_get('a_groupdel')) ?
"{$this->u_action}&action=delete&g=$group_id" : '',
760 'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL
) ?
true : false,
762 'GROUP_NAME' => $group_name,
763 'TOTAL_MEMBERS' => $row['total_members'],