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);
}
}
?>