Subversion Repositories eFlore/Applications.coel

Rev

Rev 1501 | Rev 1506 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1497 jpm 1
<?php
2
/**
3
 * Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
4
 * fournis en paramêtre.
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
7
 *
8
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @version $Id$
12
 * @copyright 2009
13
 */
14
class CoelRecherche extends Coel {
15
 
16
	/**
17
	 * Méthode principale appelée avec une requête de type GET.
18
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
19
	 */
20
	public function getElement($param = array()) {
21
		// Initialisation des variables
22
		$info = array();
23
 
24
		// Nour recherchons le type de requête demandé
25
		$type = $param[0];
26
 
27
		$methode = 'getElement'.$type;
28
		if (method_exists($this, $methode)) {
29
			array_shift($param);
30
			$info = $this->$methode($param);
31
		} else {
32
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
33
		}
34
 
35
		// Envoie sur la sortie standard
36
		$this->envoyer($info);
37
	}
38
 
39
 	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
40
 	 * restrictions.
41
	 * Appelée avec les paramêtres d'url suivant :
42
	 * /CoelRecherche/ParDefaut/_
43
	 * ou les _ représentent dans l'ordre : mots
44
	 * Si un des paramêtres est abscent, il prendre la valeur *
45
	 */
46
	public function getElementParDefaut($param) {
47
		// Initialisation des variables
48
		$info = array();
49
 
50
		// Pré traitement des paramêtres
51
		$p = $this->pretraiterParametresUrl($param);
52
 
53
		// Construction de la requête
54
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cs_id_structure, cs_ville, cs_nom, '.
55
					'	cc_id_collection, cc_nom '.
56
					$this->construireFromEtWhere($p).
1501 jpm 57
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cs_ville ASC, cs_nom ASC').' '.
1497 jpm 58
					"LIMIT $this->start, $this->limit ";
59
		$this->debug[] = $requete;
60
		// Récupération des résultats
61
		try {
62
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
63
			if ($donnees === false) {
64
				$this->messages[] = "La requête a retourné aucun résultat.";
65
			} else {
66
				$info = $donnees;
67
			}
68
		} catch (PDOException $e) {
69
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
70
		}
71
		return $info;
72
	}
73
 
74
	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
75
 	 * restrictions.
76
	 * Appelée avec les paramêtres d'url suivant :
77
	 * /CoelRecherche/ParDefaut/_
78
	 * ou les _ représentent dans l'ordre : mots
79
	 * Si un des paramêtres est abscent, il prendre la valeur *
80
	 */
81
	public function getElementNombre($param) {
82
		// Initialisation des variables
83
		$info = array();
84
 
85
		// Pré traitement des paramêtres
86
		$p = $this->pretraiterParametresUrl($param);
87
 
88
		// Construction de la requête
89
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(cc_id_collection) AS nbre '.
90
					$this->construireFromEtWhere($p).
1501 jpm 91
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cs_ville ASC, cs_nom ASC').' ';
1497 jpm 92
 
93
		// Récupération des résultats
94
		try {
95
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
96
			if ($donnees === false) {
97
				$this->messages[] = "La requête a retourné aucun résultat.";
98
			} else {
99
				$info = $donnees['nbre'];
100
			}
101
		} catch (PDOException $e) {
102
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
103
		}
104
 
105
		return $info;
106
	}
107
 
108
	private function pretraiterParametresUrl($param) {
109
		// Tableau des paramêtres qui peuvent être passés dans l'url
110
		$params_passes = array('mots' => 'str',
111
			'sci' => 'bool',
112
			'bot' => 'int',
113
			'zg' => 'str',
114
			'p' => 'str',
115
			'pr' => 'int',
116
			'str-d' => 'defaut');
117
 
118
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
119
 
120
		foreach ($params_passes as $param_passe => $type) {
121
			if (isset($p[$param_passe])) {
122
				// Suppression des éventuels espaces en début et fin de chaine
123
				$valeur = trim($p[$param_passe]);
124
 
125
				// Type de paramêtre chaine
126
				if ($type == 'str') {
127
					// Suppression des slash
128
					$valeur = stripslashes($valeur);
129
 
130
					// Utilisation d'une recherche de chaîne exacte
131
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
132
						$valeur = '%'.$match[1].'%';
133
					} else {
134
						// Recherche de mots non liés
135
						$mots = explode(' ', $valeur);
136
						$valeur = '%'.implode ('%', $mots).'%';
137
					}
138
					// Mise en place des quotes pour l'intérogation dans la bdd
139
					$valeur = $this->bdd->quote($valeur);
140
				}
141
				// Type de paramêtre booléen
142
				if ($type == 'bool') {
143
					if (preg_match('/^[0]$/', $valeur)) {
144
						$valeur = false;
145
					} else if (preg_match('/^[1]$/', $valeur)) {
146
						$valeur = true;
147
					} else {
148
						$this->message[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
149
						$valeur = null;
150
					}
151
 
152
				}
153
				// Type de paramêtre entier
154
				if ($type == 'int') {
155
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
156
						$this->message[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
157
							"séparés par des virgules et non '$valeur'.";
158
						$valeur = null;
159
					}
160
				}
161
 
162
				$p[$param_passe] = $valeur;
163
			}
164
		}
165
		return $p;
166
	}
167
 
168
	private function construireFromEtWhere($p) {
169
		// Initialisation de variables
170
		$from_et_where = '';
171
		$from = 'FROM coel_collection '.
172
			'	LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) ';
173
		$where = 'WHERE ';
174
 
175
		// Construire from et where en fonction des paramêtres
176
		if (isset($p['mots'])) {
177
			$where .= 'AND ('.
178
				"	cc_nom LIKE {$p['mots']} ".
179
				"	OR cc_truk_nom_alternatif LIKE {$p['mots']} ".
180
				"	OR cc_truk_code LIKE {$p['mots']} ".
181
				"	OR cc_description LIKE {$p['mots']} ".
182
				"	OR cc_description_specialiste LIKE {$p['mots']} ".
183
				"	OR cc_historique LIKE {$p['mots']} ".
184
 
185
				"	OR cs_nom LIKE {$p['mots']} ".
186
				"	OR cs_adresse_01 LIKE {$p['mots']} ".
187
				"	OR cs_adresse_02 LIKE {$p['mots']} ".
188
				"	OR cs_ville LIKE {$p['mots']} ".
189
				"	OR cs_truk_identifiant_alternatif LIKE {$p['mots']} ".
190
				') ';
191
		}
192
		$this->debug[] = $p;
193
		if (isset($p['sci'])) {
194
			if ($p['sci'] === true) {
1502 jpm 195
				$where .= 'AND csv_mark_visite_avec_motif = 1 ';
196
			} else if ($p['sci'] === false) {
1497 jpm 197
				$where .= 'AND csv_mark_acces_ss_motif = 1 ';
198
			}
199
		}
200
		if (isset($p['bot'])) {
201
			$where .= "AND ccb_ce_truk_type IN ({$p['bot']}) ";
202
		}
203
		if (isset($p['zg'])) {
204
			$where .= "AND cc_truk_couverture_lieu LIKE {$p['zg']} ";
205
		}
206
		if (isset($p['p'])) {
207
			$where .= "AND cp_fmt_nom_complet LIKE {$p['p']} ";
208
		}
209
		if (isset($p['pr'])) {
210
			$where .= "AND ccap_id_role IN ({$p['pr']}) ";
211
		}
212
		if (isset($p['str-d'])) {
213
			$where .= 'AND cs_ce_truk_pays = 2654 '.
214
				"AND cs_code_postal LIKE '{$p['str-d']}%' ";
215
		}
216
 
217
 
218
		$where = str_replace('WHERE AND', 'WHERE', $where);
219
 
220
		// Gestion du from en fonction des paramêtres
221
		if (isset($p['sci'])) {
222
			$from .= '	LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure) ';
223
		}
224
		if (isset($p['bot'])) {
225
			$from .= '	LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection) ';
226
		}
227
		if (isset($p['p']) || isset($p['pr'])) {
228
			$from .= '	LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection) ';
229
		}
230
		if (isset($p['p'])) {
231
			$from .= '	LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne) ';
232
		}
233
 
234
		// Retour du From et Where associé
235
		$this->debug[] = count($p);
236
		if (count($p) == 0) {
237
			$from_et_where = $from;
238
		} else {
239
			$from_et_where = $from.$where;
240
		}
241
		return $from_et_where;
242
	}
243
}
244
?>