Subversion Repositories eFlore/Applications.cel

Rev

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

<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //

/**
 * Classe gérant la completion des noms de lieux
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * @author David Delon <david.delon@clapas.net>
 * @author Aurélien 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>
 * @version $Id$
 * @copyright © 2010, David Delon
 */

/**
 * 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
 **/
class LocationSearch extends Cel {

        function getElement($uid){

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

        function getRessource(){
                        print "[]";
            return;
        }
        
        private function executerRequeteLieu($lieu) {
                
                $lieu_formate = $this->formaterChaineLieuPourRequete($lieu);
                $retour = array();
                                                
        if ($this->estUneChaineRequeteValide($lieu_formate)) {
                    $requete_information_lieu = 'SELECT DISTINCT nom, code '.
                                        'FROM cel_zones_geo '.
                                        'WHERE '.
                                        'nom LIKE '.Cel::db()->proteger($lieu_formate.'%').' '.
                                'ORDER BY nom LIMIT 50';

                $liste_lieux = Cel::db()->requeter($requete_information_lieu);
                
                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']);
        }
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.4  2008-01-30 08:57:28  ddelon
* fin mise en place mygwt
*
* Revision 1.3  2007-05-21 18:13:03  ddelon
* Correction bug recherche commune du type "la canourgue"
*
*
*/
?>