diff --git a/install/sql/mysql.sql b/install/sql/mysql.sql
index 47b445ab7..ad29264ac 100644
--- a/install/sql/mysql.sql
+++ b/install/sql/mysql.sql
@@ -862,6 +862,7 @@ INSERT INTO `bb_forums` VALUES (1, 1, 'Ваш первый форум', 'Опи
CREATE TABLE `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',
`group_name` varchar(40) NOT NULL default '',
`group_description` varchar(255) NOT NULL default '',
diff --git a/upload/admin/admin_groups.php b/upload/admin/admin_groups.php
index 7cd2a7c2b..16093fdcc 100644
--- a/upload/admin/admin_groups.php
+++ b/upload/admin/admin_groups.php
@@ -129,6 +129,7 @@ else if (!empty($_POST['group_update']))
{
// Create user_group for new group's moderator
add_user_into_group($group_id, $group_moderator);
+ $sql_ary['group_time'] = TIMENOW;
// Delete old moderator's user_group
if (isset($_POST['delete_old_moderator']))
@@ -150,6 +151,7 @@ else if (!empty($_POST['group_update']))
}
else if ($mode == 'newgroup')
{
+ $sql_ary['group_time'] = TIMENOW;
$sql_args = DB()->build_array('INSERT', $sql_ary);
// Create new group
diff --git a/upload/ajax.php b/upload/ajax.php
index 5ac160a3d..c38623cb4 100644
--- a/upload/ajax.php
+++ b/upload/ajax.php
@@ -46,6 +46,10 @@ switch ($ajax->action)
case 'manage_user':
require(INC_DIR .'functions_admin.php');
break;
+
+ case 'group_membership':
+ require(INC_DIR .'functions_group.php');
+ break;
}
// position in $ajax->valid_actions['xxx']
@@ -72,6 +76,7 @@ class ajax_common
'change_tor_status' => array('mod'),
'mod_action' => array('mod'),
'topic_tpl' => array('mod'),
+ 'group_membership' => array('mod'),
'gen_passkey' => array('user'),
'change_torrent' => array('user'),
@@ -82,8 +87,8 @@ class ajax_common
'user_register' => array('guest'),
'posts' => array('guest'),
'birthday_list' => array('guest'),
- 'get_forum_mods' => array('guest'),
-
+ 'get_forum_mods' => array('guest'),
+
);
var $action = null;
@@ -456,6 +461,75 @@ class ajax_common
$datastore->rm('moderators');
}
+ // User groups membership
+ function group_membership ()
+ {
+ global $user;
+
+ if (!$user_id = intval($this->request['user_id']) OR !$profiledata = get_userdata($user_id))
+ {
+ $this->ajax_die("invalid user_id: $user_id");
+ }
+ if (!$mode = (string) $this->request['mode'])
+ {
+ $this->ajax_die('invalid mode (empty)');
+ }
+
+ switch ($mode)
+ {
+ case 'get_group_list':
+ $sql = "
+ SELECT ug.user_pending, g.group_id, g.group_type, g.group_name, g.group_moderator, self.user_id AS can_view
+ FROM ". BB_USER_GROUP ." ug
+ INNER JOIN ". BB_GROUPS ." g ON(g.group_id = ug.group_id AND g.group_single_user = 0)
+ LEFT JOIN ". BB_USER_GROUP ." self ON(self.group_id = g.group_id AND self.user_id = {$user->id} AND self.user_pending = 0)
+ WHERE ug.user_id = $user_id
+ ORDER BY g.group_name
+ ";
+ $html = array();
+ foreach (DB()->fetch_rowset($sql) as $row)
+ {
+ $class = ($row['user_pending']) ? 'med' : 'med bold';
+ $class .= ($row['group_moderator'] == $user_id) ? ' colorMod' : '';
+ $href = "groupcp.php?g={$row['group_id']}";
+
+ if (IS_ADMIN)
+ {
+ $href .= "&u=$user_id";
+ $link = ''. htmlCHR($row['group_name']) .'';
+ $html[] = $link;
+ }
+ else
+ {
+ // скрытая группа и сам юзер не является её членом
+ if ($row['group_type'] == GROUP_HIDDEN && !$row['can_view'])
+ {
+ continue;
+ }
+ if ($row['group_moderator'] == $user->id)
+ {
+ $class .= ' selfMod';
+ $href .= "&u=$user_id"; // сам юзер модератор этой группы
+ }
+ $link = ''. htmlCHR($row['group_name']) .'';
+ $html[] = $link;
+ }
+ }
+ if ($html)
+ {
+ $this->response['group_list_html'] = '
';
+ }
+ else
+ {
+ $this->response['group_list_html'] = 'не член, либо у вас нет прав на просмотр скрытых групп';
+ }
+ break;
+
+ default:
+ $this->ajax_die("invalid mode: $mode");
+ }
+ }
+
function view_post ()
{
require(AJAX_DIR .'view_post.php');
diff --git a/upload/config.php b/upload/config.php
index 22deb70a5..c6c58c1b6 100644
--- a/upload/config.php
+++ b/upload/config.php
@@ -53,8 +53,8 @@ $bb_cfg = $tr_cfg = $page_cfg = array();
// Increase number of revision after update
$bb_cfg['tp_version'] = '2.4 (beta)';
-$bb_cfg['tp_release_state'] = 'R367';
-$bb_cfg['tp_release_date'] = '10-02-2012';
+$bb_cfg['tp_release_state'] = 'R369';
+$bb_cfg['tp_release_date'] = '11-02-2012';
// Database
$charset = 'utf8';
diff --git a/upload/groupcp.php b/upload/groupcp.php
index 8b487a8d7..3eab8a833 100644
--- a/upload/groupcp.php
+++ b/upload/groupcp.php
@@ -16,8 +16,8 @@ function generate_user_info(&$row, $date_format, $group_mod, &$from, &$posts, &$
global $lang, $images, $bb_cfg;
$from = ( !empty($row['user_from']) ) ? $row['user_from'] : '';
- $joined = bb_date($row['user_regdate'], $lang['DATE_FORMAT']);
- $user_time = ( !empty($row['user_time']) ) ? bb_date($row['user_time'], $lang['DATE_FORMAT']) : $lang['NO'];
+ $joined = bb_date($row['user_regdate']);
+ $user_time = ( !empty($row['user_time']) ) ? bb_date($row['user_time']) : $lang['NO'];
$posts = ( $row['user_posts'] ) ? $row['user_posts'] : 0;
$pm = ($bb_cfg['text_buttons']) ? ''. $lang['SEND_PM_TXTB'] .'' : '
';
@@ -175,7 +175,9 @@ if (!$group_id)
}
else
{
- bb_die($lang['NO_GROUPS_EXIST']);
+ if(IS_ADMIN)
+ {
redirect('admin/admin_groups.php');
}
+ else bb_die($lang['NO_GROUPS_EXIST']);
}
}
else if (!empty($_POST['groupstatus']))
@@ -554,7 +556,7 @@ else
'MOD_PM' => $pm,
'MOD_EMAIL' => $email,
'MOD_WWW' => $www,
- 'MOD_TIME' => $user_time,
+ 'MOD_TIME' => ( !empty($group_info['group_time']) ) ? bb_date($group_info['group_time']) : $lang['NO'],
'U_SEARCH_USER' => "search.php?mode=searchuser",
'GROUP_TYPE' => $group_type,
'S_GROUP_OPEN_TYPE' => GROUP_OPEN,
diff --git a/upload/includes/ucp/usercp_register.php b/upload/includes/ucp/usercp_register.php
index 3f36a104a..c64f2e9b9 100644
--- a/upload/includes/ucp/usercp_register.php
+++ b/upload/includes/ucp/usercp_register.php
@@ -12,6 +12,13 @@ if (IS_ADMIN)
{
require(LANG_ROOT_DIR ."lang_{$userdata['user_lang']}/lang_admin.php");
$bb_cfg['require_activation'] = false;
+
+ $new_user = (int) request_var('admin', '');
+ if($new_user) $gen_simple_header = true;
+
+ $template->assign_vars(array(
+ 'NEW_USER' => $new_user,
+ ));
}
$can_register = (IS_GUEST || IS_ADMIN);
diff --git a/upload/includes/ucp/usercp_viewprofile.php b/upload/includes/ucp/usercp_viewprofile.php
index aa7f26c43..806331a40 100644
--- a/upload/includes/ucp/usercp_viewprofile.php
+++ b/upload/includes/ucp/usercp_viewprofile.php
@@ -100,7 +100,7 @@ $template->assign_vars(array(
'USERNAME' => $profiledata['username'],
'PROFILE_USER_ID' => $profiledata['user_id'],
'USER_REGDATE' => bb_date($profiledata['user_regdate'], 'Y-m-d H:i', 'false'),
- 'POSTER_RANK' => $poster_rank,
+ 'POSTER_RANK' => ($poster_rank) ? $poster_rank : 'User',
'RANK_IMAGE' => $rank_image,
'RANK_SELECT' => $rank_select,
'POSTS' => $profiledata['user_posts'],
@@ -132,8 +132,57 @@ $template->assign_vars(array(
'S_PROFILE_ACTION' => "profile.php",
'SIGNATURE' => $signature,
+
+ 'SHOW_ROLE' => (IS_AM || $profile_user_id || $profiledata['user_active']),
+ 'GROUP_MEMBERSHIP' => false,
));
+if (IS_ADMIN)
+{
+ $group_membership = array();
+ $sql = "
+ SELECT COUNT(g.group_id) AS groups_cnt, g.group_single_user, ug.user_pending
+ FROM ". BB_USER_GROUP ." ug
+ LEFT JOIN ". BB_GROUPS ." g USING(group_id)
+ WHERE ug.user_id = {$profiledata['user_id']}
+ GROUP BY ug.user_id, g.group_single_user, ug.user_pending
+ ORDER BY NULL
+ ";
+ if ($rowset = DB()->fetch_rowset($sql))
+ {
+ $member = $pending = $single = 0;
+ foreach ($rowset as $row)
+ {
+ if (!$row['group_single_user'] && !$row['user_pending'])
+ {
+ $member = $row['groups_cnt'];
+ }
+ else if (!$row['group_single_user'] && $row['user_pending'])
+ {
+ $pending = $row['groups_cnt'];
+ }
+ else if ($row['group_single_user'])
+ {
+ $single = $row['groups_cnt'];
+ }
+ }
+ if ($member) $group_membership[] = "участник: $member";
+ if ($pending) $group_membership[] = "кандидат: $pending";
+ if ($single) $group_membership[] = "имеет индивидуальные права";
+ $group_membership = join(', ', $group_membership);
+ }
+ $template->assign_vars(array(
+ 'GROUP_MEMBERSHIP' => (bool) $group_membership,
+ 'GROUP_MEMBERSHIP_TXT' => $group_membership,
+ ));
+}
+else if (IS_MOD)
+{
+ $template->assign_vars(array(
+ 'SHOW_GROUP_MEMBERSHIP' => ($profiledata['user_level'] != USER),
+ ));
+}
+
if (!bf($profiledata['user_opt'], 'user_opt', 'allow_dls') || (IS_AM || $profile_user_id))
{
// Show users torrent-profile
diff --git a/upload/templates/default/groupcp.tpl b/upload/templates/default/groupcp.tpl
index aa0ab21d2..d7744787d 100644
--- a/upload/templates/default/groupcp.tpl
+++ b/upload/templates/default/groupcp.tpl
@@ -154,7 +154,7 @@
- {L_NO_GROUP_MEMBERS} |
+ {L_NO_GROUP_MEMBERS} |
diff --git a/upload/templates/default/usercp_viewprofile.tpl b/upload/templates/default/usercp_viewprofile.tpl
index 31617249c..7c8084628 100644
--- a/upload/templates/default/usercp_viewprofile.tpl
+++ b/upload/templates/default/usercp_viewprofile.tpl
@@ -110,11 +110,29 @@ ajax.mod_action = function(mode) {
});
}
ajax.callback.mod_action = function(data) {
- $('#ip_list').html(data.ip_list_html);
+ $('#ip_list').toggle().html(data.ip_list_html);
+}
+
+
-
+
+
{L_VIEWING_PROFILE}
@@ -145,7 +163,7 @@ ajax.callback.mod_action = function(data) {
- {POSTER_RANK}
+ {RANK_IMAGE}
{L_CONTACT} {USERNAME}
@@ -205,6 +223,25 @@ ajax.callback.mod_action = function(data) {
+
+
+ Роль: |
+
+ {POSTER_RANK}
+
+ [ членство в группах ]
+
+ |
+
+
+
+ style="display: none;">
+ Членство в группах: |
+
+ {GROUP_MEMBERSHIP_TXT}
+ |
+
+
{L_JOINED}: |
@@ -308,11 +345,11 @@ ajax.callback.mod_action = function(data) {
| {L_ACCESS}: |
{L_ACCESS_SRV_LOAD}: {IGNORE_SRV_LOAD} |
-
+
-
+
@@ -411,7 +448,7 @@ ajax.callback.mod_action = function(data) {
-
+
{L_CUR_ACTIVE_DLS} |