Subversion Repositories eFlore/Applications.cel

Rev

Rev 2458 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2458 Rev 2557
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service gérant la completion des noms de lieux.
4
 * Service gérant la completion des noms de lieux.
5
 *
5
 *
6
 * Cas d'utilisation :
6
 * Cas d'utilisation :
7
 * Service completion nom de commune (plus tard de lieu en général)
7
 * Service completion nom de commune (plus tard de lieu en général)
8
 *
8
 *
9
 * 1 : L'application recoit un debut de nom de lieu
9
 * 1 : L'application recoit un debut de nom de lieu
10
 * 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux commencant par ce prefixe
10
 * 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux commencant par ce prefixe
11
 *
11
 *
12
 * @internal   Mininum PHP version : 5.2
12
 * @internal   Mininum PHP version : 5.2
13
 * @category   CEL
13
 * @category   CEL
14
 * @package    Services
14
 * @package    Services
15
 * @subpackage Auto-complétions
15
 * @subpackage Auto-complétions
16
 * @version    0.1
16
 * @version    0.1
17
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
17
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
18
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
18
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
19
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
19
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
20
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
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>
21
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
22
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
22
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
23
 */
23
 */
24
 
24
 
25
class LocationSearch extends Cel {
25
class LocationSearch extends Cel {
26
 
26
 
27
	public function getElement($uid){
27
	public function getElement($uid){
28
		$retour = array();
28
		$retour = array();
29
 
29
 
30
		if (isset($uid[0])) {
30
		if (isset($uid[0])) {
31
			$retour = $this->executerRequeteLieu($uid[0]);
31
			$retour = $this->executerRequeteLieu($uid[0]);
32
		}
32
		}
33
 
33
 
34
		$this->envoyerJson($retour);
34
		$this->envoyerJson($retour);
35
		return true;
35
		return true;
36
	}
36
	}
37
 
37
 
38
	public function getRessource() {
38
	public function getRessource() {
39
		print '[]';
39
		print '[]';
40
		return;
40
		return;
41
	}
41
	}
42
 
42
 
43
	private function executerRequeteLieu($lieu) {
43
	private function executerRequeteLieu($lieu) {
44
		$lieu_formate = $this->formaterChaineLieuPourRequete($lieu);
44
		$recherche_infos_zone_geo = new RechercheInfosZoneGeo($this->config);
45
		$retour = array();
-
 
46
 
-
 
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__;
-
 
54
 
-
 
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
 
-
 
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) {
45
		return $recherche_infos_zone_geo->obtenirListeInfosPourNom($lieu);
73
		$lieu = ltrim($lieu);
-
 
74
		$lieu = preg_replace('/\*+/', '%', $lieu);
-
 
75
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
-
 
76
		return $lieu;
-
 
77
	}
-
 
78
 
-
 
79
	private function estUneChaineRequeteValide($lieu) {
-
 
80
		return (strlen($lieu) > 0) && ($lieu != '%');
-
 
81
	}
-
 
82
 
-
 
83
	private function formaterLigneResultat($ligne) {
-
 
84
		return array($ligne['nom'].' ('.substr(sprintf('%02s', $ligne['code']),0,2).')', $ligne['code']);
-
 
85
	}
46
	}
86
}
47
}