Subversion Repositories eFlore/Applications.cel

Rev

Rev 2153 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
2458 jpm 2
// declare(encoding='UTF-8');
416 aurelien 3
/**
2458 jpm 4
 * Service gérant la completion des noms de lieux.
770 aurelien 5
 *
416 aurelien 6
 * Cas d'utilisation :
860 aurelien 7
 * Service completion nom de commune (plus tard de lieu en général)
416 aurelien 8
 *
860 aurelien 9
 * 1 : L'application recoit un debut de nom de lieu
2458 jpm 10
 * 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux commencant par ce prefixe
11
 *
12
 * @internal   Mininum PHP version : 5.2
13
 * @category   CEL
14
 * @package    Services
15
 * @subpackage Auto-complétions
16
 * @version    0.1
17
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
18
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
19
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
20
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
21
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
22
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
23
 */
24
 
770 aurelien 25
class LocationSearch extends Cel {
416 aurelien 26
 
2458 jpm 27
	public function getElement($uid){
28
		$retour = array();
416 aurelien 29
 
770 aurelien 30
		if (isset($uid[0])) {
31
			$retour = $this->executerRequeteLieu($uid[0]);
32
		}
2458 jpm 33
 
34
		$this->envoyerJson($retour);
35
		return true;
416 aurelien 36
	}
37
 
2458 jpm 38
	public function getRessource() {
39
		print '[]';
40
		return;
416 aurelien 41
	}
2458 jpm 42
 
770 aurelien 43
	private function executerRequeteLieu($lieu) {
1312 aurelien 44
		$lieu_formate = $this->formaterChaineLieuPourRequete($lieu);
770 aurelien 45
		$retour = array();
1312 aurelien 46
 
2458 jpm 47
		if ($this->estUneChaineRequeteValide($lieu_formate)) {
48
			$requete = 'SELECT DISTINCT nom, code '.
49
				'FROM cel_zones_geo '.
50
				'WHERE nom LIKE '.Cel::db()->proteger($lieu_formate.'%').' '.
51
				'ORDER BY nom '.
52
				'LIMIT 50 '.
53
				' -- '.__FILE__.':'.__LINE__;
2153 mathias 54
 
2458 jpm 55
			$liste_lieux = Cel::db()->requeter($requete);
56
			if ($liste_lieux) {
57
				foreach ($liste_lieux as $lieu_trouve) {
58
					$retour[] = $this->formaterLigneResultat($lieu_trouve);
59
				}
60
			}
61
		}
62
		return $retour;
63
	}
64
 
2153 mathias 65
	/**
66
	 * Remplace les * par % pour faire des recherches floues
67
	 * Remplace les + par _ (nginx envoie des "+" dans l'URL à la place des espaces)
68
	 * Remplace les espaces et les - par _ car les noms de communes peuvent avoir des espaces ou des tirets
69
	 * @param string $lieu
70
	 * @return string le lieu formaté pour la recherche
71
	 */
72
	private function formaterChaineLieuPourRequete($lieu) {
73
		$lieu = ltrim($lieu);
74
		$lieu = preg_replace('/\*+/', '%', $lieu);
75
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
770 aurelien 76
		return $lieu;
77
	}
2458 jpm 78
 
770 aurelien 79
	private function estUneChaineRequeteValide($lieu) {
80
		return (strlen($lieu) > 0) && ($lieu != '%');
81
	}
2458 jpm 82
 
770 aurelien 83
	private function formaterLigneResultat($ligne) {
2458 jpm 84
		return array($ligne['nom'].' ('.substr(sprintf('%02s', $ligne['code']),0,2).')', $ligne['code']);
770 aurelien 85
	}
2458 jpm 86
}