Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1752 → Rev 1753

/trunk/jrest/services/CoelRecherche.php
1,8 → 1,9
<?php
/**
* Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
* fournis en paramêtre.
* fournis en paramètre.
*
* @author Mathias Chouet
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18,11 → 19,10
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Nour recherchons le type de requête demandé
// Nous recherchons le type de requête demandé
$type = $param[0];
$methode = 'getElement'.$type;
 
if (method_exists($this, $methode)) {
array_shift($param);
$info = $this->$methode($param);
37,23 → 37,29
}
$this->envoyer($info);
}
/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
* restrictions.
* Appelée avec les paramêtres d'url suivant :
* /CoelRecherche/ParDefaut/_
* ou les _ représentent dans l'ordre : mots
* Si un des paramêtres est absent, il prendre la valeur *
 
/** @deprecated retro-compatibilité */
public function getElementParDefaut($param) {
return $this->getElementCollections($param);
}
/** @deprecated retro-compatibilité */
public function getElementNombre($param) {
return $this->getElementNombreCollections($param);
}
 
/**
* Retourne les collections correspondant aux critères de recherche
*/
public function getElementParDefaut($param) {
public function getElementCollections($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
 
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrl($param, $_GET);
$p = $this->pretraiterParametresUrlCollections($param, $_GET);
 
$fromClause = $whereClause = $joinClause = array();
self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause);
// Construction des clauses
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause);
 
// Construction de la requête
$requete = sprintf(
61,23 → 67,23
. ' FROM %s %s'
. ' WHERE %s ORDER BY %s %s -- %s:%d',
 
$this->distinct ? 'DISTINCT' : '',
 
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
 
$whereClause ? implode(" AND ", $whereClause) : TRUE,
is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby,
 
$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
__FILE__, __LINE__);
 
__FILE__,
__LINE__
);
//echo "REQUETE: " . $requete;
//exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees;
}
86,47 → 92,135
}
return $info;
}
/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
* restrictions.
* Appelée avec les paramêtres d'url suivant :
* /CoelRecherche/ParDefaut/_
* ou les _ représentent dans l'ordre : mots
* Si un des paramêtres est absent, il prendre la valeur *
 
/**
* Retourne le nombre de collections correspondant aux critères de recherche
*/
public function getElementNombre($param) {
public function getElementNombreCollections($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrl($param, $_GET);
$p = $this->pretraiterParametresUrlCollections($param, $_GET);
 
$fromClause = $whereClause = $joinClause = array();
self::construireFromEtWhere($p, $fromClause, $joinClause, $whereClause);
 
// Construction des clauses
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause);
// Construction de la requête
// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
// @WTF si on compte(*) on a le nombre d'associations structure-collection
// si on compte(cs_id_structure) on a le nombre d'associations structure-collection dont la structure n'est pas null
// en aucun cas on n'a le nombre d'association structure-collection DIFFERENTES, à moins de faire un distinct, ce qui n'est pas le cas ici
// @AMHA on devrait compter(*) car la recherche de collections renvoie même celles qui ont une structure null
$requete = sprintf(
'SELECT %s COUNT(cs_id_structure) AS nbre, cc_id_collection '
'SELECT COUNT(%s *) AS nbre, cc_id_collection '
. ' FROM %s %s'
. ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
 
. ' WHERE %s -- %s:%d',
$this->distinct ? 'DISTINCT' : '',
 
implode(',', $fromClause),
implode(' ', $joinClause),
 
$whereClause ? implode(" AND ", $whereClause) : TRUE,
is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC' : $this->orderby,
$this->start, $this->limit,
__FILE__, __LINE__);
__FILE__,
__LINE__
);
// echo "REQUETE: " . $requete;
// exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees['nbre'];
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
return $info;
}
 
/**
* Retourne les personnes correspondant aux critères de recherche
*/
public function getElementPersonnes($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
 
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
 
// Construction des clauses
self::construireFromEtWherePersonnes($p, $fromClause, $joinClause, $whereClause);
// Construction de la requête
$requete = sprintf(
'SELECT %s cp_id_personne, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_truk_nom_autre, cp_adresse_01, cp_ville, cp_naissance_date, cp_deces_date'
. ' FROM %s %s'
. ' WHERE %s ORDER BY %s %s -- %s:%d',
 
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby,
$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
__FILE__,
__LINE__
);
//echo "REQUETE: " . $requete;
//exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $info;
}
 
