- a bunch of fixes
[phpbb.git] / phpBB / includes / acp / acp_groups.php
blob678a4f3bcf657f1f12f2fb14550250506f28afad
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 * @package acp
14 class acp_groups
16 var $u_action;
18 function main($id, $mode)
20 global $config, $db, $user, $auth, $template, $cache;
21 global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix, $file_uploads;
23 $user->add_lang('acp/groups');
24 $this->tpl_name = 'acp_groups';
25 $this->page_title = 'ACP_GROUPS_MANAGE';
27 include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
29 // Check and set some common vars
30 $action = (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', ''));
31 $group_id = request_var('g', 0);
32 $mark_ary = request_var('mark', array(0));
33 $name_ary = request_var('usernames', '', true);
34 $leader = request_var('leader', 0);
35 $default = request_var('default', 0);
36 $start = request_var('start', 0);
37 $update = (isset($_POST['update'])) ? true : false;
39 // Clear some vars
40 $can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && is_writeable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
41 $group_row = array();
43 // Grab basic data for group, if group_id is set and exists
44 if ($group_id)
46 $sql = 'SELECT *
47 FROM ' . GROUPS_TABLE . "
48 WHERE group_id = $group_id";
49 $result = $db->sql_query($sql);
50 $group_row = $db->sql_fetchrow($result);
51 $db->sql_freeresult($result);
53 if (!$group_row)
55 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
58 // Check if the user is allowed to manage this group if set to founder only.
59 if ($user->data['user_type'] != USER_FOUNDER && $group_row['group_founder_manage'])
61 trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
65 // Which page?
66 switch ($action)
68 case 'approve':
69 case 'demote':
70 case 'promote':
71 if (!$group_id)
73 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
76 // Approve, demote or promote
77 group_user_attributes($action, $group_id, $mark_ary, false, $group_row['group_name']);
79 switch ($action)
81 case 'demote':
82 $message = 'GROUP_MODS_DEMOTED';
83 break;
85 case 'promote':
86 $message = 'GROUP_MODS_PROMOTED';
87 break;
89 case 'approve':
90 $message = 'USERS_APPROVED';
91 break;
94 group_update_listings($group_id);
96 trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
97 break;
99 case 'default':
100 if (!$group_id)
102 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
105 if (confirm_box(true))
107 if (!sizeof($mark_ary))
109 $start = 0;
113 $sql = 'SELECT user_id
114 FROM ' . USER_GROUP_TABLE . "
115 WHERE group_id = $group_id
116 ORDER BY user_id";
117 $result = $db->sql_query_limit($sql, 200, $start);
119 $mark_ary = array();
120 if ($row = $db->sql_fetchrow($result))
124 $mark_ary[] = $row['user_id'];
126 while ($row = $db->sql_fetchrow($result));
128 group_user_attributes('default', $group_id, $mark_ary, false, $group_row['group_name'], $group_row);
130 $start = (sizeof($mark_ary) < 200) ? 0 : $start + 200;
132 else
134 $start = 0;
136 $db->sql_freeresult($result);
138 while ($start);
140 else
142 group_user_attributes('default', $group_id, $mark_ary, false, $group_row['group_name'], $group_row);
145 group_update_listings($group_id);
147 trigger_error($user->lang['GROUP_DEFS_UPDATED'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
149 else
151 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
152 'mark' => $mark_ary,
153 'g' => $group_id,
154 'i' => $id,
155 'mode' => $mode,
156 'action' => $action))
160 break;
162 case 'deleteusers':
163 case 'delete':
164 if (confirm_box(true))
166 if (!$group_id)
168 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
171 $error = '';
173 switch ($action)
175 case 'delete':
176 if (!$auth->acl_get('a_groupdel'))
178 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
181 $error = group_delete($group_id, $group_row['group_name']);
182 break;
184 case 'deleteusers':
185 $error = group_user_del($group_id, $mark_ary, false, $group_row['group_name']);
186 break;
189 $back_link = ($action == 'delete') ? $this->u_action : $this->u_action . '&amp;action=list&amp;g=' . $group_id;
191 if ($error)
193 trigger_error($user->lang[$error] . adm_back_link($back_link), E_USER_WARNING);
196 $message = ($action == 'delete') ? 'GROUP_DELETED' : 'GROUP_USERS_REMOVE';
197 trigger_error($user->lang[$message] . adm_back_link($back_link));
199 else
201 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
202 'mark' => $mark_ary,
203 'g' => $group_id,
204 'i' => $id,
205 'mode' => $mode,
206 'action' => $action))
209 break;
211 case 'addusers':
212 if (!$group_id)
214 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
217 if (!$name_ary)
219 trigger_error($user->lang['NO_USERS'] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
222 $name_ary = array_unique(explode("\n", $name_ary));
223 $group_name = ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'];
225 // Add user/s to group
226 if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
228 trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
231 $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
232 trigger_error($user->lang[$message] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id));
233 break;
235 case 'edit':
236 case 'add':
238 $data = $submit_ary = array();
240 if ($action == 'edit' && !$group_id)
242 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
245 if ($action == 'add' && !$auth->acl_get('a_groupadd'))
247 trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
250 $error = array();
251 $user->add_lang('ucp');
253 $avatar_select = basename(request_var('avatar_select', ''));
254 $category = basename(request_var('category', ''));
256 // Did we submit?
257 if ($update)
259 $group_name = request_var('group_name', '', true);
260 $group_desc = request_var('group_desc', '', true);
261 $group_type = request_var('group_type', GROUP_FREE);
263 $allow_desc_bbcode = request_var('desc_parse_bbcode', false);
264 $allow_desc_urls = request_var('desc_parse_urls', false);
265 $allow_desc_smilies = request_var('desc_parse_smilies', false);
267 $data['uploadurl'] = request_var('uploadurl', '');
268 $data['remotelink'] = request_var('remotelink', '');
269 $delete = request_var('delete', '');
271 $submit_ary = array(
272 'colour' => request_var('group_colour', ''),
273 'rank' => request_var('group_rank', 0),
274 'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
275 'legend' => isset($_REQUEST['group_legend']) ? 1 : 0,
276 'message_limit' => request_var('group_message_limit', 0),
279 if ($user->data['user_type'] == USER_FOUNDER)
281 $submit_ary['founder_manage'] = isset($_REQUEST['group_founder_manage']) ? 1 : 0;
283 else
285 $submit_ary['founder_manage'] = 0;
288 if (!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl'] || $data['remotelink'])
290 $data['width'] = request_var('width', '');
291 $data['height'] = request_var('height', '');
293 // Avatar stuff
294 $var_ary = array(
295 'uploadurl' => array('string', true, 5, 255),
296 'remotelink' => array('string', true, 5, 255),
297 'width' => array('string', true, 1, 3),
298 'height' => array('string', true, 1, 3),
301 if (!($error = validate_data($data, $var_ary)))
303 $data['user_id'] = "g$group_id";
305 if ((!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl']) && $can_upload)
307 list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_upload($data, $error);
309 else if ($data['remotelink'])
311 list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_remote($data, $error);
315 else if ($avatar_select && $config['allow_avatar_local'])
317 // check avatar gallery
318 if (is_dir($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category))
320 $submit_ary['avatar_type'] = AVATAR_GALLERY;
322 list($submit_ary['avatar_width'], $submit_ary['avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_select);
323 $submit_ary['avatar'] = $category . '/' . $avatar_select;
326 else if ($delete)
328 $submit_ary['avatar'] = '';
329 $submit_ary['avatar_type'] = $submit_ary['avatar_width'] = $submit_ary['avatar_height'] = 0;
332 if ((isset($submit_ary['avatar']) && $submit_ary['avatar'] && (!isset($group_row['group_avatar']) || $group_row['group_avatar'] != $submit_ary['avatar'])) || $delete)
334 if (isset($group_row['group_avatar']) && $group_row['group_avatar'])
336 avatar_delete('group', $group_row);
340 if (!sizeof($error))
342 // Only set the rank, colour, etc. if it's changed or if we're adding a new
343 // group. This prevents existing group members being updated if no changes
344 // were made.
346 $group_attributes = array();
347 $test_variables = array('rank', 'colour', 'avatar', 'avatar_type', 'avatar_width', 'avatar_height', 'receive_pm', 'legend', 'message_limit', 'founder_manage');
348 foreach ($test_variables as $test)
350 if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test]))
352 $group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
356 if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
358 $group_perm_from = request_var('group_perm_from', 0);
360 // Copy permissions?
361 if ($group_perm_from && $action == 'add')
363 // From the mysql documentation:
364 // 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.
365 // Due to this we stay on the safe side if we do the insertion "the manual way"
367 // Copy permisisons from/to the acl groups table (only group_id gets changed)
368 $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
369 FROM ' . ACL_GROUPS_TABLE . '
370 WHERE group_id = ' . $group_perm_from;
371 $result = $db->sql_query($sql);
373 $groups_sql_ary = array();
374 while ($row = $db->sql_fetchrow($result))
376 $groups_sql_ary[] = array(
377 'group_id' => (int) $group_id,
378 'forum_id' => (int) $row['forum_id'],
379 'auth_option_id' => (int) $row['auth_option_id'],
380 'auth_role_id' => (int) $row['auth_role_id'],
381 'auth_setting' => (int) $row['auth_setting']
384 $db->sql_freeresult($result);
386 // Now insert the data
387 $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);
389 $auth->acl_clear_prefetch();
392 $cache->destroy('sql', GROUPS_TABLE);
394 $message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
395 trigger_error($user->lang[$message] . adm_back_link($this->u_action));
399 if (sizeof($error))
401 $group_rank = $submit_ary['rank'];
403 $group_desc_data = array(
404 'text' => $group_desc,
405 'allow_bbcode' => $allow_desc_bbcode,
406 'allow_smilies' => $allow_desc_smilies,
407 'allow_urls' => $allow_desc_urls
411 else if (!$group_id)
413 $group_name = request_var('group_name', '', true);
414 $group_desc_data = array(
415 'text' => '',
416 'allow_bbcode' => true,
417 'allow_smilies' => true,
418 'allow_urls' => true
420 $group_rank = 0;
421 $group_type = GROUP_OPEN;
423 else
425 $group_name = $group_row['group_name'];
426 $group_desc_data = generate_text_for_edit($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_options']);
427 $group_type = $group_row['group_type'];
428 $group_rank = $group_row['group_rank'];
431 $sql = 'SELECT *
432 FROM ' . RANKS_TABLE . '
433 WHERE rank_special = 1
434 ORDER BY rank_title';
435 $result = $db->sql_query($sql);
437 $rank_options = '<option value="0"' . ((!$group_rank) ? ' selected="selected"' : '') . '>' . $user->lang['USER_DEFAULT'] . '</option>';
439 while ($row = $db->sql_fetchrow($result))
441 $selected = ($group_rank && $row['rank_id'] == $group_rank) ? ' selected="selected"' : '';
442 $rank_options .= '<option value="' . $row['rank_id'] . '"' . $selected . '>' . $row['rank_title'] . '</option>';
444 $db->sql_freeresult($result);
446 $type_free = ($group_type == GROUP_FREE) ? ' checked="checked"' : '';
447 $type_open = ($group_type == GROUP_OPEN) ? ' checked="checked"' : '';
448 $type_closed = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
449 $type_hidden = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
451 if (isset($group_row['group_avatar']) && $group_row['group_avatar'])
453 $avatar_img = '';
455 switch ($group_row['group_avatar_type'])
457 case AVATAR_UPLOAD:
458 $avatar_img = $phpbb_root_path . $config['avatar_path'] . '/';
459 break;
461 case AVATAR_GALLERY:
462 $avatar_img = $phpbb_root_path . $config['avatar_gallery_path'] . '/';
463 break;
466 $avatar_img .= $group_row['group_avatar'];
467 $avatar_img = '<img src="' . $avatar_img . '" width="' . $group_row['group_avatar_width'] . '" height="' . $group_row['group_avatar_height'] . '" alt="" />';
469 else
471 $avatar_img = '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />';
474 $display_gallery = (isset($_POST['display_gallery'])) ? true : false;
476 if ($config['allow_avatar_local'] && $display_gallery)
478 avatar_gallery($category, $avatar_select, 4);
481 $back_link = request_var('back_link', '');
483 switch ($back_link)
485 case 'acp_users_groups':
486 $u_back = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=groups&amp;u=' . request_var('u', 0));
487 break;
489 default:
490 $u_back = $this->u_action;
491 break;
494 $template->assign_vars(array(
495 'S_EDIT' => true,
496 'S_ADD_GROUP' => ($action == 'add') ? true : false,
497 'S_INCLUDE_SWATCH' => true,
498 'S_CAN_UPLOAD' => $can_upload,
499 'S_ERROR' => (sizeof($error)) ? true : false,
500 'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
501 'S_DISPLAY_GALLERY' => ($config['allow_avatar_local'] && !$display_gallery) ? true : false,
502 'S_IN_GALLERY' => ($config['allow_avatar_local'] && $display_gallery) ? true : false,
503 'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
505 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
506 'GROUP_NAME' => ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
507 'GROUP_INTERNAL_NAME' => $group_name,
508 'GROUP_DESC' => $group_desc_data['text'],
509 'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
510 'GROUP_FOUNDER_MANAGE' => (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '',
511 'GROUP_LEGEND' => (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '',
512 'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
513 'GROUP_COLOUR' => (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '',
516 'S_DESC_BBCODE_CHECKED' => $group_desc_data['allow_bbcode'],
517 'S_DESC_URLS_CHECKED' => $group_desc_data['allow_urls'],
518 'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
520 'S_RANK_OPTIONS' => $rank_options,
521 'S_GROUP_OPTIONS' => group_select_options(0),
522 'AVATAR_IMAGE' => $avatar_img,
523 'AVATAR_MAX_FILESIZE' => $config['avatar_filesize'],
524 'GROUP_AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '',
525 'GROUP_AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '',
527 'GROUP_TYPE_FREE' => GROUP_FREE,
528 'GROUP_TYPE_OPEN' => GROUP_OPEN,
529 'GROUP_TYPE_CLOSED' => GROUP_CLOSED,
530 'GROUP_TYPE_HIDDEN' => GROUP_HIDDEN,
531 'GROUP_TYPE_SPECIAL' => GROUP_SPECIAL,
533 'GROUP_FREE' => $type_free,
534 'GROUP_OPEN' => $type_open,
535 'GROUP_CLOSED' => $type_closed,
536 'GROUP_HIDDEN' => $type_hidden,
538 'U_BACK' => $u_back,
539 'U_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&amp;name=group_colour'),
540 'UA_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&name=group_colour', false),
541 'U_ACTION' => "{$this->u_action}&amp;action=$action&amp;g=$group_id",
542 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)),
546 return;
547 break;
549 case 'list':
551 if (!$group_id)
553 trigger_error($user->lang['NO_GROUP'] . adm_back_link($this->u_action), E_USER_WARNING);
556 $this->page_title = 'GROUP_MEMBERS';
558 // Total number of group leaders
559 $sql = 'SELECT COUNT(user_id) AS total_leaders
560 FROM ' . USER_GROUP_TABLE . "
561 WHERE group_id = $group_id
562 AND group_leader = 1";
563 $result = $db->sql_query($sql);
564 $total_leaders = (int) $db->sql_fetchfield('total_leaders');
565 $db->sql_freeresult($result);
567 // Total number of group members (non-leaders)
568 $sql = 'SELECT COUNT(user_id) AS total_members
569 FROM ' . USER_GROUP_TABLE . "
570 WHERE group_id = $group_id
571 AND group_leader <> 1";
572 $result = $db->sql_query($sql);
573 $total_members = (int) $db->sql_fetchfield('total_members');
574 $db->sql_freeresult($result);
576 // Grab the members
577 $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
578 FROM ' . USERS_TABLE . ' u, ' . USER_GROUP_TABLE . " ug
579 WHERE ug.group_id = $group_id
580 AND u.user_id = ug.user_id
581 ORDER BY ug.group_leader DESC, ug.user_pending ASC, u.username_clean";
582 $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
584 $leader = $member = 0;
585 $group_data = array(
586 'leader' => array(),
587 'member' => array(),
590 while ($row = $db->sql_fetchrow($result))
592 $type = ($row['group_leader']) ? 'leader' : 'member';
594 $group_data[$type][$$type]['user_id'] = $row['user_id'];
595 $group_data[$type][$$type]['group_id'] = $row['group_id'];
596 $group_data[$type][$$type]['username'] = $row['username'];
597 $group_data[$type][$$type]['user_regdate'] = $row['user_regdate'];
598 $group_data[$type][$$type]['user_posts'] = $row['user_posts'];
599 $group_data[$type][$$type]['user_pending'] = ($row['user_pending']) ? 1 : 0;
601 $$type++;
603 $db->sql_freeresult($result);
605 $s_action_options = '';
606 $options = array('default' => 'DEFAULT', 'approve' => 'APPROVE', 'demote' => 'DEMOTE', 'promote' => 'PROMOTE', 'deleteusers' => 'DELETE');
608 foreach ($options as $option => $lang)
610 $s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
613 $template->assign_vars(array(
614 'S_LIST' => true,
615 'S_GROUP_SPECIAL' => ($group_row['group_type'] == GROUP_SPECIAL) ? true : false,
616 'S_ACTION_OPTIONS' => $s_action_options,
618 'S_ON_PAGE' => on_page($total_members, $config['topics_per_page'], $start),
619 'PAGINATION' => generate_pagination($this->u_action . "&amp;action=$action&amp;g=$group_id", $total_members, $config['topics_per_page'], $start, true),
620 'GROUP_NAME' => ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'],
622 'U_ACTION' => $this->u_action . "&amp;g=$group_id",
623 'U_BACK' => $this->u_action,
624 'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=list&amp;field=usernames'),
625 'UA_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=list&field=usernames', false),
626 'U_DEFAULT_ALL' => "{$this->u_action}&amp;action=default&amp;g=$group_id")
629 foreach ($group_data['leader'] as $row)
631 $template->assign_block_vars('leader', array(
632 'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
634 'USERNAME' => $row['username'],
635 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
636 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
637 'USER_POSTS' => $row['user_posts'],
638 'USER_ID' => $row['user_id'])
642 $pending = false;
644 foreach ($group_data['member'] as $row)
646 if ($row['user_pending'] && !$pending)
648 $template->assign_block_vars('member', array(
649 'S_PENDING' => true)
652 $pending = true;
655 $template->assign_block_vars('member', array(
656 'U_USER_EDIT' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;action=edit&amp;u={$row['user_id']}"),
658 'USERNAME' => $row['username'],
659 'S_GROUP_DEFAULT' => ($row['group_id'] == $group_id) ? true : false,
660 'JOINED' => ($row['user_regdate']) ? $user->format_date($row['user_regdate']) : ' - ',
661 'USER_POSTS' => $row['user_posts'],
662 'USER_ID' => $row['user_id'])
666 return;
667 break;
670 $template->assign_vars(array(
671 'U_ACTION' => $this->u_action,
672 'S_GROUP_ADD' => ($auth->acl_get('a_groupadd')) ? true : false)
675 $sql = 'SELECT g.group_id, g.group_name, g.group_type, COUNT(ug.user_id) AS total_members
676 FROM ' . GROUPS_TABLE . ' g
677 LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (g.group_id = ug.group_id)
678 GROUP BY g.group_id, g.group_name, g.group_type
679 ORDER BY g.group_type ASC, g.group_name';
680 $result = $db->sql_query($sql);
682 $special = $normal = 0;
683 $group_ary = array();
685 while ($row = $db->sql_fetchrow($result))
687 $type = ($row['group_type'] == GROUP_SPECIAL) ? 'special' : 'normal';
689 $group_ary[$type][$$type]['group_id'] = $row['group_id'];
690 $group_ary[$type][$$type]['group_name'] = $row['group_name'];
691 $group_ary[$type][$$type]['group_type'] = $row['group_type'];
692 $group_ary[$type][$$type]['total_members'] = $row['total_members'];
694 $$type++;
696 $db->sql_freeresult($result);
698 ksort($group_ary);
700 $special_toggle = false;
701 foreach ($group_ary as $type => $row_ary)
703 if ($type == 'special')
705 $template->assign_block_vars('groups', array(
706 'S_SPECIAL' => true)
710 foreach ($row_ary as $row)
712 $group_id = $row['group_id'];
713 $group_name = (!empty($user->lang['G_' . $row['group_name']]))? $user->lang['G_' . $row['group_name']] : $row['group_name'];
715 $template->assign_block_vars('groups', array(
716 'U_LIST' => "{$this->u_action}&amp;action=list&amp;g=$group_id",
717 'U_EDIT' => "{$this->u_action}&amp;action=edit&amp;g=$group_id",
718 'U_DELETE' => ($auth->acl_get('a_groupdel')) ? "{$this->u_action}&amp;action=delete&amp;g=$group_id" : '',
720 'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
722 'GROUP_NAME' => $group_name,
723 'TOTAL_MEMBERS' => $row['total_members'],