Subversion Repositories eFlore/Applications.coel

Rev

Rev 1507 | Rev 1545 | 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).
1517 jpm 57
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'cs_ville ASC, cs_nom ASC, cc_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',
1506 jpm 116
			'str-d' => 'defaut',
117
			'veg' => 'int');
1497 jpm 118
 
119
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
1506 jpm 120
		$this->debug[] = $param;
1497 jpm 121
		foreach ($params_passes as $param_passe => $type) {
122
			if (isset($p[$param_passe])) {
123
				// Suppression des éventuels espaces en début et fin de chaine
124
				$valeur = trim($p[$param_passe]);
125
 
126
				// Type de paramêtre chaine
127
				if ($type == 'str') {
128
					// Suppression des slash
129
					$valeur = stripslashes($valeur);
130
 
131
					// Utilisation d'une recherche de chaîne exacte
132
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
133
						$valeur = '%'.$match[1].'%';
134
					} else {
135
						// Recherche de mots non liés
136
						$mots = explode(' ', $valeur);
137
						$valeur = '%'.implode ('%', $mots).'%';
138
					}
139
					// Mise en place des quotes pour l'intérogation dans la bdd
140
					$valeur = $this->bdd->quote($valeur);
141
				}
142
				// Type de paramêtre booléen
143
				if ($type == 'bool') {
144
					if (preg_match('/^[0]$/', $valeur)) {
145
						$valeur = false;
146
					} else if (preg_match('/^[1]$/', $valeur)) {
147
						$valeur = true;
148
					} else {
1506 jpm 149
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
1497 jpm 150
						$valeur = null;
151
					}
152
 
153
				}
154
				// Type de paramêtre entier
155
				if ($type == 'int') {
156
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
1506 jpm 157
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
1497 jpm 158
							"séparés par des virgules et non '$valeur'.";
159
						$valeur = null;
160
					}
161
				}
162
 
163
				$p[$param_passe] = $valeur;
164
			}
165
		}
1506 jpm 166
 
1497 jpm 167
		return $p;
168
	}
169
 
170
	private function construireFromEtWhere($p) {
171
		// Initialisation de variables
172
		$from_et_where = '';
173
		$from = 'FROM coel_collection '.
174
			'	LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) ';
175
		$where = 'WHERE ';
176
 
177
		// Construire from et where en fonction des paramêtres
178
		if (isset($p['mots'])) {
179
			$where .= 'AND ('.
180
				"	cc_nom LIKE {$p['mots']} ".
181
				"	OR cc_truk_nom_alternatif LIKE {$p['mots']} ".
182
				"	OR cc_truk_code LIKE {$p['mots']} ".
183
				"	OR cc_description LIKE {$p['mots']} ".
184
				"	OR cc_description_specialiste LIKE {$p['mots']} ".
185
				"	OR cc_historique LIKE {$p['mots']} ".
186
 
187
				"	OR cs_nom LIKE {$p['mots']} ".
1506 jpm 188
				"	OR cs_truk_nom_alternatif LIKE {$p['mots']} ".
189
				"	OR cs_description LIKE {$p['mots']} ".
1497 jpm 190
				"	OR cs_adresse_01 LIKE {$p['mots']} ".
191
				"	OR cs_adresse_02 LIKE {$p['mots']} ".
192
				"	OR cs_ville LIKE {$p['mots']} ".
193
				"	OR cs_truk_identifiant_alternatif LIKE {$p['mots']} ".
1506 jpm 194
				"	OR cs_condition_acces LIKE {$p['mots']} ".
195
				"	OR cs_condition_usage LIKE {$p['mots']} ".
196
				"	OR cs_truk_telephone LIKE {$p['mots']} ".
197
				"	OR cs_courriel LIKE {$p['mots']} ".
198
				"	OR cs_truk_url LIKE {$p['mots']} ".
1497 jpm 199
				') ';
200
		}
201
		if (isset($p['sci'])) {
202
			if ($p['sci'] === true) {
1502 jpm 203
				$where .= 'AND csv_mark_visite_avec_motif = 1 ';
204
			} else if ($p['sci'] === false) {
1497 jpm 205
				$where .= 'AND csv_mark_acces_ss_motif = 1 ';
206
			}
207
		}
208
		if (isset($p['bot'])) {
209
			$where .= "AND ccb_ce_truk_type IN ({$p['bot']}) ";
210
		}
211
		if (isset($p['zg'])) {
212
			$where .= "AND cc_truk_couverture_lieu LIKE {$p['zg']} ";
213
		}
214
		if (isset($p['p'])) {
215
			$where .= "AND cp_fmt_nom_complet LIKE {$p['p']} ";
216
		}
217
		if (isset($p['pr'])) {
218
			$where .= "AND ccap_id_role IN ({$p['pr']}) ";
219
		}
220
		if (isset($p['str-d'])) {
221
			$where .= 'AND cs_ce_truk_pays = 2654 '.
222
				"AND cs_code_postal LIKE '{$p['str-d']}%' ";
223
		}
224
 
1506 jpm 225
		if (isset($p['veg'])) {
226
			$veg = explode(',', $p['veg']);
227
			$veg_nbre = count($veg);
228
 
229
			if ($veg_nbre == 1) {
230
				$where .= "AND ccb_truk_nature LIKE '%{$p['veg']}%' ";
231
			} else {
232
				$recherche = array();
233
				foreach ($veg as $id) {
234
					$recherche[] = "ccb_truk_nature LIKE '%$id%'";
235
				}
236
				$where .= 'AND ('.implode(' OR ', $recherche).') ';
237
			}
238
		}
239
 
1497 jpm 240
		$where = str_replace('WHERE AND', 'WHERE', $where);
241
 
242
		// Gestion du from en fonction des paramêtres
1507 jpm 243
		if (isset($p['str-d'])) {// ATTENTION : Remplace $from, doit être situé en première position!
244
			$from = 'FROM coel_structure '.
245
					'	LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure) ';
246
		}
1497 jpm 247
		if (isset($p['sci'])) {
248
			$from .= '	LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure) ';
249
		}
1506 jpm 250
		if (isset($p['bot']) || isset($p['veg'])) {
1497 jpm 251
			$from .= '	LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection) ';
252
		}
253
		if (isset($p['p']) || isset($p['pr'])) {
254
			$from .= '	LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection) ';
255
		}
256
		if (isset($p['p'])) {
257
			$from .= '	LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne) ';
258
		}
259
 
260
		// Retour du From et Where associé
261
		if (count($p) == 0) {
262
			$from_et_where = $from;
263
		} else {
264
			$from_et_where = $from.$where;
265
		}
266
		return $from_et_where;
267
	}
268
}
269
?>