/**
* Retourne le nombre de personnes correspondant aux critères de recherche
*/
public function getElementNombrePersonnes($param) {
// Initialisation des variables
$info = array();
$fromClause = $whereClause = $joinClause = array();
 
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
 
// Construction des clauses
self::construireFromEtWherePersonnes($p, $fromClause, $joinClause, $whereClause);
 
// Construction de la requête
$requete = sprintf(
'SELECT count(%s *) as nbre'
. ' FROM %s %s'
. ' WHERE %s -- %s:%d',
$this->distinct ? 'DISTINCT' : '',
implode(',', $fromClause),
implode(' ', $joinClause),
$whereClause ? implode(" AND ", $whereClause) : TRUE,
__FILE__,
__LINE__
);
//echo "REQUETE: " . $requete;
//exit;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
$this->messages[] = "La requête n'a retourné aucun résultat.";
} else {
$info = $donnees['nbre'];
}
133,23 → 227,37
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
return $info;
}
private function pretraiterParametresUrl($param, $qs /* query-string */) {
// Tableau des paramêtres qui peuvent être passés dans l'url
 
// Voici les paramètres qu'il faut passer au service Collections, tous et dans l'ordre (soit une valeur soit '*')
private function pretraiterParametresUrlCollections($param, $qs) {
$params_passes = array(
'mots' => 'str',
'sci' => 'bool',
'bot' => 'int',
'lieu-stockage' => 'str',
'zg' => 'str',
'p' => 'str',
'pr' => 'int',
'str-d' => 'frdepliste',
'veg' => 'int',
'projets' => 'int');
'projets' => 'int'
);
return $this->pretraiterParametresUrl($param, $qs, $params_passes);
}
 
// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
private function pretraiterParametresUrlPersonnes($param, $qs) {
$params_passes = array(
'nom-famille' => 'str',
'adresse' => 'str',
'date-vivant' => 'int'
);
return $this->pretraiterParametresUrl($param, $qs, $params_passes);
}
 
private function pretraiterParametresUrl($param, $qs, $params_passes) {
$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
$this->debug[] = $param;
foreach ($params_passes as $param_passe => $type) {
214,8 → 322,9
 
return $p;
}
static function construireFromEtWhere($p, &$from, &$join, &$where) {
 
// construit les clauses FROM et WHERE pour la recherche de collections (#CaptainObvious)
static function construireFromEtWhereCollections($p, &$from, &$join, &$where) {
$from = array('coel_collection');
$join = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
$where = array();
256,10 → 365,19
$where[] = 'csv_mark_acces_ss_motif = 1';
}
}
 
if (isset($p['bot'])) {
$where[] = "ccb_ce_truk_type IN ({$p['bot']})";
}
if (isset($p['lieu-stockage'])) {
$where[] = '(' . implode(' OR ', array(
"cs_adresse_01 LIKE {$p['lieu-stockage']}",
"cs_adresse_02 LIKE {$p['lieu-stockage']}",
"cs_code_postal LIKE {$p['lieu-stockage']}",
"cs_ville LIKE {$p['lieu-stockage']}",
"cs_ce_truk_region LIKE {$p['lieu-stockage']}", // @TODO joindre la table meta
"cs_ce_truk_pays LIKE {$p['lieu-stockage']}"
)) . ')';
}
if (isset($p['zg'])) {
$where[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
}
323,9 → 441,44
if (isset($p['p'])) {
$join[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
}
/*if (isset($p['lieu-stockage'])) { // @TODO on verra plus tard, galère avec la table meta
$join[] = 'LEFT JOIN coel_ ON (cs_ce_truk_region = )';
}*/
 
$join = array_unique($join);
}
 
// construit les clauses FROM et WHERE pour la recherche de personnes (#CaptainObvious)
static function construireFromEtWherePersonnes($p, &$from, &$join, &$where) {
$from = array('coel_personne');
$join = array();
$where = array();
 
if (isset($p['nom-famille'])) {
$where[] = "(cp_nom LIKE {$p['nom-famille']} OR cp_truk_nom_autre LIKE {$p['nom-famille']})";
// @TODO chercher aussi dans le cp_login ?
}
if (isset($p['adresse'])) {
$where[] = '(' . implode(' OR ', array(
// inclure les adresses de la structure ?
"cp_adresse_01 LIKE {$p['adresse']}",
"cp_adresse_02 LIKE {$p['adresse']}",
"cp_code_postal LIKE {$p['adresse']}",
"cp_ville LIKE {$p['adresse']}",
//"cp_truk_recolte LIKE {$p['adresse']}", // Inclure le lieu de récolte ?
"cp_ce_truk_pays LIKE {$p['adresse']}"
)) . ')';
}
if (isset($p['date-vivant'])) {
$where[] = "cp_naissance_date <= {$p['date-vivant']}";
$where[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})";
}
 
// pour inclure éventuellement les adresses de la structure
/*if (isset($p['adresse'])) {
$join[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)';
$join[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)';
}*/
$join = array_unique($join);
 
}
}