mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-26 01:43:47 +01:00
remove non-digits and only search phone-numbers in phoneSearch
This commit is contained in:
parent
f5e165a07a
commit
57d5176080
@ -2825,20 +2825,34 @@ class Contacts extends Contacts\Storage
|
|||||||
}
|
}
|
||||||
if ($only_keys === true) $only_keys = false;
|
if ($only_keys === true) $only_keys = false;
|
||||||
$start = false; // no pagination
|
$start = false; // no pagination
|
||||||
// search for
|
|
||||||
list($country, $area, $rest) = explode(' ',
|
list($country, $area, $rest) = explode(' ',
|
||||||
$phoneNumberUtil->format($number, \libphonenumber\PhoneNumberFormat::INTERNATIONAL), 3);
|
$phoneNumberUtil->format($number, \libphonenumber\PhoneNumberFormat::INTERNATIONAL), 3);
|
||||||
$rest_without_space = str_replace(' ', '', $rest);
|
$rest_without_space = str_replace(' ', '', $rest);
|
||||||
foreach([
|
/** @var Contacts\Sql */
|
||||||
$area.' +'.$rest_without_space,
|
$backend = $this->get_backend(null, $filter['owner']);
|
||||||
// strip last 4 digits off, in case they are written as extension or formatted like 123 45 67
|
if (is_a($backend, Contacts\Sql::class) && $this->db->regexp_replace('test', '', '') !== 'test')
|
||||||
$area.' +'.substr($rest_without_space, 0, -4),
|
|
||||||
// use first 2 digit from rest, in case they are written as extension or formatted like 12 3...
|
|
||||||
$area.' +'.substr($rest_without_space, 0, 2),
|
|
||||||
// try exact match
|
|
||||||
'"'.$criteria.'"',
|
|
||||||
] as $pattern)
|
|
||||||
{
|
{
|
||||||
|
$patterns = [$area.$rest_without_space];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$patterns = [
|
||||||
|
$area . ' +' . $rest_without_space,
|
||||||
|
// strip last 4 digits off, in case they are written as extension or formatted like 123 45 67
|
||||||
|
$area . ' +' . substr($rest_without_space, 0, -4),
|
||||||
|
// use first 2 digit from rest, in case they are written as extension or formatted like 12 3...
|
||||||
|
$area . ' +' . substr($rest_without_space, 0, 2),
|
||||||
|
'"'.$criteria.'"', // try exact match
|
||||||
|
];
|
||||||
|
}
|
||||||
|
foreach($patterns as $pattern)
|
||||||
|
{
|
||||||
|
if (is_a($backend, Contacts\Sql::class))
|
||||||
|
{
|
||||||
|
$pattern = $backend->search2criteria($pattern, $wildcard, $op, null,
|
||||||
|
['tel_work', 'tel_cell', 'tel_fax', 'tel_assistent', 'tel_car', 'tel_pager',
|
||||||
|
'tel_home', 'tel_fax_home', 'tel_cell_private', 'tel_other'], false);
|
||||||
|
}
|
||||||
$rows = parent::search($pattern, $only_keys, $order_by, $extra_cols, $wildcard, $empty, $op, $start, $filter, $join, $ignore_acl) ?: [];
|
$rows = parent::search($pattern, $only_keys, $order_by, $extra_cols, $wildcard, $empty, $op, $start, $filter, $join, $ignore_acl) ?: [];
|
||||||
foreach($rows as $key => $row)
|
foreach($rows as $key => $row)
|
||||||
{
|
{
|
||||||
@ -2852,7 +2866,12 @@ class Contacts extends Contacts\Storage
|
|||||||
// prefer region of contact, to eg. be able to parse US numbers starting direct with areacode but no leading 0
|
// prefer region of contact, to eg. be able to parse US numbers starting direct with areacode but no leading 0
|
||||||
$row[substr($name, -5) === '_home' ? 'adr_two_countrycode' : 'adr_one_countrycode'] ?:
|
$row[substr($name, -5) === '_home' ? 'adr_two_countrycode' : 'adr_one_countrycode'] ?:
|
||||||
$row['adr_one_countrycode'] ?: $region);
|
$row['adr_one_countrycode'] ?: $region);
|
||||||
if (($found = $tel->equals($number))) break;
|
|
||||||
|
if (($found = $tel->equals($number)))
|
||||||
|
{
|
||||||
|
$rows[$key]['tel_matching'] = $name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (\Exception $e) {
|
catch (\Exception $e) {
|
||||||
// ignore broken numbers
|
// ignore broken numbers
|
||||||
|
@ -1239,6 +1239,30 @@ class Db
|
|||||||
return $sql;
|
return $sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls REGEXP_REPLACE if available for the DB otherwise returns just $expr
|
||||||
|
*
|
||||||
|
* Example: REGEXP_REPLACE('tel_work', '[^0-9]', "''") to remove non-numbers from tel_work column
|
||||||
|
*
|
||||||
|
* @param string $expr SQL expression, must be quoted for strings, eg. "'string'"
|
||||||
|
* @param string $regexp no quotes neccessary will be run through quotes()
|
||||||
|
* @param string $with SQL expression, must be quoted for strings, eg. "'string'"
|
||||||
|
* @return string SQL REGEXP_REPLACE() function or $expr, if not supported!
|
||||||
|
*/
|
||||||
|
function regexp_replace($expr, $regexp, $with)
|
||||||
|
{
|
||||||
|
switch($this->Type)
|
||||||
|
{
|
||||||
|
case 'mysqli':
|
||||||
|
case 'mysql':
|
||||||
|
if ((float)$this->ServerInfo['version'] < 8.0) break; // MySQL 8.0 or MariaDB 10.0 required
|
||||||
|
// fall through
|
||||||
|
case 'pgsql':
|
||||||
|
return 'REGEXP_REPLACE('.$expr.','.$this->quote($regexp).','.$with.')';
|
||||||
|
}
|
||||||
|
return $expr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SQL returning character (not byte!) positions for $substr in $str
|
* SQL returning character (not byte!) positions for $substr in $str
|
||||||
*
|
*
|
||||||
|
@ -1248,10 +1248,11 @@ class Base
|
|||||||
* @param string &$wildcard ='' on return wildcard char to use, if pattern does not already contain wildcards!
|
* @param string &$wildcard ='' on return wildcard char to use, if pattern does not already contain wildcards!
|
||||||
* @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 =array() 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
|
||||||
* @return array or column => value pairs
|
* @return array or column => value pairs
|
||||||
*/
|
*/
|
||||||
public function search2criteria($_pattern,&$wildcard='',&$op='AND',$extra_col=null, $search_cols = array())
|
public function search2criteria($_pattern,&$wildcard='',&$op='AND',$extra_col=null, $search_cols=[],$search_cfs=null)
|
||||||
{
|
{
|
||||||
$pattern = trim($_pattern);
|
$pattern = trim($_pattern);
|
||||||
// This function can get called multiple times. Make sure it doesn't re-process.
|
// This function can get called multiple times. Make sure it doesn't re-process.
|
||||||
@ -1300,6 +1301,11 @@ class Base
|
|||||||
{
|
{
|
||||||
continue; // will only give sql error
|
continue; // will only give sql error
|
||||||
}
|
}
|
||||||
|
// remove all non-number from phone-numbers
|
||||||
|
if (substr($col, 0, 4) === 'tel_')
|
||||||
|
{
|
||||||
|
$col = $this->db->regexp_replace($col, '[^0-9]', "''");
|
||||||
|
}
|
||||||
$columns[] = sprintf($this->db->capabilities[Api\Db::CAPABILITY_CAST_AS_VARCHAR],"COALESCE($col,'')");
|
$columns[] = sprintf($this->db->capabilities[Api\Db::CAPABILITY_CAST_AS_VARCHAR],"COALESCE($col,'')");
|
||||||
}
|
}
|
||||||
if(!$columns)
|
if(!$columns)
|
||||||
@ -1370,7 +1376,7 @@ class Base
|
|||||||
$GLOBALS['egw']->db->quote($search_token);
|
$GLOBALS['egw']->db->quote($search_token);
|
||||||
|
|
||||||
// if we have customfields and this is Api\Storage (not Api\Storage\Base)
|
// if we have customfields and this is Api\Storage (not Api\Storage\Base)
|
||||||
if (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);
|
||||||
|
Loading…
Reference in New Issue
Block a user