aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--admin/include/functions.php2
-rw-r--r--admin/user_list.php373
-rw-r--r--doc/ChangeLog17
-rw-r--r--include/config_default.inc.php4
4 files changed, 217 insertions, 179 deletions
diff --git a/admin/include/functions.php b/admin/include/functions.php
index 5f59216bf..2b7abb094 100644
--- a/admin/include/functions.php
+++ b/admin/include/functions.php
@@ -708,7 +708,7 @@ DESCRIBE '.$tablename.'
CREATE TABLE '.$temporary_tablename.'
(
'.implode(",\n", $columns).',
-PRIMARY KEY (id)
+PRIMARY KEY ('.implode(',', $dbfields['primary']).')
)
;';
pwg_query($query);
diff --git a/admin/user_list.php b/admin/user_list.php
index 0982c0f43..711ef4e40 100644
--- a/admin/user_list.php
+++ b/admin/user_list.php
@@ -30,6 +30,136 @@
*/
// +-----------------------------------------------------------------------+
+// | functions |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns a list of users depending on page filters (in $_GET)
+ *
+ * Each user comes with his related informations : id, username, mail
+ * address, list of groups.
+ *
+ * @return array
+ */
+function get_filtered_user_list()
+{
+ global $conf, $page;
+
+ $users = array();
+
+ // filter
+ $filter = array();
+
+ if (isset($_GET['username']) and !empty($_GET['username']))
+ {
+ $username = str_replace('*', '%', $_GET['username']);
+ if (function_exists('mysql_real_escape_string'))
+ {
+ $filter['username'] = mysql_real_escape_string($username);
+ }
+ else
+ {
+ $filter['username'] = mysql_escape_string($username);
+ }
+ }
+
+ if (isset($_GET['group'])
+ and -1 != $_GET['group']
+ and is_numeric($_GET['group']))
+ {
+ $filter['group'] = $_GET['group'];
+ }
+
+ if (isset($_GET['status'])
+ and in_array($_GET['status'], get_enums(USER_INFOS_TABLE, 'status')))
+ {
+ $filter['status'] = $_GET['status'];
+ }
+
+ // how to order the list?
+ $order_by = 'id';
+ if (isset($_GET['order_by'])
+ and in_array($_GET['order_by'], array_keys($page['order_by_items'])))
+ {
+ $order_by = $_GET['order_by'];
+ }
+
+ $direction = 'ASC';
+ if (isset($_GET['direction'])
+ and in_array($_GET['direction'], array_keys($page['direction_items'])))
+ {
+ $direction = strtoupper($_GET['direction']);
+ }
+
+ // search users depending on filters and order
+ $query = '
+SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
+ u.'.$conf['user_fields']['username'].' AS username,
+ u.'.$conf['user_fields']['email'].' AS email,
+ ui.status
+ FROM '.USERS_TABLE.' AS u
+ INNER JOIN '.USER_INFOS_TABLE.' AS ui
+ ON u.'.$conf['user_fields']['id'].' = ui.user_id
+ LEFT JOIN '.USER_GROUP_TABLE.' AS ug
+ ON u.'.$conf['user_fields']['id'].' = ug.user_id
+ WHERE u.'.$conf['user_fields']['id'].' != '.$conf['guest_id'];
+ if (isset($filter['username']))
+ {
+ $query.= '
+ AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
+ }
+ if (isset($filter['group']))
+ {
+ $query.= '
+ AND ug.group_id = '.$filter['group'];
+ }
+ if (isset($filter['status']))
+ {
+ $query.= '
+ AND ui.status = \''.$filter['status']."'";
+ }
+ $query.= '
+ ORDER BY '.$order_by.' '.$direction.'
+;';
+
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ $user = $row;
+ $user['groups'] = array();
+
+ array_push($users, $user);
+ }
+
+ // add group lists
+ $user_ids = array();
+ foreach ($users as $i => $user)
+ {
+ $user_ids[$i] = $user['id'];
+ }
+ $user_nums = array_flip($user_ids);
+
+ if (count($user_ids) > 0)
+ {
+ $query = '
+SELECT user_id, group_id
+ FROM '.USER_GROUP_TABLE.'
+ WHERE user_id IN ('.implode(',', $user_ids).')
+;';
+ $result = pwg_query($query);
+ while ($row = mysql_fetch_array($result))
+ {
+ array_push(
+ $users[$user_nums[$row['user_id']]]['groups'],
+ $row['group_id']
+ );
+ }
+ }
+
+ return $users;
+}
+
+// +-----------------------------------------------------------------------+
// | initialization |
// +-----------------------------------------------------------------------+
@@ -39,6 +169,18 @@ if (!defined('PHPWG_ROOT_PATH'))
}
include_once(PHPWG_ROOT_PATH.'admin/include/isadmin.inc.php');
+$page['order_by_items'] = array(
+ 'id' => $lang['registration_date'],
+ 'username' => $lang['Username']
+ );
+
+$page['direction_items'] = array(
+ 'asc' => $lang['ascending'],
+ 'desc' => $lang['descending']
+ );
+
+$page['filtered_users'] = get_filtered_user_list();
+
// +-----------------------------------------------------------------------+
// | add a user |
// +-----------------------------------------------------------------------+
@@ -60,12 +202,10 @@ if (isset($_POST['delete']) or isset($_POST['pref_submit']))
{
case 'all' :
{
- $query = '
-SELECT id
- FROM '.USERS_TABLE.'
- WHERE id != '.$conf['guest_id'].'
-;';
- $collection = array_from_query($query, 'id');
+ foreach($page['filtered_users'] as $local_user)
+ {
+ array_push($collection, $local_user['id']);
+ }
break;
}
case 'selection' :
@@ -254,8 +394,6 @@ $template->set_filenames(array('user_list'=>'admin/user_list.tpl'));
$base_url = add_session_id(PHPWG_ROOT_PATH.'admin.php?page=user_list');
-$conf['users_page'] = 20;
-
if (isset($_GET['start']) and is_numeric($_GET['start']))
{
$start = $_GET['start'];
@@ -306,10 +444,7 @@ if (isset($_GET['id']))
$template->assign_block_vars('session', array('ID' => $_GET['id']));
}
-$order_by_items = array('id' => $lang['registration_date'],
- 'username' => $lang['login']);
-
-foreach ($order_by_items as $item => $label)
+foreach ($page['order_by_items'] as $item => $label)
{
$selected = (isset($_GET['order_by']) and $_GET['order_by'] == $item) ?
'selected="selected"' : '';
@@ -322,10 +457,7 @@ foreach ($order_by_items as $item => $label)
));
}
-$direction_items = array('asc' => $lang['ascending'],
- 'desc' => $lang['descending']);
-
-foreach ($direction_items as $item => $label)
+foreach ($page['direction_items'] as $item => $label)
{
$selected = (isset($_GET['direction']) and $_GET['direction'] == $item) ?
'selected="selected"' : '';
@@ -567,80 +699,18 @@ foreach ($groups as $group_id => $group_name)
}
// +-----------------------------------------------------------------------+
-// | filter |
-// +-----------------------------------------------------------------------+
-
-$filter = array();
-
-if (isset($_GET['username']) and !empty($_GET['username']))
-{
- $username = str_replace('*', '%', $_GET['username']);
- if (function_exists('mysql_real_escape_string'))
- {
- $username = mysql_real_escape_string($username);
- }
- else
- {
- $username = mysql_escape_string($username);
- }
-
- if (!empty($username))
- {
- $filter['username'] = $username;
- }
-}
-
-if (isset($_GET['group'])
- and -1 != $_GET['group']
- and is_numeric($_GET['group']))
-{
- $filter['group'] = $_GET['group'];
-}
-
-if (isset($_GET['status'])
- and in_array($_GET['status'], get_enums(USER_INFOS_TABLE, 'status')))
-{
- $filter['status'] = $_GET['status'];
-}
-
-// +-----------------------------------------------------------------------+
// | navigation bar |
// +-----------------------------------------------------------------------+
-$query = '
-SELECT COUNT(DISTINCT u.'.$conf['user_fields']['id'].')
- FROM '.USERS_TABLE.' AS u
- INNER JOIN '.USER_INFOS_TABLE.' AS ui
- ON u.'.$conf['user_fields']['id'].' = ui.user_id
- LEFT JOIN '.USER_GROUP_TABLE.' AS ug
- ON u.'.$conf['user_fields']['id'].' = ug.user_id
- WHERE u.'.$conf['user_fields']['id'].' != '.$conf['guest_id'];
-if (isset($filter['username']))
-{
- $query.= '
- AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
-}
-if (isset($filter['group']))
-{
- $query.= '
- AND ug.group_id = '.$filter['group'];
-}
-if (isset($filter['status']))
-{
- $query.= '
- AND ui.status = \''.$filter['status']."'";
-}
-$query.= '
-;';
-list($counter) = mysql_fetch_row(pwg_query($query));
-
$url = PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start'));
-$navbar = create_navigation_bar($url,
- $counter,
- $start,
- $conf['users_page'],
- '');
+$navbar = create_navigation_bar(
+ $url,
+ count($page['filtered_users']),
+ $start,
+ $conf['users_page'],
+ ''
+ );
$template->assign_vars(array('NAVBAR' => $navbar));
@@ -651,105 +721,52 @@ $template->assign_vars(array('NAVBAR' => $navbar));
$profile_url = PHPWG_ROOT_PATH.'admin.php?page=profile&user_id=';
$perm_url = PHPWG_ROOT_PATH.'admin.php?page=user_perm&user_id=';
-$users = array();
-$user_ids = array();
-
-$order_by = 'id';
-if (isset($_GET['order_by'])
- and in_array($_GET['order_by'], array_keys($order_by_items)))
+foreach ($page['filtered_users'] as $num => $local_user)
{
- $order_by = $_GET['order_by'];
-}
-
-$direction = 'ASC';
-if (isset($_GET['direction'])
- and in_array($_GET['direction'], array_keys($direction_items)))
-{
- $direction = strtoupper($_GET['direction']);
-}
-
-$query = '
-SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
- u.'.$conf['user_fields']['username'].' AS username,
- u.'.$conf['user_fields']['email'].' AS email,
- ui.status
- FROM '.USERS_TABLE.' AS u
- INNER JOIN '.USER_INFOS_TABLE.' AS ui
- ON u.'.$conf['user_fields']['id'].' = ui.user_id
- LEFT JOIN '.USER_GROUP_TABLE.' AS ug
- ON u.'.$conf['user_fields']['id'].' = ug.user_id
- WHERE u.'.$conf['user_fields']['id'].' != '.$conf['guest_id'];
-if (isset($filter['username']))
-{
- $query.= '
- AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
-}
-if (isset($filter['group']))
-{
- $query.= '
- AND ug.group_id = '.$filter['group'];
-}
-if (isset($filter['status']))
-{
- $query.= '
- AND ui.status = \''.$filter['status']."'";
-}
-$query.= '
- ORDER BY '.$order_by.' '.$direction.'
- LIMIT '.$start.', '.$conf['users_page'].'
-;';
-$result = pwg_query($query);
-while ($row = mysql_fetch_array($result))
-{
- array_push($users, $row);
- array_push($user_ids, $row['id']);
- $user_groups[$row['id']] = array();
-}
-
-if (count($user_ids) > 0)
-{
- $query = '
-SELECT user_id, group_id
- FROM '.USER_GROUP_TABLE.'
- WHERE user_id IN ('.implode(',', $user_ids).')
-;';
- $result = pwg_query($query);
- while ($row = mysql_fetch_array($result))
+ // simulate LIMIT $start, $conf['users_page']
+ if ($num < $start)
{
- array_push($user_groups[$row['user_id']], $row['group_id']);
+ continue;
}
-
- foreach ($users as $num => $item)
+ if ($num >= $start + $conf['users_page'])
{
- $groups_string = preg_replace('/(\d+)/e',
- "\$groups['$1']",
- implode(', ', $user_groups[$item['id']]));
+ break;
+ }
- if (isset($_POST['pref_submit'])
- and isset($_POST['selection'])
- and in_array($item['id'], $_POST['selection']))
- {
- $checked = 'checked="checked"';
- }
- else
- {
- $checked = '';
- }
-
- $template->assign_block_vars(
- 'user',
- array(
- 'CLASS' => ($num % 2 == 1) ? 'row2' : 'row1',
- 'ID'=>$item['id'],
- 'CHECKED'=>$checked,
- 'U_MOD'=>add_session_id($profile_url.$item['id']),
- 'U_PERM'=>add_session_id($perm_url.$item['id']),
- 'USERNAME'=>$item['username'],
- 'STATUS'=>$lang['user_status_'.$item['status']],
- 'EMAIL'=>isset($item['email']) ? $item['email'] : '',
- 'GROUPS'=>$groups_string
- ));
+ $groups_string = preg_replace(
+ '/(\d+)/e',
+ "\$groups['$1']",
+ implode(
+ ', ',
+ $local_user['groups']
+ )
+ );
+
+ if (isset($_POST['pref_submit'])
+ and isset($_POST['selection'])
+ and in_array($local_user['id'], $_POST['selection']))
+ {
+ $checked = 'checked="checked"';
}
+ else
+ {
+ $checked = '';
+ }
+
+ $template->assign_block_vars(
+ 'user',
+ array(
+ 'CLASS' => ($num % 2 == 1) ? 'row2' : 'row1',
+ 'ID' => $local_user['id'],
+ 'CHECKED' => $checked,
+ 'U_MOD' => add_session_id($profile_url.$local_user['id']),
+ 'U_PERM' => add_session_id($perm_url.$local_user['id']),
+ 'USERNAME' => $local_user['username'],
+ 'STATUS' => $lang['user_status_'.$local_user['status']],
+ 'EMAIL' => isset($local_user['email']) ? $local_user['email'] : '',
+ 'GROUPS' => $groups_string
+ )
+ );
}
// +-----------------------------------------------------------------------+
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 9f59dc243..f07cfe18e 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,20 @@
+2005-10-05 Pierrick LE GALL
+
+ * bug 160 fixed: (part one of the bug) hard coded column name of
+ users table had to be replaced by the configurable column
+ name. This correction was made by a full rewrite of filtered users
+ list management. The other bug (not submited in bugtracker) that
+ needed this rewrite was that when you choose "all" as target for
+ mass users modification, you expected to apply modification on
+ filtered users, not all users.
+
+ * bug 160 fixed: (part two of the bug) hard coded column name for
+ primary key in mass_updates function.
+
+ * modification: configuration parameter users_page is now located
+ in the correct file (include/config_default.inc.php instead of
+ admin/user_list.php)
+
2005-09-27 Pierrick LE GALL
* bug 168 fixed: crash when language file does not
diff --git a/include/config_default.inc.php b/include/config_default.inc.php
index 7fe04184d..c25bb76fc 100644
--- a/include/config_default.inc.php
+++ b/include/config_default.inc.php
@@ -180,6 +180,10 @@ $conf['gallery_url'] = 'http://demo.phpwebgallery.net';
// contain characters among : a to z (case insensitive), "-" or "_".
$conf['prefix_thumbnail'] = 'TN-';
+// users_page: how many users to display in screen
+// Administration>Identification>Users?
+$conf['users_page'] = 20;
+
// +-----------------------------------------------------------------------+
// | metadata |
// +-----------------------------------------------------------------------+