mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-02-17 02:41:02 +01:00
implemented search method in accounts sql backend, to no allways do a full query and limit in code
This commit is contained in:
parent
74d6ab3251
commit
7c9df2fe1e
@ -363,21 +363,27 @@ class accounts_sql
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches users and/or groups
|
* Searches / lists accounts: users and/or groups
|
||||||
*
|
*
|
||||||
* ToDo: implement a search like accounts::search
|
* @param array with the following keys:
|
||||||
*
|
* @param $param['type'] string/int 'accounts', 'groups', 'owngroups' (groups the user is a member of), 'both',
|
||||||
* @param string $_type='both', 'accounts', 'groups'
|
* 'groupmember' or 'groupmembers+memberships'
|
||||||
* @param int $start=null
|
* or integer group-id for a list of members of that group
|
||||||
* @param string $sort='' ASC or DESC
|
* @param $param['start'] int first account to return (returns offset or max_matches entries) or all if not set
|
||||||
* @param string $order=''
|
* @param $param['order'] string column to sort after, default account_lid if unset
|
||||||
* @param string $query=''
|
* @param $param['sort'] string 'ASC' or 'DESC', default 'DESC' if not set
|
||||||
* @param int $offset=null
|
* @param $param['query'] string to search for, no search if unset or empty
|
||||||
* @param string $query_type='all' 'start', 'all' (default), 'exact'
|
* @param $param['query_type'] string:
|
||||||
* @param boolean $active=false true: return only active accounts
|
* 'all' - query all fields for containing $param[query]
|
||||||
* @return array
|
* 'start' - query all fields starting with $param[query]
|
||||||
|
* 'exact' - query all fields for exact $param[query]
|
||||||
|
* 'lid','firstname','lastname','email' - query only the given field for containing $param[query]
|
||||||
|
* @param $param['offset'] int - number of matches to return if start given, default use the value in the prefs
|
||||||
|
* @param $param['objectclass'] boolean return objectclass(es) under key 'objectclass' in each account
|
||||||
|
* @return array with account_id => data pairs, data is an array with account_id, account_lid, account_firstname,
|
||||||
|
* account_lastname, person_id (id of the linked addressbook entry), account_status, account_expires, account_primary_group
|
||||||
*/
|
*/
|
||||||
function get_list($_type='both', $start = null,$sort = '', $order = '', $query = '', $offset = null, $query_type='', $active=false)
|
function search($param)
|
||||||
{
|
{
|
||||||
static $order2contact = array(
|
static $order2contact = array(
|
||||||
'account_firstname' => 'n_given',
|
'account_firstname' => 'n_given',
|
||||||
@ -386,41 +392,62 @@ class accounts_sql
|
|||||||
);
|
);
|
||||||
|
|
||||||
// fetch order of account_fullname from common::display_fullname
|
// fetch order of account_fullname from common::display_fullname
|
||||||
if (strpos($order,'account_fullname') !== false)
|
if (strpos($param['order'],'account_fullname') !== false)
|
||||||
{
|
{
|
||||||
$order = str_replace('account_fullname',preg_replace('/[ ,]+/',',',str_replace(array('[',']'),'',
|
$param['order'] = str_replace('account_fullname', preg_replace('/[ ,]+/',',',str_replace(array('[',']'),'',
|
||||||
common::display_fullname('account_lid','account_firstname','account_lastname'))),$order);
|
common::display_fullname('account_lid','account_firstname','account_lastname'))), $param['order']);
|
||||||
}
|
}
|
||||||
$order = str_replace(array_keys($order2contact),array_values($order2contact),$order);
|
$order = str_replace(array_keys($order2contact),array_values($order2contact),$param['order']);
|
||||||
// allways add 'account_lid', as it is only valid one for groups
|
// allways add 'account_lid', as it is only valid one for groups
|
||||||
if (strpos($order, 'account_lid') === false)
|
if (strpos($order, 'account_lid') === false)
|
||||||
{
|
{
|
||||||
$order .= ($order?',':'').'account_lid';
|
$order .= ($order?',':'').'account_lid';
|
||||||
}
|
}
|
||||||
if ($sort) $order = implode(' '.$sort.',', explode(',', $order)).' '.$sort;
|
if ($param['sort']) $order = implode(' '.$param['sort'].',', explode(',', $order)).' '.$param['sort'];
|
||||||
|
|
||||||
switch($_type)
|
$filter = array();
|
||||||
|
switch($param['type'])
|
||||||
{
|
{
|
||||||
case 'accounts':
|
case 'accounts':
|
||||||
$filter = array('owner' => 0);
|
$filter['owner'] = 0;
|
||||||
break;
|
break;
|
||||||
case 'groups':
|
case 'groups':
|
||||||
$filter = array("account_type = 'g'");
|
$filter['account_type'] = 'g';
|
||||||
|
break;
|
||||||
|
case 'owngroups':
|
||||||
|
$filter['account_id'] = array_map('abs', $this->frontend->memberships($GLOBALS['egw_info']['user']['account_id'], true));
|
||||||
|
$filter['account_type'] = 'g';
|
||||||
|
break;
|
||||||
|
case 'groupmembers':
|
||||||
|
case 'groupmembers+memberships':
|
||||||
|
$members = array();
|
||||||
|
foreach((array)$this->memberships($GLOBALS['egw_info']['user']['account_id'], true) as $grp)
|
||||||
|
{
|
||||||
|
$members = array_unique(array_merge($members, (array)$this->members($grp,true)));
|
||||||
|
if ($param['type'] == 'groupmembers+memberships') $members[] = abs($grp);
|
||||||
|
}
|
||||||
|
$filter['account_id'] = $members;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (is_numeric($param['type']))
|
||||||
|
{
|
||||||
|
$filter['account_id'] = $this->frontend->memberships($param['type'], true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// fall-through
|
||||||
case 'both':
|
case 'both':
|
||||||
$filter = array("(egw_addressbook.contact_owner=0 OR egw_addressbook.contact_owner IS NULL)");
|
$filter[] = "(egw_addressbook.contact_owner=0 OR egw_addressbook.contact_owner IS NULL)";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ($active)
|
if ($param['active'])
|
||||||
{
|
{
|
||||||
$filter[] = str_replace('UNIX_TIMESTAMP(NOW())',time(),addressbook_sql::ACOUNT_ACTIVE_FILTER);
|
$filter[] = str_replace('UNIX_TIMESTAMP(NOW())',time(),addressbook_sql::ACOUNT_ACTIVE_FILTER);
|
||||||
}
|
}
|
||||||
$criteria = array();
|
$criteria = array();
|
||||||
$wildcard = $query_type == 'start' || $query_type == 'exact' ? '' : '%';
|
$wildcard = $param['query_type'] == 'start' || $param['query_type'] == 'exact' ? '' : '%';
|
||||||
if ($query)
|
if (($query = $param['query']))
|
||||||
{
|
{
|
||||||
switch($query_type)
|
switch($param['query_type'])
|
||||||
{
|
{
|
||||||
case 'start':
|
case 'start':
|
||||||
$query .= '*';
|
$query .= '*';
|
||||||
@ -454,15 +481,18 @@ class accounts_sql
|
|||||||
if (!is_object($GLOBALS['egw']->contacts)) throw new exception('No $GLOBALS[egw]->contacts!');
|
if (!is_object($GLOBALS['egw']->contacts)) throw new exception('No $GLOBALS[egw]->contacts!');
|
||||||
|
|
||||||
$accounts = array();
|
$accounts = array();
|
||||||
foreach((array) $GLOBALS['egw']->contacts->search($criteria,"1,n_given,n_family,email,id,created,modified,$this->table.account_id AS account_id",
|
foreach((array) $GLOBALS['egw']->contacts->search($criteria,
|
||||||
|
"1,n_given,n_family,email,id,created,modified,$this->table.account_id AS account_id",
|
||||||
$order,"account_lid,account_type,account_status,account_expires,account_primary_group",
|
$order,"account_lid,account_type,account_status,account_expires,account_primary_group",
|
||||||
$wildcard,false,$query[0] == '!' ? 'AND' : 'OR',$offset ? array($start,$offset) : (is_null($start) ? false : $start),
|
$wildcard,false,$query[0] == '!' ? 'AND' : 'OR',
|
||||||
|
$param['offset'] ? array($param['start'], $param['offset']) : (is_null($param['start']) ? false : $param['start']),
|
||||||
$filter,$this->contacts_join) as $contact)
|
$filter,$this->contacts_join) as $contact)
|
||||||
{
|
{
|
||||||
if ($contact)
|
if ($contact)
|
||||||
{
|
{
|
||||||
$accounts[] = array(
|
$account_id = ($contact['account_type'] == 'g' ? -1 : 1) * $contact['account_id'];
|
||||||
'account_id' => ($contact['account_type'] == 'g' ? -1 : 1) * $contact['account_id'],
|
$accounts[$account_id] = array(
|
||||||
|
'account_id' => $account_id,
|
||||||
'account_lid' => $contact['account_lid'],
|
'account_lid' => $contact['account_lid'],
|
||||||
'account_type' => $contact['account_type'],
|
'account_type' => $contact['account_type'],
|
||||||
'account_firstname' => $contact['n_given'],
|
'account_firstname' => $contact['n_given'],
|
||||||
|
Loading…
Reference in New Issue
Block a user