Subversion Repositories eFlore/Applications.coel

Rev

Rev 1745 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Service fournissant une liste de valeurs.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 * 
 * Cas d'utilisation :
 * /CoelValeurListe/id/1001 : retourne les valeurs de la liste d'identifiant 1001
 * /CoelValeurListe/ab/12 : retourne les valeurs de la liste dont l'abréviation vaut "12"
 * /CoelValeurListe/abv/FR.__ : retourne les valeurs dont l'abréviation équivaut (= LIKE) "FR.__"
 * * /CoelValeurListe/abv/FR.__/1078 : retourne les valeurs dont l'abréviation équivaut (= LIKE) "FR.__" pour la liste d'identifiant 1078.
 *
 * @author Jean-Pascal MILCENT <jpm@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 2009
 */
Class CoelValeurListe extends Coel {

        /**
         * Méthode appelée avec une requête de type GET.
         */
        function getElement($param = array()) {
                // Initialisation des variables
                $info = array();// Tableau associatif des paramêtres
                $requete = null;
                $requete_compte = null;
                
                // Pré traitement des paramêtres
                $p = $this->traiterParametresUrl(array('type', 'ceParent', 'abreviation', 'idValeur', "nom"), $param);
                
                // Construction de la requête
                if (!isset($p['idValeur']))     {
                        $p['idValeur'] = "'%'";
                }
                
                if (!isset($p['abreviation']))  {
                        $p['abreviation'] = "'%'";
                }
                
                $p['type'] = trim($p['type'], "'");
                switch ($p['type']) {
        case 'identifiant' :
            // Nous avons un identifiant de liste, nous récupérons seulement les valeurs de cette liste
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
                'FROM coel_meta_liste_valeur '.
                "WHERE cmlv_id_valeur = {$p['idValeur']} ".
                'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cmlv_id_valeur ASC').' ';
            $requete_compte = $requete;
                        break;
        case 'id' :
            // Nous avons un identifiant de liste, nous récupérons seulement les valeurs de cette liste
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
                'FROM coel_meta_liste_valeur '.
                "WHERE cmlv_ce_parent = {$p['ceParent']} ".
                "AND cmlv_id_valeur LIKE {$p['idValeur']} ".
                'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cmlv_id_valeur ASC').' ';
            $requete_compte = $requete;
            $requete .= "LIMIT $this->start,$this->limit ";
                        break;
        case 'idv' :
            // Nous avons un ou plusieurs identifiants de valeurs, nous les récupérons
            $p = $this->traiterParametresUrl(array('type', 'idValeur'), $param);
                                
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
                'FROM coel_meta_liste_valeur '.
                'WHERE cmlv_id_valeur IN ('.$this->traiterBddClauseIn($p['idValeur']).') '.
                'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cmlv_id_valeur ASC').' '.
                "LIMIT $this->start,$this->limit ";
                        break;
        case 'ab' :
            // Nous avons une abréviation de liste, nous récupérons seulement les valeurs de cette liste
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' v.* '.
                'FROM coel_meta_liste_valeur AS l LEFT JOIN coel_meta_liste_valeur AS v ON (l.cmlv_id_valeur = v.cmlv_ce_parent) '.
                'WHERE l.cmlv_ce_parent = 0 '.
                "AND l.cmlv_abreviation LIKE {$p['abreviation']} ".
                'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'v.cmlv_id_valeur ASC').' ';
            $requete_compte = $requete;
            $requete .= "LIMIT $this->start,$this->limit ";
                        break;
        case 'abv' :
            // Nous avons une abréviation de valeur, nous récupérons toutes les valeurs correspondantes
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
                'FROM coel_meta_liste_valeur '.
                "WHERE ";

            // spécial outre-mer française
            if($p['abreviation'] == "'FR%'" && $p['ceParent'] == "'1078'") {
                $requete .= "cmlv_abreviation REGEXP '^(FR|RE|YT|GP|MQ|GF|NC)...$' ";
            } else {
                $requete .= "cmlv_abreviation LIKE {$p['abreviation']} ";
            }

            $requete .= isset($p['ceParent']) ? " AND cmlv_ce_parent = {$p['ceParent']} " : ''.
                " AND cmlv_id_valeur LIKE {$p['idValeur']}".
                ' ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cmlv_id_valeur ASC').' ';
            $requete_compte = $requete;
            $requete .= "LIMIT $this->start,$this->limit ";
                        break;
        case 'nom' :
            // Nous avons une abréviation de valeur, nous récupérons toutes les valeurs correspondantes
            $requete =  (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
                'FROM coel_meta_liste_valeur '.
                'WHERE ';
            if (isset($p['nom']) && $p['nom'] != "") $requete .= "cmlv_nom LIKE {$p['nom']} AND ";
            if (isset($p['ceParent'])) $requete .= " cmlv_ce_parent = {$p['ceParent']} AND ";
            $requete .= " cmlv_id_valeur LIKE {$p['idValeur']} ".
                                'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cmlv_id_valeur ASC').' ';
            $requete_compte = $requete;
            $requete .= "LIMIT $this->start,$this->limit ";
                        break;
        default :
            $this->messages[] = sprintf("Valeur '%s' pour le paramêtre 'type' inconnue (valeurs disponibles : id, ab, abv)!", $p['type']);
                }

                if (!is_null($requete)) {
                        // Exécution de la requêtre SQL et test d'éventuelles erreurs
                        try {
                                $resultat = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);                            
                                if ($resultat === false || count($resultat) == 0) {
                                        $this->messages[] = "La requête a retourné aucun résultat.";
                                } else {
                                        // Traitement des données
                                        if ($p['type'] == 'id') {
                                                $info['id'] = trim($p['ceParent'], "'");
                                        } else if ($p['type'] == 'identifiant') {
                                                $info['id'] = trim($p['idValeur'], "'");
                                        } else {
                                                $info['id'] = $resultat[0]['cmlv_ce_parent'];
                                        }
                                        $info['valeurs'] = $resultat;
                                        
                                        // gestion des abreviations
                                        if (isset($p['abreviation']) && ($p['abreviation'] != "'%'")) {
                                                $info['abreviation'] = $p['abreviation'];
                                        }
                                        
                                        // si on a le nombre maximum de resultats on doit charger la page suivante
                                        if (count($resultat) == $this->limit) {
                                                $info['getNextPage'] = true;
                                        } else {
                                                $info['getNextPage'] = false;
                                        }
                                        
                                        //Sélection du nombre total
                                        if (!is_null($requete_compte)) {
                                                $nbElements = $this->bdd->query($requete_compte)->rowCount();
                                                $info['nbElements'] = $nbElements;
                                        }
                                }
                        } catch (PDOException $e) {
                                $this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
                        }
                }

                // Envoie sur la sortie standard
                $this->envoyer($info);
        }
}
?>