Переработка системы групп пользователей

Signed-off-by: Dark Nightmare <gtdarknightmare@gmail.com>
This commit is contained in:
Dark Nightmare 2014-08-02 19:08:52 +06:00
commit b8cb7633e6
10 changed files with 257 additions and 55 deletions

View file

@ -790,13 +790,14 @@ CREATE TABLE IF NOT EXISTS `bb_groups` (
`group_id` mediumint(8) NOT NULL AUTO_INCREMENT,
`group_time` int(11) NOT NULL DEFAULT '0',
`group_type` tinyint(4) NOT NULL DEFAULT '1',
`release_group` tinyint(4) NOT NULL DEFAULT '0',
`group_name` varchar(40) NOT NULL DEFAULT '',
`group_description` varchar(255) NOT NULL DEFAULT '',
`group_description` text NOT NULL DEFAULT '',
`group_moderator` mediumint(8) NOT NULL DEFAULT '0',
`group_single_user` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`group_id`),
KEY `group_single_user` (`group_single_user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------

View file

@ -52,9 +52,11 @@ switch ($ajax->action)
require(INC_DIR . 'functions_admin.php');
break;
case 'manage_group':
case 'group_membership':
require(INC_DIR . 'functions_group.php');
break;
}
// position in $ajax->valid_actions['xxx']
@ -78,6 +80,7 @@ class ajax_common
'change_user_opt' => array('admin'),
'manage_user' => array('admin'),
'manage_admin' => array('admin'),
'manage_group' => array('user'),
'mod_action' => array('mod'),
'topic_tpl' => array('mod'),
@ -336,7 +339,10 @@ class ajax_common
{
require(AJAX_DIR . 'group_membership.php');
}
function manage_group()
{
require(AJAX_DIR . 'edit_group_profile.php');
}
function post_mod_comment()
{
require(AJAX_DIR . 'post_mod_comment.php');

View file

@ -0,0 +1,47 @@
<?php
if (!defined('IN_AJAX')) die(basename(__FILE__));
global $bb_cfg, $lang;
if (!$group_id = intval($this->request['group_id']) OR !$group_info = get_group_data($group_id))
{
$this->ajax_die($lang['NO_GROUP_ID_SPECIFIED']);
}
if (!$mode = (string) $this->request['mode'])
{
$this->ajax_die('No mode specified');
}
$value = $this->request['value'] = (string) (isset($this->request['value'])) ? $this->request['value'] : 0;
// TODO Check for permissions
switch ($mode)
{
case 'group_name':
case 'group_description':
$value = htmlCHR($value);
$this->response['new_value'] = $value;
break;
case 'group_type':
$this->response['new_value'] = $value;
break;
case 'release_group':
$this->response['new_value'] = $value;
break;
default:
$this->ajax_die('Unknown mode');
}
$value_sql = DB()->escape($value, true);
DB()->query("UPDATE ". BB_GROUPS ." SET $mode = $value_sql WHERE group_id = $group_id LIMIT 1");
// Just for debug
/*
$this->response['new_value'] = $value;
$this->response['group_id'] = $group_id;
$this->response['mode'] = $mode;
*/

91
upload/group-config.php Normal file
View file

@ -0,0 +1,91 @@
<?php
define('IN_FORUM', true);
define('BB_SCRIPT', 'group-config');
define('BB_ROOT', './');
require(BB_ROOT .'common.php');
require(INC_DIR .'functions_group.php');
$page_cfg['include_bbcode_js'] = true;
// Start session management
$user->session_start(array('req_login' => true));
$group_id = isset($_REQUEST[POST_GROUPS_URL]) ? intval($_REQUEST[POST_GROUPS_URL]) : null;
$group_info = array();
$is_moderator = false;
if ($group_id)
{
if (!$group_info = get_group_data($group_id))
{
bb_die($lang['GROUP_NOT_EXIST']);
}
if (!$group_info['group_id'] || !$group_info['group_moderator'] || !$group_info['moderator_name'])
{
bb_die("Invalid group data [group_id: $group_id]");
}
$is_moderator = ($userdata['user_id'] == $group_info['group_moderator'] || IS_ADMIN);
}
if ($is_moderator)
{
// TODO Creation Date, Admin panel, Avatar, Some tasty features
$group_type = '';
if ($group_info['group_type'] == GROUP_OPEN)
{
$group_type = $lang['GROUP_OPEN'];
}
elseif ($group_info['group_type'] == GROUP_CLOSED)
{
$group_type = $lang['GROUP_CLOSED'];
}
elseif ($group_info['group_type'] == GROUP_HIDDEN)
{
$group_type = $lang['GROUP_HIDDEN'];
}
$s_hidden_fields = '<input type="hidden" name="'. POST_GROUPS_URL .'" value="'. $group_id .'" />';
$template->assign_vars(array(
'PAGE_TITLE' => $lang['GROUP_CONTROL_PANEL'],
'GROUP_NAME' => htmlCHR($group_info['group_name']),
'GROUP_ID' => $group_id,
'GROUP_DESCRIPTION' => htmlCHR($group_info['group_description']),
'U_GROUP_URL' => GROUP_URL . $group_id,
'GROUP_TYPE' => $group_type,
'S_GROUP_OPEN_TYPE' => GROUP_OPEN,
'S_GROUP_CLOSED_TYPE' => GROUP_CLOSED,
'S_GROUP_HIDDEN_TYPE' => GROUP_HIDDEN,
'S_GROUP_OPEN_CHECKED' => ($group_info['group_type'] == GROUP_OPEN) ? ' checked="checked"' : '',
'S_GROUP_CLOSED_CHECKED' => ($group_info['group_type'] == GROUP_CLOSED) ? ' checked="checked"' : '',
'S_GROUP_HIDDEN_CHECKED' => ($group_info['group_type'] == GROUP_HIDDEN) ? ' checked="checked"' : '',
'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_GROUPCP_ACTION' => "groupcp.php?" . POST_GROUPS_URL . "=$group_id",
'RELEASE_GROUP' => ($group_info['release_group']) ? true : false,
));
$template->set_filenames(array('body' => 'group-config.tpl'));
$template->assign_vars(array('PAGE_TITLE' => 'Настройка группы'));
require(PAGE_HEADER);
$template->pparse('body');
require(PAGE_FOOTER);
}
else
{
$redirect = 'index.php';
if ($group_id)
{
$redirect = GROUP_URL . $group_id;
}
redirect($redirect);
}

View file

@ -4,14 +4,16 @@ define('IN_FORUM', true);
define('BB_SCRIPT', 'groupcp');
define('BB_ROOT', './');
require(BB_ROOT ."common.php");
require(INC_DIR .'bbcode.php');
require(INC_DIR .'functions_group.php');
$page_cfg['include_bbcode_js'] = true;
$page_cfg['use_tablesorter'] = true;
$s_member_groups = $s_pending_groups = $s_member_groups_opt = $s_pending_groups_opt = '';
$select_sort_mode = $select_sort_order = '';
function generate_user_info(&$row, $date_format, $group_mod, &$from, &$posts, &$joined, &$pm, &$email, &$www, &$user_time)
function generate_user_info(&$row, $date_format, $group_mod, &$from, &$posts, &$joined, &$pm, &$email, &$www, &$user_time, &$avatar)
{
global $lang, $images, $bb_cfg;
@ -20,6 +22,7 @@ function generate_user_info(&$row, $date_format, $group_mod, &$from, &$posts, &$
$user_time = ( !empty($row['user_time']) ) ? bb_date($row['user_time']) : $lang['NONE'];
$posts = ( $row['user_posts'] ) ? $row['user_posts'] : 0;
$pm = ($bb_cfg['text_buttons']) ? '<a class="txtb" href="'. (PM_URL . "?mode=post&amp;". POST_USERS_URL ."=".$row['user_id']) .'">'. $lang['SEND_PM_TXTB'] .'</a>' : '<a href="' . (PM_URL . "?mode=post&amp;". POST_USERS_URL ."=".$row['user_id']) .'"><img src="' . $images['icon_pm'] . '" alt="' . $lang['SEND_PRIVATE_MESSAGE'] . '" title="' . $lang['SEND_PRIVATE_MESSAGE'] . '" border="0" /></a>';
$avatar = get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar'), true, 50, 50);
if (bf($row['user_opt'], 'user_opt', 'user_viewemail') || $group_mod)
{
@ -184,34 +187,6 @@ if (!$group_id)
else bb_die($lang['NO_GROUPS_EXIST']);
}
}
else if (!empty($_POST['groupstatus']))
{
if (!$is_moderator)
{
bb_die($lang['NOT_GROUP_MODERATOR']);
}
$new_group_type = (int) $_POST['group_type'];
if (!in_array($new_group_type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN), true))
{
bb_die("Invalid group type: $new_group_type");
}
DB()->query("
UPDATE ". BB_GROUPS ." SET
group_type = $new_group_type
WHERE group_id = $group_id
AND group_single_user = 0
LIMIT 1
");
$message = $lang['GROUP_TYPE_UPDATED'] .'<br /><br />';
$message .= sprintf($lang['CLICK_RETURN_GROUP'], '<a href="'. GROUP_URL ."$group_id" .'">', '</a>') .'<br /><br />';
$message .= sprintf($lang['CLICK_RETURN_INDEX'], '<a href="'. "index.php" .'">', '</a>');
bb_die($message);
}
else if (@$_POST['joingroup'])
{
if ($group_info['group_type'] != GROUP_OPEN)
@ -420,7 +395,7 @@ else
// Members
$group_members = DB()->fetch_rowset("
SELECT u.username, u.user_rank, u.user_id, u.user_opt, u.user_posts, u.user_regdate, u.user_from, u.user_website, u.user_email, ug.user_pending, ug.user_time
SELECT u.username, u.avatar_ext_id, u.user_rank, u.user_id, u.user_opt, u.user_posts, u.user_regdate, u.user_from, u.user_website, u.user_email, ug.user_pending, ug.user_time
FROM ". BB_USER_GROUP ." ug, ". BB_USERS ." u
WHERE ug.group_id = $group_id
AND ug.user_pending = 0
@ -513,7 +488,7 @@ else
$username = $group_moderator['username'];
$user_id = $group_moderator['user_id'];
generate_user_info($group_moderator, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $pm, $email, $www, $user_time);
generate_user_info($group_moderator, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $pm, $email, $www, $user_time, $avatar);
$group_type = '';
if ($group_info['group_type'] == GROUP_OPEN)
@ -535,9 +510,10 @@ else
'GROUP_INFO' => true,
'PAGE_TITLE' => $lang['GROUP_CONTROL_PANEL'],
'GROUP_NAME' => htmlCHR($group_info['group_name']),
'GROUP_DESCRIPTION' => $group_info['group_description'],
'GROUP_DETAILS' => $group_details,
'GROUP_DESCRIPTION' => bbcode2html($group_info['group_description']),
'GROUP_DETAILS' => $group_details,
'MOD_USER' => profile_url($group_moderator),
'MOD_AVATAR' => $avatar,
'MOD_FROM' => $from,
'MOD_JOINED' => $joined,
'MOD_POSTS' => $posts,
@ -546,6 +522,7 @@ else
'MOD_WWW' => $www,
'MOD_TIME' => (!empty($group_info['group_time'])) ? bb_date($group_info['group_time']) : $lang['NONE'],
'U_SEARCH_USER' => "search.php?mode=searchuser",
'U_GROUP_CONFIG' => "group-config.php?g=$group_id",
'GROUP_TYPE' => $group_type,
'S_GROUP_OPEN_TYPE' => GROUP_OPEN,
'S_GROUP_CLOSED_TYPE' => GROUP_CLOSED,
@ -564,7 +541,7 @@ else
{
$user_id = $member['user_id'];
generate_user_info($member, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $pm, $email, $www, $user_time);
generate_user_info($member, $bb_cfg['default_dateformat'], $is_moderator, $from, $posts, $joined, $pm, $email, $www, $user_time, $avatar);
if ($group_info['group_type'] != GROUP_HIDDEN || $is_group_member || $is_moderator)
{
@ -574,6 +551,7 @@ else
'ROW_NUMBER' => $i + ( $start + 1 ),
'ROW_CLASS' => $row_class,
'USER' => profile_url($member),
'AVATAR_IMG' => $avatar,
'FROM' => $from,
'JOINED' => $joined,
'POSTS' => $posts,

View file

@ -699,6 +699,7 @@ $lang['ORDER'] = 'Order';
// Group control panel
//
$lang['GROUP_CONTROL_PANEL'] = 'User Groups';
$lang['GROUP_RETURN'] = 'Return to User Group page';
$lang['MEMBERSHIP_DETAILS'] = 'Group Membership Details';
$lang['JOIN_A_GROUP'] = 'Join a Group';
@ -710,6 +711,9 @@ $lang['GROUP_MEMBERS'] = 'Group Members';
$lang['GROUP_MODERATOR'] = 'Group Moderator';
$lang['PENDING_MEMBERS'] = 'Pending Members';
$lang['GROUP_TIME'] = 'Created';
$lang['RELEASE_GROUP'] = 'Release Group';
$lang['GROUP_TYPE'] = 'Group type';
$lang['GROUP_OPEN'] = 'Open group';
$lang['GROUP_CLOSED'] = 'Closed group';
@ -724,6 +728,7 @@ $lang['GROUP_MEMBER_HIDDEN'] = 'Hidden groups';
$lang['NO_GROUPS_EXIST'] = 'No Groups Exist';
$lang['GROUP_NOT_EXIST'] = 'That user group does not exist';
$lang['NO_GROUP_ID_SPECIFIED'] = 'Group ID is not specified';
$lang['NO_GROUP_MEMBERS'] = 'This group has no members';
$lang['HIDDEN_GROUP_MEMBERS'] = 'This group is hidden; you cannot view its membership';

View file

@ -699,6 +699,7 @@ $lang['ORDER'] = ''; // не нужно, в английском использ
// Group control panel
//
$lang['GROUP_CONTROL_PANEL'] = 'Группы';
$lang['GROUP_RETURN'] = 'Вернуться на страницу группы';
$lang['MEMBERSHIP_DETAILS'] = 'Информация о членстве в группах';
$lang['JOIN_A_GROUP'] = 'Вступить в группу';
@ -710,6 +711,9 @@ $lang['GROUP_MEMBERS'] = 'Члены группы';
$lang['GROUP_MODERATOR'] = 'Модератор группы';
$lang['PENDING_MEMBERS'] = 'Кандидаты в члены группы';
$lang['GROUP_TIME'] = 'Дата создания';
$lang['RELEASE_GROUP'] = 'Релиз группа';
$lang['GROUP_TYPE'] = 'Тип группы';
$lang['GROUP_OPEN'] = 'Группа с открытым членством';
$lang['GROUP_CLOSED'] = 'Группа с закрытым членством';
@ -724,6 +728,7 @@ $lang['GROUP_MEMBER_HIDDEN'] = 'Скрытые группы';
$lang['NO_GROUPS_EXIST'] = 'Нет ни одной группы';
$lang['GROUP_NOT_EXIST'] = 'Такой группы не существует';
$lang['NO_GROUP_ID_SPECIFIED'] = 'Не указан ID группы';
$lang['NO_GROUP_MEMBERS'] = 'В этой группе нет ни одного члена';
$lang['HIDDEN_GROUP_MEMBERS'] = 'Эта группа скрыта, вы не можете посмотреть ее состав';

View file

@ -699,6 +699,7 @@ $lang['ORDER'] = ''; // не потрібно, в англійській вик
// Group control panel
//
$lang['GROUP_CONTROL_PANEL'] = 'Групи';
$lang['GROUP_RETURN'] = 'Вернуться на страницу группы';
$lang['MEMBERSHIP_DETAILS'] = 'Інформація про членство в групах';
$lang['JOIN_A_GROUP'] = 'Вступити в групу';
@ -715,6 +716,9 @@ $lang['GROUP_OPEN'] = 'Група з відкритим членством';
$lang['GROUP_CLOSED'] = 'Група з закритим членством';
$lang['GROUP_HIDDEN'] = 'Прихована група';
$lang['GROUP_TIME'] = 'Дата создания';
$lang['RELEASE_GROUP'] = 'Релиз группа';
$lang['GROUP_MEMBER_MOD'] = 'Є модератором груп';
$lang['GROUP_MEMBER_MEMBER'] = 'Є членом груп';
$lang['GROUP_MEMBER_PENDING'] = 'Кандидат у члени груп';
@ -724,6 +728,7 @@ $lang['GROUP_MEMBER_HIDDEN'] = 'Приховані групи';
$lang['NO_GROUPS_EXIST'] = 'Немає ні однієї групи';
$lang['GROUP_NOT_EXIST'] = 'Такої групи не існує';
$lang['NO_GROUP_ID_SPECIFIED'] = 'Не указан ID группы';
$lang['NO_GROUP_MEMBERS'] = 'В цій групі немає жодного члена';
$lang['HIDDEN_GROUP_MEMBERS'] = 'Ця група прихована, ви не можете побачити її складу';

View file

@ -0,0 +1,63 @@
<script type="text/javascript">
function manage_group(mode, value){
ajax.exec({
action : 'manage_group',
mode : mode,
group_id : {GROUP_ID},
value : value
});
ajax.callback.manage_group = function(data){
console.log(data);
}
}
</script>
<h1 class="pagetitle">{PAGE_TITLE}<!-- IF GROUP_NAME --> :: {GROUP_NAME}<!-- ENDIF --></h1>
<p class="nav"><a href="{U_GROUP_URL}">{L_GROUP_RETURN}</a></p>
<form action="{S_GROUPCP_ACTION}" method="post">
{S_HIDDEN_FIELDS}
<table class="forumline pad_4">
<col class="row1" width="20%">
<col class="row2" width="100%">
<tr>
<th colspan="2">{L_GROUP_INFORMATION}</th>
</tr>
<tr>
<td>{L_GROUP_NAME}:</td>
<td><input type="text" id="group_name" size="80" value="{GROUP_NAME}" onblur="javascript:manage_group(this.id, this.value, this.id);" /></td>
</tr>
<tr>
<td>{L_GROUP_DESCRIPTION}:</td>
<td><div id="preview"></div>
<p>
<textarea cols="80" id="group_description" rows="6" >{GROUP_DESCRIPTION}</textarea>
</p>
<p>
<input type="button" value="{L_AJAX_PREVIEW}" onclick="ajax.exec({ action: 'posts', type: 'view_message', message: $('textarea#group_description').val()});ajax.callback.posts=function(data){$('div#preview').show().html(data.message_html)}">
<input type="button" value="{L_SAVE}" onclick="javascript:manage_group('group_description',$('textarea#group_description').val())">
</p>
</td>
</tr>
<tr>
<td>{L_GROUP_TYPE}:</td>
<td>
<p>
<label><input type="radio" name="group_type" onchange="javascript:manage_group(this.name,this.value)" value="{S_GROUP_OPEN_TYPE}" {S_GROUP_OPEN_CHECKED} />{L_GROUP_OPEN}</label> &nbsp;&nbsp;
<label><input type="radio" name="group_type" onchange="javascript:manage_group(this.name,this.value)" value="{S_GROUP_CLOSED_TYPE}" {S_GROUP_CLOSED_CHECKED} />{L_GROUP_CLOSED}</label> &nbsp;&nbsp;
<label><input type="radio" name="group_type" onchange="javascript:manage_group(this.name,this.value)" value="{S_GROUP_HIDDEN_TYPE}" {S_GROUP_HIDDEN_CHECKED} />{L_GROUP_HIDDEN}</label>
</p>
</td>
</tr>
<tr>
<td>{L_RELEASE_GROUP}</td>
<td>
<label><input type="radio" name="release_group" value="1" onclick="javascript:manage_group(this.name,this.value)" <!-- IF RELEASE_GROUP -->checked="checked"<!-- ENDIF --> />{L_YES}</label>&nbsp;&nbsp;
<label><input type="radio" name="release_group" value="0" onclick="javascript:manage_group(this.name,this.value)" <!-- IF not RELEASE_GROUP -->checked="checked"<!-- ENDIF --> />{L_NO}</label>
</td>
</tr>
<tr>
<td>{L_AVATAR}</td>
<td><input type="file" />&nbsp;<input class="mainoption" type="submit" name="avatarupload" value="{L_UPLOAD_AVATAR_FILE}" /></td>
</tr>
</table>
</form>

View file

@ -54,16 +54,21 @@
<tr>
<th colspan="2">{L_GROUP_INFORMATION}</th>
</tr>
<tr><td colspan="2"><h2>{GROUP_NAME}</h2></td></tr>
<tr>
<td>{L_GROUP_NAME}:</td>
<td><b>{GROUP_NAME}</b></td>
<td align="center" valign="top">
<div style="height:100px;width:100px;background:#285e8e;">&nbsp;</div>
</td>
<td valign="top">
<!-- IF GROUP_DESCRIPTION -->
{GROUP_DESCRIPTION}
<!-- ENDIF / GROUP_DESCRIPTION -->
</td>
</tr>
<!-- IF GROUP_DESCRIPTION -->
<tr>
<td>{L_GROUP_DESCRIPTION}:</td>
<td>{GROUP_DESCRIPTION}</td>
<td>{L_GROUP_TIME}</td>
<td>{MOD_TIME}</td>
</tr>
<!-- ENDIF / GROUP_DESCRIPTION -->
<tr>
<td>{L_GROUP_MEMBERSHIP}:</td>
<td><p>{GROUP_DETAILS}
@ -78,15 +83,8 @@
</tr>
<!-- BEGIN switch_mod_option -->
<tr>
<td>{L_GROUP_TYPE}:</td>
<td>
<p>
<label><input type="radio" name="group_type" value="{S_GROUP_OPEN_TYPE}" {S_GROUP_OPEN_CHECKED} />{L_GROUP_OPEN}</label> &nbsp;&nbsp;
<label><input type="radio" name="group_type" value="{S_GROUP_CLOSED_TYPE}" {S_GROUP_CLOSED_CHECKED} />{L_GROUP_CLOSED}</label> &nbsp;&nbsp;
<label><input type="radio" name="group_type" value="{S_GROUP_HIDDEN_TYPE}" {S_GROUP_HIDDEN_CHECKED} />{L_GROUP_HIDDEN}</label>
&nbsp; <input class="mainoption" type="submit" name="groupstatus" value="{L_UPDATE}" />
</p>
</td>
<td>Настройка группы:</td>
<td><a href="{U_GROUP_CONFIG}">Перейти в панель управления группой</a></td>
</tr>
<!-- END switch_mod_option -->
</table>
@ -102,6 +100,7 @@
<thead>
<tr>
<th class="{sorter: 'digit'}" ><b class="tbs-text">#</b></th>
<th class="{sorter: false}" ><b class="tbs-text">{L_AVATAR}</b></th>
<th class="{sorter: 'text'}" ><b class="tbs-text">{L_USERNAME}</b></th>
<th class="{sorter: false}" ><b class="tbs-text">{L_PM}</b></th>
<th class="{sorter: 'text'}" ><b class="tbs-text">{L_EMAIL}</b></th>
@ -113,10 +112,11 @@
<th class="{sorter: false}" ><b class="tbs-text">#</b></th>
</tr>
<tr>
<td colspan="10" class="catTitle">{L_GROUP_MODERATOR}</td>
<td colspan="11" class="catTitle">{L_GROUP_MODERATOR}</td>
</tr>
<tr class="row1 tCenter">
<td width="3%">{ROW_NUMBER}</td>
<td width="3%" align="center">{MOD_AVATAR}</td>
<td><b>{MOD_USER}</b></td>
<td>{MOD_PM}</td>
<td>{MOD_EMAIL}</td>
@ -128,13 +128,14 @@
<td width="3%">&nbsp;</td>
</tr>
<tr>
<td colspan="10" class="catTitle">{L_GROUP_MEMBERS}</td>
<td colspan="11" class="catTitle">{L_GROUP_MEMBERS}</td>
</tr>
</thead>
<!-- BEGIN member -->
<tr class="{member.ROW_CLASS} tCenter">
<td width="3%">{member.ROW_NUMBER}</td>
<td width="3%" align="center">{member.AVATAR_IMG}</td>
<td>{member.USER}</td>
<td>{member.PM}</td>
<td>{member.EMAIL}</td>
@ -166,7 +167,7 @@
<!-- BEGIN switch_mod_option -->
<tfoot>
<tr>
<td colspan="10" class="cat" style="padding: 2px 12px;">
<td colspan="11" class="cat" style="padding: 2px 12px;">
<p id="add_group_member" class="floatL">
<input type="text" name="username" maxlength="50" size="20" />
<input type="submit" name="add" value="{L_ADD_MEMBER}" class="mainoption" />