diff --git a/addressbook/inc/class.bocontacts.inc.php b/addressbook/inc/class.bocontacts.inc.php index 00f6c2781b..a0034f712f 100755 --- a/addressbook/inc/class.bocontacts.inc.php +++ b/addressbook/inc/class.bocontacts.inc.php @@ -309,14 +309,12 @@ class bocontacts extends socontacts /** * reads contacts matched by key and puts all cols in the data array * - * @param array $keys array with keys in form internalName => value, may be a scalar value if only one key - * @param string/array $extra_cols string or array of strings to be added to the SELECT, eg. "count(*) as num" - * @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or + * @param int/string $contact_id * @return array/boolean contact data or false on error */ - function read($keys,$extra_cols='',$join='') + function read($contact_id) { - $data = parent::read($keys,$extra_cols,$join); + $data = parent::read($contact_id); if (!$data || !$this->check_perms(EGW_ACL_READ,$data)) { return false; diff --git a/addressbook/inc/class.socontacts.inc.php b/addressbook/inc/class.socontacts.inc.php index eabf424a6f..8de5f2c7d7 100755 --- a/addressbook/inc/class.socontacts.inc.php +++ b/addressbook/inc/class.socontacts.inc.php @@ -25,11 +25,6 @@ class socontacts { - /** - * @var string $links_table table name 'egw_links' - */ - var $links_table = 'egw_links'; - /** * @var string $extra_table name of customefields table */ @@ -93,6 +88,11 @@ class socontacts */ var $content_types = array(); + /** + * @var int $total total number of matches of last search + */ + var $total; + function socontacts($contact_app='addressbook') { $this->user = $GLOBALS['egw_info']['user']['account_id']; @@ -124,7 +124,9 @@ class socontacts $this->grants = $GLOBALS['egw']->acl->get_grants($contact_app,false); // remove some columns, absolutly not necessary to search in sql - $this->columns_to_search = array_diff(array_values($this->somain->db_cols),array('jpegphoto','owner','tid','private','id','cat_id','modified','modifier','creator','created')); + $this->columns_to_search = array_diff(array_values($this->somain->db_cols),array('jpegphoto','owner','tid', + 'private','id','cat_id','modified','modifier','creator','created','tz')); + $this->columns_to_search[] = $this->extra_value; // custome fields from extra_table $this->account_extra_search = array('account_firstname','account_lastname','account_email','account_lid'); } // add grants for accounts: admin --> everything, everyone --> read @@ -259,7 +261,7 @@ class socontacts /** * reads contact data including custom fields * - * @param interger/string $contact_id contact_id or 'a'.account_id + * @param int/string $contact_id contact_id or 'a'.account_id * @return array/boolean data if row could be retrived else False */ function read($contact_id) @@ -301,7 +303,7 @@ class socontacts * @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false * @return array of matching rows (the row is an array of the cols) or False */ - function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) + function ex_search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) { //echo 'socontacts::search->criteria:'; _debug_array($criteria); // we can only deal with one category atm. @@ -498,7 +500,7 @@ class socontacts * @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false * @return array of matching rows (the row is an array of the cols) or False */ - function ®ular_search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) + function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) { //echo "
socontacts::search(".print_r($criteria,true).",'$only_keys','$order_by','$extra_cols','$wildcard','$empty','$op','$start',".print_r($filter,true).",'$join')
\n"; diff --git a/addressbook/inc/class.socontacts_sql.inc.php b/addressbook/inc/class.socontacts_sql.inc.php index aab502bc24..d791a209d0 100644 --- a/addressbook/inc/class.socontacts_sql.inc.php +++ b/addressbook/inc/class.socontacts_sql.inc.php @@ -37,7 +37,8 @@ class socontacts_sql extends so_sql * For a union-query you call search for each query with $start=='UNION' and one more with only $order_by and $start set to run the union-query. * * @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!) - * @param boolean/string $only_keys=true True returns only keys, False returns all cols. comma seperated list of keys to return + * @param boolean/string/array $only_keys=true True returns only keys, False returns all cols. or + * comma seperated list or array of columns to return * @param string $order_by='' fieldnames + {ASC|DESC} separated by colons ',', can also contain a GROUP BY (if it contains ORDER BY) * @param string/array $extra_cols='' string or array of strings to be added to the SELECT, eg. "count(*) as num" * @param string $wildcard='' appended befor and after each criteria @@ -52,7 +53,7 @@ class socontacts_sql extends so_sql */ function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) { - if ((int) $this->debug >= 4) echo "socontacts_sql::search(".print_r($criteria,true).",'$only_keys','$order_by','$extra_cols','$wildcard','$empty','$op','$start',".print_r($filter,true).",'$join')
\n"; + if ((int) $this->debug >= 4) echo "socontacts_sql::search(".print_r($criteria,true).",".print_r($only_keys,true).",'$order_by','$extra_cols','$wildcard','$empty','$op','$start',".print_r($filter,true).",'$join')
\n"; $owner = isset($filter['owner']) ? $filter['owner'] : (isset($criteria['owner']) ? $criteria['owner'] : null); @@ -88,6 +89,8 @@ class socontacts_sql extends so_sql $extra_cols = $extra_cols ? array_merge(is_array($extra_cols) ? $extra_cols : implode(',',$extra_cols),array_values($accounts2contacts)) : array_values($accounts2contacts); + // we need to remove the above columns from the select list, as they are added again via extra_cols and + // having them double is ambigues if (!$only_keys) { $account_table = $GLOBALS['egw']->db->get_table_definitions('phpgwapi',$this->accounts_table); // global db is on phpgwapi @@ -95,20 +98,39 @@ class socontacts_sql extends so_sql $only_keys = implode(',',array_merge(array_diff(array_keys($this->db_cols),array_keys($accounts2contacts)), array_keys($account_table['fd']))); } + elseif($only_keys !== true) + { + if (!is_array($only_keys)) $only_keys = explode(',',$only_keys); + + foreach(array_keys($accounts2contacts) as $col) + { + if (($key = array_search($col,$only_keys)) !== false || + ($key = array_search(str_replace('contact_','',$col),$only_keys)) !== false) + { + unset($only_keys[$key]); + } + } + } foreach($filter as $col => $value) { - if (!is_int($col)) + if (!is_int($col) && ($db_col = array_search($col,$this->db_cols)) !== false) { - if (($db_col = array_search($col,$this->db_cols)) !== false && isset($accounts2contacts[$db_col])) + if (isset($accounts2contacts[$db_col])) { unset($filter[$col]); - $filter[] = str_replace(' AS '.$db_col,'',$accounts2contacts[$db_col]).'='.$this->db->quote($value,$this->table_def['fd'][$db_col]['type']); + $filter[] = str_replace(' AS '.$db_col,'',$accounts2contacts[$db_col]). + ($value === "!''" ? "!=''" : '='.$this->db->quote($value,$this->table_def['fd'][$db_col]['type'])); + } + elseif($value == "!''") // not empty query, will match all accounts, as their value is NULL not '' + { + $filter[] = "($db_col != '' AND $db_col IS NOT NULL)"; } } - elseif (preg_match("/^([a-z0-9_]+) *(=|!=|LIKE|NOT LIKE) *'(.*)'\$/i",$value,$matches)) + elseif (preg_match("/^([a-z0-9_]+) *(=|!=|LIKE|NOT LIKE|=!) *'(.*)'\$/i",$value,$matches)) { if (($db_col = array_search($matches[1],$this->db_cols)) !== false && isset($accounts2contacts[$db_col])) { + if ($matches[2] == '=!') $matches[2] = '!='; $filter[$col] = str_replace(' AS '.$db_col,'',$accounts2contacts[$db_col]).' '.$matches[2].' \''.$matches[3].'\''; } } diff --git a/addressbook/inc/class.uicontacts.inc.php b/addressbook/inc/class.uicontacts.inc.php index 03ced2efeb..61cbd444a5 100644 --- a/addressbook/inc/class.uicontacts.inc.php +++ b/addressbook/inc/class.uicontacts.inc.php @@ -329,7 +329,7 @@ class uicontacts extends bocontacts { $query['col_filter'][] = $query['order']."!=''"; } - $rows = (array) $this->regular_search($criteria,$id_only,$order,'','%',false,'OR',array((int)$query['start'],(int) $query['num_rows']),$query['col_filter']); + $rows = (array) parent::search($criteria,$id_only,$order,'','%',false,'OR',array((int)$query['start'],(int) $query['num_rows']),$query['col_filter']); //echo "".$this->somain->db->Query_ID->sql."
\n"; if ($id_only) return $this->total; // no need to set other fields or $readonlys @@ -878,7 +878,7 @@ class uicontacts extends bocontacts $GLOBALS['egw_info']['flags']['app_header'] = lang('Addressbook'). ' - '. lang('Advanced search'); if(!($GLOBALS['egw_info']['server']['contact_repository'] == 'sql' || !isset($GLOBALS['egw_info']['server']['contact_repository']))) { - $GLOBALS['egw']->common->phpgw_header(); + $GLOBALS['egw']->common->egw_header(); echo parse_navbar(); echo 'Advanced Search is not supported for ldap storage yet. Sorry!
'; $GLOBALS['egw']->common->egw_exit(); @@ -956,6 +956,11 @@ class uicontacts extends bocontacts $sel_options['tz'] = $tz + array('' => lang('doesn\'t matter')); $sel_options['tid'][] = lang('all'); //foreach($this->content_types as $type => $data) $sel_options['tid'][$type] = $data['name']; + + // some changes for the new addressbook + $sel_options['owner'] = $this->get_addressbooks(EGW_ACL_READ,lang('all')); + $readonlys['change_photo'] = true; + $this->tmpl->read('addressbook.search'); return $this->tmpl->exec('addressbook.uicontacts.search',$content,$sel_options,$readonlys,$preserv); }