Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Service gérant la completion des noms de lieux.
 *
 * Cas d'utilisation :
 * Service completion nom de commune (plus tard de lieu en général)
 *
 * 1 : L'application recoit un debut de nom de lieu
 * 2 : Si la longueur du prefixe est > 2, l'application retourne les 50 premieres lieux commencant par ce prefixe
 *
 * @internal   Mininum PHP version : 5.2
 * @category   CEL
 * @package    Services
 * @subpackage Auto-complétions
 * @version    0.1
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 */

class LocationSearch extends Cel {

        public function getElement($uid){
                $retour = array();

                if (isset($uid[0])) {
                        $retour = $this->executerRequeteLieu($uid[0]);
                }

                $this->envoyerJson($retour);
                return true;
        }

        public function getRessource() {
                print '[]';
                return;
        }

        private function executerRequeteLieu($lieu) {
                $lieu_formate = $this->formaterChaineLieuPourRequete($lieu);
                $retour = array();

                if ($this->estUneChaineRequeteValide($lieu_formate)) {
                        $requete = 'SELECT DISTINCT nom, code '.
                                'FROM cel_zones_geo '.
                                'WHERE nom LIKE '.Cel::db()->proteger($lieu_formate.'%').' '.
                                'ORDER BY nom '.
                                'LIMIT 50 '.
                                ' -- '.__FILE__.':'.__LINE__;

                        $liste_lieux = Cel::db()->requeter($requete);
                        if ($liste_lieux) {
                                foreach ($liste_lieux as $lieu_trouve) {
                                        $retour[] = $this->formaterLigneResultat($lieu_trouve);
                                }
                        }
                }
                return $retour;
        }

        /**
         * Remplace les * par % pour faire des recherches floues
         * Remplace les + par _ (nginx envoie des "+" dans l'URL à la place des espaces)
         * Remplace les espaces et les - par _ car les noms de communes peuvent avoir des espaces ou des tirets
         * @param string $lieu
         * @return string le lieu formaté pour la recherche
         */
        private function formaterChaineLieuPourRequete($lieu) {
                $lieu = ltrim($lieu);
                $lieu = preg_replace('/\*+/', '%', $lieu);
                $lieu = str_replace(['+', ' ', '-'], '_', $lieu);
                return $lieu;
        }

        private function estUneChaineRequeteValide($lieu) {
                return (strlen($lieu) > 0) && ($lieu != '%');
        }

        private function formaterLigneResultat($ligne) {
                return array($ligne['nom'].' ('.substr(sprintf('%02s', $ligne['code']),0,2).')', $ligne['code']);
        }
}