Subversion Repositories Applications.referentiel

Rev

Rev 72 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
71 delphine 1
<?php
2
/**
3
 * Service fournissant des informations sur les référentiels 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		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
10
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
11
 * @version $Id$
12
 * @copyright	2010 Tela-Botanica
13
 */
14
class Recherche extends Ref {
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
		$referentiel = substr($p['ref'], 2, -2);
53
 
54
		// Construction de la requête
55
		if (isset($p['tax']) && $p['tax'] == true) {
56
			$requete_synonyme =	'SELECT DISTINCT num_nom_retenu FROM '.$referentiel.
57
					$this->construireFromEtWhere($p).';';
58
			try {
59
				$info = '';
60
				$donnees_synonyme = $this->bdd->query($requete_synonyme)->fetchAll(PDO::FETCH_ASSOC);
61
 
62
				if ($donnees_synonyme === false) {
63
					$this->messages[] = "La requête a retourné aucun résultat.";
64
				} else{
65
					$liste_nom = '';
66
					foreach ($donnees_synonyme as $donnees_syn) {
67
						if ($donnees_syn['num_nom_retenu'] != '') {
68
							$liste_nom .= (!empty($liste_nom) ? ', ' : '').'"'.$donnees_syn['num_nom_retenu'].'"';
69
						}
70
					}
71
 
72
					$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
73
					'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.' WHERE num_nom_retenu IN ('.$liste_nom.') '.
74
					'ORDER BY num_nom_retenu '."LIMIT $this->start, $this->limit ";
75
					$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
76
					$info = $donnees;
77
				}
78
			} catch (PDOException $e) {
79
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
80
			}
81
			return $info;
82
 
83
 
84
		} else {
85
			$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
86
					'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.
87
					$this->construireFromEtWhere($p).
88
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'num_nom ASC, nom_complet ASC').' '.
89
					"LIMIT $this->start, $this->limit ";
90
 
91
			// Récupération des résultats
92
			try {
93
				$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
94
				if ($donnees === false) {
95
					$this->messages[] = "La requête a retourné aucun résultat.";
96
				} else {
97
					$info = $donnees;
98
				}
99
			} catch (PDOException $e) {
100
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
101
			}
102
			return $info;
103
		}
104
	}
105
 
106
	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
107
 	 * restrictions.
108
	 * Appelée avec les paramêtres d'url suivant :
109
	 * /CoelRecherche/ParDefaut/_
110
	 * ou les _ représentent dans l'ordre : mots
111
	 * Si un des paramêtres est abscent, il prendre la valeur *
112
	 */
113
	public function getElementNombre($param) {
114
		// Initialisation des variables
115
		$info = array();
116
 
117
		// Pré traitement des paramêtres
118
		$p = $this->pretraiterParametresUrl($param);
119
		$referentiel = substr($p['ref'], 2, -2);
120
 
121
		// Construction de la requête
122
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
123
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(num_nom) AS nbre FROM '.$referentiel.
124
					$this->construireFromEtWhere($p).' ';
125
 
126
		// Récupération des résultats
127
		try {
128
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
129
			if ($donnees === false) {
130
				$this->messages[] = "La requête a retourné aucun résultat.";
131
			} else {
132
				$info = $donnees['nbre'];
133
			}
134
		} catch (PDOException $e) {
135
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
136
		}
137
 
138
		return $info;
139
	}
140
 
141
	private function pretraiterParametresUrl($param) {
142
		// Tableau des paramêtres qui peuvent être passés dans l'url
143
		$params_passes = array('ref' => 'str',
144
			'mots' => 'str',
145
			'sg' => 'str',
146
			'gen' => 'str',
147
			'sp' => 'str',
148
			'ssp' => 'str',
149
			'au' => 'str',
150
			'an' => 'str',
151
			'nn' => 'int',
152
			'bib' => 'str',
153
			'nr' => 'bool',
154
			'tax' => 'bool');
155
 
156
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
157
		$this->debug[] = $param;
158
		foreach ($params_passes as $param_passe => $type) {
159
			if (isset($p[$param_passe])) {
160
				// Suppression des éventuels espaces en début et fin de chaine
161
				$valeur = trim($p[$param_passe]);
162
 
163
				// Type de paramêtre chaine
164
				if ($type == 'str') {
165
					// Suppression des slash
166
					$valeur = stripslashes($valeur);
167
 
168
					// Utilisation d'une recherche de chaîne exacte
169
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
170
						$valeur = '%'.$match[1].'%';
171
					} else {
172
						// Recherche de mots non liés
173
						$mots = explode(' ', $valeur);
174
						$valeur = '%'.implode ('%', $mots).'%';
175
					}
176
					// Mise en place des quotes pour l'intérogation dans la bdd
177
					$valeur = $this->bdd->quote($valeur);
178
				}
179
				// Type de paramêtre booléen
180
				if ($type == 'bool') {
181
					if (preg_match('/^[0]$/', $valeur)) {
182
						$valeur = false;
183
					} else if (preg_match('/^[1]$/', $valeur)) {
184
						$valeur = true;
185
					} else {
186
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
187
						$valeur = null;
188
					}
189
 
190
				}
191
				// Type de paramêtre entier
192
				if ($type == 'int') {
193
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
194
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
195
							"séparés par des virgules et non '$valeur'.";
196
						$valeur = null;
197
					}
198
				}
199
 
200
				$p[$param_passe] = $valeur;
201
			}
