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