Subversion Repositories eFlore/Applications.coel

Rev

Rev 1707 | 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 cmlv_abreviation LIKE {$p['abreviation']} ".
                                                        (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 ($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);
        }
}
?>