mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-01-03 04:29:28 +01:00
* Mail: searching in compose now ignores custom fields as they might lead to unexpected results
This commit is contained in:
parent
c5afac87bd
commit
d045fde07c
@ -715,7 +715,7 @@ class Storage
|
|||||||
{
|
{
|
||||||
if($col != Sql::EXTRA_VALUE &&
|
if($col != Sql::EXTRA_VALUE &&
|
||||||
$col != Sql::EXTRA_TABLE.'.'.Sql::EXTRA_VALUE &&
|
$col != Sql::EXTRA_TABLE.'.'.Sql::EXTRA_VALUE &&
|
||||||
!array_key_exists($col, $backend->db_cols))
|
!array_key_exists($col, $backend->db_cols) && $key !== 'search_cfs')
|
||||||
{
|
{
|
||||||
if(!($col = array_search($col, $backend->db_cols)))
|
if(!($col = array_search($col, $backend->db_cols)))
|
||||||
{
|
{
|
||||||
|
@ -414,9 +414,10 @@ class Storage extends Storage\Base
|
|||||||
* To be or-ed to query for $_pattern in regular columns of main-table.
|
* To be or-ed to query for $_pattern in regular columns of main-table.
|
||||||
*
|
*
|
||||||
* @param string $_pattern search pattern incl. * or ? as wildcard, if no wildcards used we append and prepend one!
|
* @param string $_pattern search pattern incl. * or ? as wildcard, if no wildcards used we append and prepend one!
|
||||||
|
* @param string|string[] $_type=null only search cfs of given type(s), e.g. "url-email"
|
||||||
* @return string with SQL fragment running on main table: "id IN (SELECT id FROM extra-table WHERE extra_value like '$pattern')"
|
* @return string with SQL fragment running on main table: "id IN (SELECT id FROM extra-table WHERE extra_value like '$pattern')"
|
||||||
*/
|
*/
|
||||||
public function cf_match($_pattern)
|
public function cf_match($_pattern, $_type=null)
|
||||||
{
|
{
|
||||||
static $private_cfs=null;
|
static $private_cfs=null;
|
||||||
|
|
||||||
@ -435,9 +436,21 @@ class Storage extends Storage\Base
|
|||||||
$this->customfields);
|
$this->customfields);
|
||||||
//error_log(__METHOD__."() private_cfs=".array2string($private_cfs));
|
//error_log(__METHOD__."() private_cfs=".array2string($private_cfs));
|
||||||
}
|
}
|
||||||
if ($private_cfs)
|
if ($_type)
|
||||||
{
|
{
|
||||||
$sql .= ' AND '.$this->db->expression($this->extra_table, array($this->extra_key => array_keys($this->customfields)));
|
$cfs = [];
|
||||||
|
foreach($this->customfields as $name => $data)
|
||||||
|
{
|
||||||
|
if (in_array($data['type'], (array)$_type, true))
|
||||||
|
{
|
||||||
|
$cfs[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$cfs) return '';
|
||||||
|
}
|
||||||
|
if ($private_cfs || isset($cfs))
|
||||||
|
{
|
||||||
|
$sql .= ' AND '.$this->db->expression($this->extra_table, array($this->extra_key => $cfs ?? array_keys($this->customfields)));
|
||||||
}
|
}
|
||||||
return $sql.')';
|
return $sql.')';
|
||||||
}
|
}
|
||||||
|
@ -1251,7 +1251,8 @@ class Base
|
|||||||
* @param string &$op ='AND' on return boolean operation to use, if pattern does not start with ! we use OR else AND
|
* @param string &$op ='AND' on return boolean operation to use, if pattern does not start with ! we use OR else AND
|
||||||
* @param string $extra_col =null extra column to search
|
* @param string $extra_col =null extra column to search
|
||||||
* @param array $search_cols =[] List of columns to search. If not provided, all columns in $this->db_cols will be considered
|
* @param array $search_cols =[] List of columns to search. If not provided, all columns in $this->db_cols will be considered
|
||||||
* @param ?bool $search_cfs =null null: do it only for Api\Storage, false: never do it
|
* allows to specify $search_cfs parameter with key 'search_cfs', which has precedence over $search_cfs parameter
|
||||||
|
* @param null|bool|string|string[] $search_cfs null: do it only for Api\Storage, false: never do it, or string type(s) of cfs to search, e.g. "url-email"
|
||||||
* @return array or column => value pairs
|
* @return array or column => value pairs
|
||||||
*/
|
*/
|
||||||
public function search2criteria($_pattern,&$wildcard='',&$op='AND',$extra_col=null, $search_cols=[],$search_cfs=null)
|
public function search2criteria($_pattern,&$wildcard='',&$op='AND',$extra_col=null, $search_cols=[],$search_cfs=null)
|
||||||
@ -1284,8 +1285,13 @@ class Base
|
|||||||
{
|
{
|
||||||
$search_cols = $this->get_default_search_columns();
|
$search_cols = $this->get_default_search_columns();
|
||||||
}
|
}
|
||||||
|
if (array_key_exists('search_cfs', $search_cols))
|
||||||
|
{
|
||||||
|
$search_cfs = $search_cols['search_cfs'];
|
||||||
|
unset($search_cols['search_cfs']);
|
||||||
|
}
|
||||||
// Concat all fields to be searched together, so the conditions operate across the whole record
|
// Concat all fields to be searched together, so the conditions operate across the whole record
|
||||||
foreach($search_cols as $col)
|
foreach($search_cols as $key => $col)
|
||||||
{
|
{
|
||||||
$col_name = $col;
|
$col_name = $col;
|
||||||
$table = $this->table_name;
|
$table = $this->table_name;
|
||||||
@ -1381,7 +1387,7 @@ class Base
|
|||||||
if ($search_cfs ?? is_a($this, __NAMESPACE__))
|
if ($search_cfs ?? is_a($this, __NAMESPACE__))
|
||||||
{
|
{
|
||||||
// add custom-field search: OR id IN (SELECT id FROM extra_table WHERE extra_value LIKE '$search_token')
|
// add custom-field search: OR id IN (SELECT id FROM extra_table WHERE extra_value LIKE '$search_token')
|
||||||
$token_filter .= $this->cf_match($search_token);
|
$token_filter .= $this->cf_match($search_token, is_string($search_cfs) || is_array($search_cfs) ? $search_cfs : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compare numeric token as equality for numeric columns
|
// Compare numeric token as equality for numeric columns
|
||||||
|
@ -3630,7 +3630,7 @@ class mail_compose
|
|||||||
$search_str = implode(' +', $search); // tell contacts/so_sql to AND search patterns
|
$search_str = implode(' +', $search); // tell contacts/so_sql to AND search patterns
|
||||||
//error_log(__METHOD__.__LINE__.$_searchString);
|
//error_log(__METHOD__.__LINE__.$_searchString);
|
||||||
$filter = $showAccounts ? array() : array('account_id' => null);
|
$filter = $showAccounts ? array() : array('account_id' => null);
|
||||||
$filter['cols_to_search'] = array('n_prefix','n_given','n_family','org_name','email','email_home', 'contact_id');
|
$filter['cols_to_search'] = array('n_prefix','n_given','n_family','org_name','email','email_home', 'contact_id', 'search_cfs' => false);
|
||||||
$cols = array('n_fn','n_prefix','n_given','n_family','org_name','email','email_home', 'contact_id', 'etag');
|
$cols = array('n_fn','n_prefix','n_given','n_family','org_name','email','email_home', 'contact_id', 'etag');
|
||||||
$contacts = $contacts_obj->search($search_str, $cols, 'n_fn', '', '%', false, 'OR', array(0,100), $filter);
|
$contacts = $contacts_obj->search($search_str, $cols, 'n_fn', '', '%', false, 'OR', array(0,100), $filter);
|
||||||
$cfs_type_email = Api\Storage\Customfields::get_email_cfs('addressbook');
|
$cfs_type_email = Api\Storage\Customfields::get_email_cfs('addressbook');
|
||||||
|
Loading…
Reference in New Issue
Block a user