11,6 → 11,9 |
* @copyright 2009, 2013 Tela-Botanica |
*/ |
class CoelRecherche extends Coel { |
protected $fromClause = array(); |
protected $whereClause = array(); |
protected $joinClause = array(); |
|
/** |
* Méthode principale appelée avec une requête de type GET. |
51,45 → 54,18 |
* Retourne les collections correspondant aux critères de recherche |
*/ |
public function getElementCollections($param) { |
// Initialisation des variables |
$info = array(); |
$fromClause = $whereClause = $joinClause = array(); |
|
// Pré traitement des paramêtres |
$p = $this->pretraiterParametresUrlCollections($param, $_GET); |
|
// Construction des clauses |
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause); |
self::construireFromEtWhereCollections($p); |
|
// Construction de la requête |
$requete = sprintf( |
'SELECT %s cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom' |
. ' FROM %s %s' |
. ' WHERE %s ORDER BY %s %s -- %s:%d', |
$champs = "cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom"; |
$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby; |
$requete = $this->assemblerRequete($champs); |
|
$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__ |
); |
|
//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()); |
} |
$info =$this->lancerRequete($requete); |
return $info; |
} |
|
97,15 → 73,12 |
* Retourne le nombre de collections correspondant aux critères de recherche |
*/ |
public function getElementNombreCollections($param) { |
// Initialisation des variables |
$info = array(); |
$fromClause = $whereClause = $joinClause = array(); |
|
// Pré traitement des paramêtres |
$p = $this->pretraiterParametresUrlCollections($param, $_GET); |
|
// Construction des clauses |
self::construireFromEtWhereCollections($p, $fromClause, $joinClause, $whereClause); |
self::construireFromEtWhereCollections($p); |
|
// Construction de la requête |
// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre |
113,31 → 86,11 |
// 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 COUNT(%s *) AS nbre, cc_id_collection ' |
. ' FROM %s %s' |
. ' WHERE %s -- %s:%d', |
$champs = 'COUNT(*) AS nbre, cc_id_collection '; |
$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby; |
$requete = $this->assemblerRequete($champs); |
|
$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 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()); |
} |
$info = $this->lancerRequeteNombre($requete); |
|
return $info; |
} |
146,27 → 99,83 |
* 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); |
$champs = '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'; |
$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby; |
$requete = $this->assemblerRequete($champs); |
|
$info = $this->lancerRequete($requete); |
return $info; |
} |
|
/** |
* Retourne le nombre de personnes correspondant aux critères de recherche |
*/ |
public function getElementNombrePersonnes($param) { |
// Pré traitement des paramêtres |
$p = $this->pretraiterParametresUrlPersonnes($param, $_GET); |
|
// Construction des clauses |
self::construireFromEtWherePersonnes($p, $fromClause, $joinClause, $whereClause); |
self::construireFromEtWherePersonnes($p); |
$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby; |
$champs = 'count(*) as nbre'; |
// Construction de la requête |
$requete = $this->assemblerRequete($champs); |
$info = $this->lancerRequeteNombre($requete); |
return $info; |
} |
|
/** |
* Retourne les publications correspondant aux critères de recherche |
*/ |
public function getElementPublications($param) { |
// Pré traitement des paramêtres |
$p = $this->pretraiterParametresUrlPublications($param, $_GET); |
|
// Construction des clauses |
self::construireFromEtWherePublications($p); |
$champs = '*'; |
$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby; |
$requete = $this->assemblerRequete($champs); |
|
$info = $this->lancerRequete($requete); |
return $info; |
} |
|
/** |
* Retourne le nombre de personnes correspondant aux critères de recherche |
*/ |
public function getElementNombrePublications($param) { |
// Pré traitement des paramêtres |
$p = $this->pretraiterParametresUrlPublications($param, $_GET); |
|
// Construction des clauses |
self::construireFromEtWherePublications($p); |
$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby; |
$champs = 'count(*) as nbre'; |
// Construction de la requête |
$requete = $this->assemblerRequete($champs); |
$info = $this->lancerRequeteNombre($requete); |
return $info; |
} |
|
private function assemblerRequete($champs) { |
// 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' |
'SELECT %s %s' |
. ' 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, |
$champs, |
implode(',', $this->fromClause), |
implode(' ', $this->joinClause), |
$this->whereClause ? implode(" AND ", $this->whereClause) : TRUE, |
$this->orderby, |
$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "", |
__FILE__, |
__LINE__ |
173,6 → 182,11 |
); |
//echo "REQUETE: " . $requete; |
//exit; |
return $requete; |
} |
|
private function lancerRequete($requete) { |
$info = array(); |
// Récupération des résultats |
try { |
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
187,35 → 201,8 |
return $info; |
} |
|
/** |
* Retourne le nombre de personnes correspondant aux critères de recherche |
*/ |
public function getElementNombrePersonnes($param) { |
// Initialisation des variables |
private function lancerRequeteNombre($requete) { |
$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); |
256,6 → 243,18 |
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 pretraiterParametresUrlPublications($param, $qs) { |
$params_passes = array( |
'titre' => 'str', |
'auteur' => 'str', |
'mot-cle' => 'str', |
'revue' => 'str', |
'date' => '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; |
318,20 → 317,20 |
} |
|
// 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(); |
private function construireFromEtWhereCollections($p) { |
$this->fromClause = array('coel_collection'); |
$this->joinClause = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)'); |
$this->whereClause = array(); |
|
// Gestion du from en fonction des paramêtres |
if (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position! |
$from = array('coel_structure'); |
$join = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)'); |
if (isset($p['str-d'])) {// ATTENTION : Remplace $this->fromClause, doit être situé en première position! |
$this->fromClause = array('coel_structure'); |
$this->joinClause = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)'); |
} |
|
// Construire from et where en fonction des paramêtres |
if (isset($p['mots'])) { |
$where[] = '(' . implode(' OR ', array( |
$this->whereClause[] = '(' . implode(' OR ', array( |
"cc_nom LIKE {$p['mots']}", |
"cc_truk_nom_alternatif LIKE {$p['mots']}", |
"cc_truk_code LIKE {$p['mots']}", |
353,17 → 352,17 |
|
if (isset($p['sci'])) { |
if ($p['sci'] === true) { |
$where[] = 'csv_mark_visite_avec_motif = 1'; |
$this->whereClause[] = 'csv_mark_visite_avec_motif = 1'; |
} else if ($p['sci'] === false) { |
$where[] = 'csv_mark_acces_ss_motif = 1'; |
$this->whereClause[] = 'csv_mark_acces_ss_motif = 1'; |
} |
} |
if (isset($p['bot'])) { |
$where[] = "ccb_ce_truk_type IN ({$p['bot']})"; |
$this->whereClause[] = "ccb_ce_truk_type IN ({$p['bot']})"; |
} |
if (isset($p['lieu-stockage'])) { |
$join[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays'; |
$where[] = '(' . implode(' OR ', array( |
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays'; |
$this->whereClause[] = '(' . implode(' OR ', array( |
"cs_adresse_01 LIKE {$p['lieu-stockage']}", |
"cs_code_postal LIKE {$p['lieu-stockage']}", |
"cs_ville LIKE {$p['lieu-stockage']}", |
372,27 → 371,27 |
)) . ')'; |
} |
if (isset($p['zg'])) { |
$where[] = "cc_truk_couverture_lieu LIKE {$p['zg']}"; |
$this->whereClause[] = "cc_truk_couverture_lieu LIKE {$p['zg']}"; |
} |
if (isset($p['p'])) { |
$where[] = "cp_fmt_nom_complet LIKE {$p['p']}"; |
$this->whereClause[] = "cp_fmt_nom_complet LIKE {$p['p']}"; |
} |
if (isset($p['pr'])) { |
$where[] = "ccap_id_role IN ({$p['pr']})"; |
$this->whereClause[] = "ccap_id_role IN ({$p['pr']})"; |
} |
|
// par défaut, spécifier un département restreint à la France |
// TODO: INNER JOIN |
if (isset($p['str-d'])) { |
$join[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays'; |
$where[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')"; |
$where[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d'])); |
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays'; |
$this->whereClause[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')"; |
$this->whereClause[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d'])); |
} |
|
if (isset($p['pays'])) { |
if(array_search('FR', $p['pays']) !== FALSE) $p['pays'] = array_merge($p['pays'], array('RE','YT','GP','MQ','GF','NC')); |
$join[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays'; |
$where[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays'])); |
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays'; |
$this->whereClause[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays'])); |
} |
|
if (isset($p['veg'])) { |
400,47 → 399,47 |
$veg_nbre = count($veg); |
|
if ($veg_nbre == 1) { |
$where[] = "ccb_truk_nature LIKE '%{$p['veg']}%'"; |
$this->whereClause[] = "ccb_truk_nature LIKE '%{$p['veg']}%'"; |
} else { |
$recherche = array(); |
foreach ($veg as $id) { |
$recherche[] = "ccb_truk_nature LIKE '%$id%'"; |
} |
$where[] = '('.implode(' OR ', $recherche).') '; |
$this->whereClause[] = '('.implode(' OR ', $recherche).') '; |
} |
} |
|
|
if (isset($p['sci'])) { |
$join[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)'; |
$this->joinClause[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)'; |
} |
if (isset($p['bot']) || isset($p['veg'])) { |
$join[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)'; |
$this->joinClause[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)'; |
} |
if (isset($p['p']) || isset($p['pr'])) { |
$join[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)'; |
$this->joinClause[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)'; |
} |
if (isset($p['p'])) { |
$join[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)'; |
$this->joinClause[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)'; |
} |
|
$join = array_unique($join); |
$this->joinClause = array_unique($this->joinClause); |
} |
|
// 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(); |
private function construireFromEtWherePersonnes($p) { |
$this->fromClause = array('coel_personne'); |
$this->joinClause = array(); |
$this->whereClause = array(); |
|
//"cp_truk_recolte LIKE {$p['adresse']}", // Inclure le lieu de récolte ? |
|
if (isset($p['nom-famille'])) { |
$where[] = "cp_nom LIKE {$p['nom-famille']}"; |
$this->whereClause[] = "cp_nom LIKE {$p['nom-famille']}"; |
} |
if (isset($p['adresse'])) { |
$join[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays'; |
$where[] = '(' . implode(' OR ', array( |
$this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays'; |
$this->whereClause[] = '(' . implode(' OR ', array( |
"cp_adresse_01 LIKE {$p['adresse']}", |
"cp_code_postal LIKE {$p['adresse']}", |
"cp_ville LIKE {$p['adresse']}", |
451,18 → 450,42 |
)) . ')'; |
} |
if (isset($p['date-vivant'])) { |
$where[] = "cp_naissance_date <= {$p['date-vivant']}"; |
$where[] = "cp_deces_date >= {$p['date-vivant']}"; |
$where[] = "cp_naissance_date IS NOT NULL"; |
$where[] = "cp_deces_date IS NOT NULL"; |
//$where[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})"; |
$this->whereClause[] = "cp_naissance_date <= {$p['date-vivant']}"; |
$this->whereClause[] = "cp_deces_date >= {$p['date-vivant']}"; |
$this->whereClause[] = "cp_naissance_date IS NOT NULL"; |
$this->whereClause[] = "cp_deces_date IS NOT NULL"; |
//$this->whereClause[] = "(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)'; |
$this->joinClause[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)'; |
$this->joinClause[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)'; |
}*/ |
$join = array_unique($join); |
$this->joinClause = array_unique($this->joinClause); |
} |
|
// construit les clauses FROM et WHERE pour la recherche de publications (#CaptainObvious) |
private function construireFromEtWherePublications($p) { |
$this->fromClause = array('coel_publication'); |
$this->joinClause = array(); |
$this->whereClause = array(); |
|
if (isset($p['titre'])) { |
$this->whereClause[] = "cpu_titre LIKE {$p['titre']}"; |
} |
if (isset($p['auteur'])) { |
$this->whereClause[] = "cpu_fmt_auteur LIKE {$p['auteur']}"; |
} |
if (isset($p['mot-cle'])) { |
$this->whereClause[] = "cpu_resume_mot_cle LIKE {$p['mot-cle']}"; |
} |
if (isset($p['revue'])) { |
$this->whereClause[] = "cpu_collection LIKE {$p['revue']}"; |
} |
if (isset($p['date'])) { |
$this->whereClause[] = "cpu_date_parution LIKE {$p['date']}"; |
} |
|
} |
} |