From f3da6d81799c3ee012f1ca5f86aac9fc01d5818e Mon Sep 17 00:00:00 2001 From: x2001corpet Date: Sun, 8 Apr 2007 17:45:35 +0000 Subject: [PATCH] autocomplete improvements: can find pierre-yves when looking for yves git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1668 839d8a87-29fc-0310-9880-83ba4fa771e5 --- modules/search.php | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/search.php b/modules/search.php index 4996d5f..7230aa7 100644 --- a/modules/search.php +++ b/modules/search.php @@ -185,7 +185,7 @@ class SearchModule extends PLModule // result2|nb2 // ... header('Content-Type: text/plain; charset="UTF-8"'); - $q = preg_replace('/\*+$/','',$_REQUEST['q']); + $q = preg_replace(array('/\*+$/','/\*/'),array('','.*'),$_REQUEST['q']); if (!$q) exit(); // try to look in cached results @@ -200,19 +200,23 @@ class SearchModule extends PLModule $unique = 'user_id'; $db = 'auth_user_md5'; $realid = false; - $contains = false; + $beginwith = true; switch ($type) { case 'binetTxt': $db = 'binets_def INNER JOIN binets_ins ON(binets_def.id = binets_ins.binet_id)'; $field='binets_def.text'; if (strlen($q) > 2) - $contains = true; + $beginwith = false; $realid = 'binets_def.id'; break; case 'city': $db = 'geoloc_city INNER JOIN adresses ON(geoloc_city.id = adresses.cityid)'; $unique='uid'; $field='geoloc_city.name'; break; case 'entreprise': $db = 'entreprises'; $field = 'entreprise'; $unique='uid'; break; - case 'firstname': $field = 'prenom'; break; + case 'firstname': + $field = 'prenom'; + $q = '(^|[ \\-])'.$q; + $beginwith = false; + break; case 'fonctionTxt': $db = 'fonctions_def INNER JOIN entreprises ON(entreprises.fonction = fonctions_def.id)'; $field = 'fonction_fr'; @@ -223,11 +227,15 @@ class SearchModule extends PLModule $db = 'groupesx_def INNER JOIN groupesx_ins ON(groupesx_def.id = groupesx_ins.gid)'; $field='groupesx_def.text'; if (strlen($q) > 2) - $contains = true; + $beginwith = false; $realid = 'groupesx_def.id'; $unique = 'guid'; break; - case 'name': $field = 'nom'; break; + case 'name': + $field = 'nom'; + $q = '(^|[ \\-])'.$q; + $beginwith = false; + break; case 'nationaliteTxt': $db = 'geoloc_pays INNER JOIN auth_user_md5 ON(geoloc_pays.a2 = auth_user_md5.nationalite)'; $field = 'IF(geoloc_pays.nat=\'\', geoloc_pays.pays, geoloc_pays.nat)'; @@ -240,11 +248,13 @@ class SearchModule extends PLModule $field = 'emploi_secteur.label'; $realid = 'emploi_secteur.id'; $unique = 'uid'; + $beginwith = false; break; case 'sectionTxt': $db = 'sections INNER JOIN auth_user_md5 ON(auth_user_md5.section = sections.id)'; $field = 'sections.text'; $realid = 'sections.id'; + $beginwith = false; break; default: exit(); } @@ -255,11 +265,11 @@ class SearchModule extends PLModule COUNT(DISTINCT '.$unique.') AS nb '.($realid?(', '.$realid.' AS id'):'').' FROM '.$db.' - WHERE '.$field.' LIKE {?} + WHERE '.$field.' REGEXP {?} GROUP BY '.$field.' ORDER BY nb DESC LIMIT 11', - ($contains?'%':'').str_replace('*','%',$q).'%'); + ($beginwith?'^':'').$q); $nbResults = 0; $res = ""; while ($result = $list->next()) { -- 2.1.4