Rev 1545 | Rev 1698 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service fournissant des informations sur les collections et les structures répondant aux critères de recherche* fournis en paramêtre.* Encodage en entrée : utf8* Encodage en sortie : utf8** @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 CoelRecherche extends Coel {/*** Méthode principale appelée avec une requête de type GET.* Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.*/public function getElement($param = array()) {// Initialisation des variables$info = array();// Nour 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);} else {$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";}// Envoie sur la sortie standard$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 abscent, il prendre la valeur **/public function getElementParDefaut($param) {// Initialisation des variables$info = array();// Pré traitement des paramêtres$p = $this->pretraiterParametresUrl($param);// Construction de la requête$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cs_id_structure, cs_ville, cs_nom, '.' cc_id_collection, cc_nom '.$this->construireFromEtWhere($p).'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_ville ASC, cs_nom ASC, cc_nom ASC').' '."LIMIT $this->start, $this->limit ";// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête 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;}/* 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 abscent, il prendre la valeur **/public function getElementNombre($param) {// Initialisation des variables$info = array();// Pré traitement des paramêtres$p = $this->pretraiterParametresUrl($param);// Construction de la requête// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(cs_id_structure) AS nbre, cc_id_collection '.$this->construireFromEtWhere($p).'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_ville ASC, cs_nom ASC').' ';// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête 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;}private function pretraiterParametresUrl($param) {// Tableau des paramêtres qui peuvent être passés dans l'url$params_passes = array('mots' => 'str','sci' => 'bool','bot' => 'int','zg' => 'str','p' => 'str','pr' => 'int','str-d' => 'defaut','veg' => 'int','projets' => 'int');$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);$this->debug[] = $param;foreach ($params_passes as $param_passe => $type) {if (isset($p[$param_passe])) {// Suppression des éventuels espaces en début et fin de chaine$valeur = trim($p[$param_passe]);// Type de paramêtre chaineif ($type == 'str') {// Suppression des slash$valeur = stripslashes($valeur);// Utilisation d'une recherche de chaîne exacteif (preg_match('/^"(.*)"$/', $valeur, $match)) {$valeur = '%'.$match[1].'%';} else {// Recherche de mots non liés$mots = explode(' ', $valeur);$valeur = '%'.implode ('%', $mots).'%';}// Mise en place des quotes pour l'intérogation dans la bdd$valeur = $this->bdd->quote($valeur);}// Type de paramêtre booléenif ($type == 'bool') {if (preg_match('/^[0]$/', $valeur)) {$valeur = false;} else if (preg_match('/^[1]$/', $valeur)) {$valeur = true;} else {$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";$valeur = null;}}// Type de paramêtre entierif ($type == 'int') {if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers "."séparés par des virgules et non '$valeur'.";$valeur = null;}}$p[$param_passe] = $valeur;}}return $p;}private function construireFromEtWhere($p) {// Initialisation de variables$from_et_where = '';$from = 'FROM coel_collection '.' LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) ';$where = 'WHERE ';// Construire from et where en fonction des paramêtresif (isset($p['mots'])) {$where .= 'AND ('." cc_nom LIKE {$p['mots']} "." OR cc_truk_nom_alternatif LIKE {$p['mots']} "." OR cc_truk_code LIKE {$p['mots']} "." OR cc_description LIKE {$p['mots']} "." OR cc_description_specialiste LIKE {$p['mots']} "." OR cc_historique LIKE {$p['mots']} "." OR cs_nom LIKE {$p['mots']} "." OR cs_truk_nom_alternatif LIKE {$p['mots']} "." OR cs_description LIKE {$p['mots']} "." OR cs_adresse_01 LIKE {$p['mots']} "." OR cs_adresse_02 LIKE {$p['mots']} "." OR cs_ville LIKE {$p['mots']} "." OR cs_truk_identifiant_alternatif LIKE {$p['mots']} "." OR cs_condition_acces LIKE {$p['mots']} "." OR cs_condition_usage LIKE {$p['mots']} "." OR cs_truk_telephone LIKE {$p['mots']} "." OR cs_courriel LIKE {$p['mots']} "." OR cs_truk_url LIKE {$p['mots']} ".') ';}if (isset($p['sci'])) {if ($p['sci'] === true) {$where .= 'AND csv_mark_visite_avec_motif = 1 ';} else if ($p['sci'] === false) {$where .= 'AND csv_mark_acces_ss_motif = 1 ';}}if (isset($p['bot'])) {$where .= "AND ccb_ce_truk_type IN ({$p['bot']}) ";}if (isset($p['zg'])) {$where .= "AND cc_truk_couverture_lieu LIKE {$p['zg']} ";}if (isset($p['p'])) {$where .= "AND cp_fmt_nom_complet LIKE {$p['p']} ";}if (isset($p['pr'])) {$where .= "AND ccap_id_role IN ({$p['pr']}) ";}if (isset($p['str-d'])) {$where .= 'AND cs_ce_truk_pays = 2654 '."AND cs_code_postal LIKE '{$p['str-d']}%' ";}if (isset($p['veg'])) {$veg = explode(',', $p['veg']);$veg_nbre = count($veg);if ($veg_nbre == 1) {$where .= "AND ccb_truk_nature LIKE '%{$p['veg']}%' ";} else {$recherche = array();foreach ($veg as $id) {$recherche[] = "ccb_truk_nature LIKE '%$id%'";}$where .= 'AND ('.implode(' OR ', $recherche).') ';}}if (isset($p['projets'])) {$where .= "AND cc_ce_projet IN ({$p['projets']}) "."AND cs_ce_projet IN ({$p['projets']}) ";}$where = str_replace('WHERE AND', 'WHERE', $where);// Gestion du from en fonction des paramêtresif (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position!$from = 'FROM coel_structure '.' LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure) ';}if (isset($p['sci'])) {$from .= ' LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure) ';}if (isset($p['bot']) || isset($p['veg'])) {$from .= ' LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection) ';}if (isset($p['p']) || isset($p['pr'])) {$from .= ' LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection) ';}if (isset($p['p'])) {$from .= ' LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne) ';}// Retour du From et Where associéif (count($p) == 0) {$from_et_where = $from;} else {$from_et_where = $from.$where;}return $from_et_where;}}?>