merge revisions i missed... hopefully not breaking things - did not check every change.
[phpbb.git] / phpBB / includes / acp / acp_groups.php
blobcae2c304337a52d5d877ca97810e47dc8cb7390f
1 <?php
2 /**
4 * @package acp
5 * @version $Id$
6 * @copyright (c) 2005 phpBB Group
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
9 */
11 /**
12 * @ignore
14 if (!defined('IN_PHPBB'))
16 exit;
19 /**
20 * @package acp
22 class acp_groups
24 var $u_action;
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;
50 // Clear some vars
51 $can_upload = (file_exists(PHPBB_ROOT_PATH . $config['avatar_path']) && @is_writable(PHPBB_ROOT_PATH . $config['avatar_path']) && $file_uploads) ? true : false;
52 $group_row = array();
54 // Grab basic data for group, if group_id is set and exists
55 if ($group_id)
57 $sql = 'SELECT *
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);
64 if (!$group_row)
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);
76 // Which page?
77 switch ($action)
79 case 'approve':
80 case 'demote':
81 case 'promote':
82 if (!$group_id)
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);
91 if (!$error)
93 switch ($action)
95 case 'demote':
96 $message = 'GROUP_MODS_DEMOTED';
97 break;
99 case 'promote':
100 $message = 'GROUP_MODS_PROMOTED';
101 break;
103 case 'approve':
104 $message = 'USERS_APPROVED';
105 break;
108 trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
110 else
112 trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
115 break;
117 case 'default':
118 if (!$group_id)
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))
129 $start = 0;
133 $sql = 'SELECT user_id
134 FROM ' . USER_GROUP_TABLE . "
135 WHERE group_id = $group_id
136 ORDER BY user_id";
137 $result = $db->sql_query_limit($sql, 200, $start);
139 $mark_ary = array();
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;
152 else
154 $start = 0;
156 $db->sql_freeresult($result);
158 while ($start);
160 else
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 . '&amp;action=list&amp;g=' . $group_id));
167 else
169 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
170 'mark' => $mark_ary,
171 'g' => $group_id,
172 'i' => $id,
173 'mode' => $mode,
174 'action' => $action))
178 break;
180 case 'deleteusers':
181 case 'delete':
182 if (!$group_id)
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))
193 $error = '';
195 switch ($action)
197 case 'delete':
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']);
204 break;
206 case 'deleteusers':
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);
209 break;
212 $back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&amp;action=list&amp;g=' . $group_id;
214 if ($error)
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));
222 else
224 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
225 'mark' => $mark_ary,
226 'g' => $group_id,
227 'i' => $id,
228 'mode' => $mode,
229 'action' => $action))
232 break;
234 case 'addusers':
235 if (!$group_id)
237 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
240 if (!$name_ary)
242 trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;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 . '&amp;action=list&amp;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 . '&amp;action=list&amp;g=' . $group_id));
256 break;
258 case 'edit':
259 case 'add':
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);
275 $error = array();
276 $user->add_lang('ucp');
278 $avatar_select = basename(request_var('avatar_select', ''));
279 $category = basename(request_var('category', ''));
281 // Did we submit?
282 if ($update)
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', '');
303 $submit_ary = array(
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'])
320 // Avatar stuff
321 $var_ary = array(
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;
353 else if ($delete)
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']);
369 if (!sizeof($error))
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']);
380 if (!sizeof($error))
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);
395 if (!sizeof($error))
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
399 // were made.
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);
415 // Copy permissions?
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));
468 if (sizeof($error))
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
480 else if (!$group_id)
482 $group_name = utf8_normalize_nfc(request_var('group_name', '', true));
483 $group_desc_data = array(
484 'text' => '',
485 'allow_bbcode' => true,
486 'allow_smilies' => true,
487 'allow_urls' => true
489 $group_rank = 0;
490 $group_type = GROUP_OPEN;
492 else
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'];
500 $sql = 'SELECT *
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', '');
531 switch ($back_link)
533 case 'acp_users_groups':
534 $u_back = append_sid(PHPBB_ADMIN_PATH . 'index.' . PHP_EXT, 'i=users&amp;mode=groups&amp;u=' . request_var('u', 0));
535 break;
537 default:
538 $u_back = $this->u_action;
539 break;
542 $template->assign_vars(array(
543 'S_EDIT' => true,
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,
589 'U_BACK' => $u_back,
590 'U_SWATCH' => append_sid(PHPBB_ADMIN_PATH . 'swatch.' . PHP_EXT, 'form=settings&amp;name=group_colour'),
591 'U_ACTION' => "{$this->u_action}&amp;action=$action&amp;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)),
596 return;
597 break;
599 case 'list':
601 if (!$group_id)
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&amp;action=edit&amp;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(
649 'S_LIST' => true,
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 . "&amp;action=$action&amp;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 . "&amp;g=$group_id",
658 'U_BACK' => $this->u_action,
659 'U_FIND_USERNAME' => append_sid('memberlist', 'mode=searchuser&amp;form=list&amp;field=usernames'),
660 'U_DEFAULT_ALL' => "{$this->u_action}&amp;action=default&amp;g=$group_id",
663 // Grab the members
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);
672 $pending = false;
674 while ($row = $db->sql_fetchrow($result))
676 if ($row['user_pending'] && !$pending)
678 $template->assign_block_vars('member', array(
679 'S_PENDING' => true)
682 $pending = true;
685 $template->assign_block_vars('member', array(
686 'U_USER_EDIT' => append_sid(PHPBB_ADMIN_PATH . 'index.' . PHP_EXT, "i=users&amp;action=edit&amp;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);
697 return;
698 break;
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(
748 'S_SPECIAL' => true)
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}&amp;action=list&amp;g=$group_id",
758 'U_EDIT' => "{$this->u_action}&amp;action=edit&amp;g=$group_id",
759 'U_DELETE' => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&amp;action=delete&amp;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'],