202
		}
203
 
204
		return $p;
205
	}
206
 
207
	private function construireFromEtWhere($p) {
208
		// Initialisation de variables
209
		$from_et_where = '';
210
		//$from = "FROM ".$p['ref']." ";
211
		$where = ' WHERE ';
212
 
213
		// Construire from et where en fonction des paramêtres
214
		if (isset($p['mots'])) {
215
			$where .= 'AND ('.
216
				" num_nom LIKE {$p['mots']} ".
217
				" OR num_nom_retenu LIKE {$p['mots']} ".
218
				" OR num_tax_sup LIKE {$p['mots']} ".
219
				" OR rang LIKE {$p['mots']} ".
220
				" OR nom_complet LIKE {$p['mots']} ".
221
				" OR nom_supra_generique LIKE {$p['mots']} ".
222
				" OR genre LIKE {$p['mots']} ".
223
				" OR epithete_infra_generique LIKE {$p['mots']} ".
224
				" OR epithete_sp LIKE {$p['mots']} ".
225
				" OR type_epithete LIKE {$p['mots']} ".
226
				" OR epithete_infra_sp LIKE {$p['mots']} ".
227
				" OR cultivar_groupe LIKE {$p['mots']} ".
228
				" OR cultivar LIKE {$p['mots']} ".
229
				" OR nom_commercial LIKE {$p['mots']} ".
230
				" OR auteur LIKE {$p['mots']} ".
231
				" OR annee LIKE {$p['mots']} ".
232
				" OR biblio_origine LIKE {$p['mots']} ".
233
				" OR notes LIKE {$p['mots']} ".
234
				" OR nom_addendum LIKE {$p['mots']} ".
235
				" OR homonyme LIKE {$p['mots']} ".
236
				" OR basionyme LIKE {$p['mots']} ".
237
				" OR synonyme_proparte LIKE {$p['mots']} ".
238
				" OR synonyme_douteux LIKE {$p['mots']} ".
239
				" OR synonyme_mal_applique LIKE {$p['mots']} ".
240
				" OR synonyme_orthographique LIKE {$p['mots']} ".
241
				" OR biblio_statut LIKE {$p['mots']} ".
242
				" OR hybride_parent_01 LIKE {$p['mots']} ".
243
				" OR hybride_parent_01_notes LIKE {$p['mots']} ".
244
				" OR hybride_parent_02 LIKE {$p['mots']} ".
245
				" OR hybride_parent_02_notes LIKE {$p['mots']} ".
246
				" OR nom_francais LIKE {$p['mots']} ".
247
				" OR presence LIKE {$p['mots']} ".
248
				" OR statut_origine LIKE {$p['mots']} ".
249
				" OR statut_introduction LIKE {$p['mots']} ".
250
				" OR statut_culture LIKE {$p['mots']} ".
251
				') ';
252
		}
253
		if (isset($p['sg'])) {
254
			$where .= "AND nom_supra_generique LIKE {$p['sg']} ";
255
		}
256
		if (isset($p['gen'])) {
257
			$where .= "AND genre LIKE ({$p['gen']}) ";
258
		}
259
		if (isset($p['sp'])) {
260
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
261
		}
262
		if (isset($p['ssp'])) {
263
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
264
		}
265
		if (isset($p['au'])) {
266
			$where .= "AND auteur LIKE {$p['au']} ";
267
		}
268
		if (isset($p['an'])) {
269
			$where .= "AND annee LIKE ({$p['an']}) ";
270
		}
271
		if (isset($p['nn'])) {
272
			$where .= "AND num_nom LIKE ({$p['nn']}) ";
273
		}
274
		if (isset($p['bib'])) {
275
			$where .= "AND biblio_origine LIKE ({$p['bib']}) ";
276
		}
277
		if (isset($p['nr']) && $p['nr'] == true) {
278
			$where .= "AND num_nom_retenu = num_nom ";
279
		}
280
 
281
 
282
		$where = str_replace('WHERE AND', ' WHERE ', $where);
283
 
284
 
285
		// Retour du From et Where associé
286
		if (count($p) == 0) {
287
			$from_et_where = "";
288
			//$from_et_where = $from;
289
		} else {
290
			$from_et_where = $where;//$from.$where;
291
		}
292
		return $from_et_where;
293
	}
294
}
295
?>