Subversion Repositories eFlore/Applications.coel

Rev

Rev 1870 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1870 Rev 1890
1
<?php
1
<?php
2
/**
2
/**
3
 * Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
3
 * Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
4
 * fournis en paramètre.
4
 * fournis en paramètre.
5
 *
5
 *
6
 * @author Mathias Chouet
6
 * @author Mathias Chouet
7
 * @author Raphaël Droz <raphael@tela-botanica.org>
7
 * @author Raphaël Droz <raphael@tela-botanica.org>
8
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
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>
10
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @copyright 2009, 2013 Tela-Botanica
11
 * @copyright 2009, 2013 Tela-Botanica
12
 */
12
 */
13
class CoelRecherche extends Coel {
13
class CoelRecherche extends Coel {
14
	protected $fromClause = array();
14
	protected $fromClause = array();
15
	protected $whereClause = array();
15
	protected $whereClause = array();
16
	protected $joinClause = array();
16
	protected $joinClause = array();
17
 
17
 
18
	/**
18
	/**
19
	 * Méthode principale appelée avec une requête de type GET.
19
	 * Méthode principale appelée avec une requête de type GET.
20
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
20
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
21
	 */
21
	 */
22
	public function getElement($param = array()) {
22
	public function getElement($param = array()) {
23
		// Initialisation des variables
23
		// Initialisation des variables
24
		$info = array();
24
		$info = array();
25
		// Nous recherchons le type de requête demandé
25
		// Nous recherchons le type de requête demandé
26
		$type = $param[0];
26
		$type = $param[0];
27
		$methode = 'getElement'.$type;
27
		$methode = 'getElement'.$type;
28
 
28
 
29
		if (method_exists($this, $methode)) {
29
		if (method_exists($this, $methode)) {
30
			array_shift($param);
30
			array_shift($param);
31
			$info = $this->$methode($param);
31
			$info = $this->$methode($param);
32
		} else {
32
		} else {
33
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
33
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
34
		}
34
		}
35
		
35
		
36
		// Envoie sur la sortie standard
36
		// Envoie sur la sortie standard
37
		if($this->formatRetour == 'text/plain') {
37
		if($this->formatRetour == 'text/plain') {
38
			$this->envoyer($info, 'text/plain', 'utf-8', false);
38
			$this->envoyer($info, 'text/plain', 'utf-8', false);
39
			exit;
39
			exit;
40
		}
40
		}
41
		$this->envoyer($info);
41
		$this->envoyer($info);
42
	}
42
	}
43
 
43
 
44
	/** @deprecated retro-compatibilité */
44
	/** @deprecated retro-compatibilité */
45
	public function getElementParDefaut($param) {
45
	public function getElementParDefaut($param) {
46
		return $this->getElementCollections($param);
46
		return $this->getElementCollections($param);
47
	}
47
	}
48
	/** @deprecated retro-compatibilité */
48
	/** @deprecated retro-compatibilité */
49
	public function getElementNombre($param) {
49
	public function getElementNombre($param) {
50
		return $this->getElementNombreCollections($param);
50
		return $this->getElementNombreCollections($param);
51
	}
51
	}
52
 
52
 
53
	/**
53
	/**
54
	 * Retourne les collections correspondant aux critères de recherche
54
	 * Retourne les collections correspondant aux critères de recherche
55
	 */
55
	 */
56
	public function getElementCollections($param) {
56
	public function getElementCollections($param) {
57
		// Pré traitement des paramêtres
57
		// Pré traitement des paramêtres
58
		$p = $this->pretraiterParametresUrlCollections($param, $_GET);
58
		$p = $this->pretraiterParametresUrlCollections($param, $_GET);
59
 
59
 
60
		// Construction des clauses
60
		// Construction des clauses
61
		self::construireFromEtWhereCollections($p);
61
		self::construireFromEtWhereCollections($p);
62
 
62
 
63
		// Construction de la requête
63
		// Construction de la requête
64
		$champs = "cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom";
64
		$champs = "cs_id_structure, cs_ville, cs_nom, cs_code_postal, cs_latitude, cs_longitude, cc_id_collection, cc_nom";
65
		$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
65
		$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
66
		$requete = $this->assemblerRequete($champs);
66
		$requete = $this->assemblerRequete($champs);
67
 
67
 
68
		$info =$this->lancerRequete($requete);
68
		$info =$this->lancerRequete($requete);
69
		return $info;
69
		return $info;
70
	}
70
	}
71
 
71
 
72
	/**
72
	/**
73
	 * Retourne le nombre de collections correspondant aux critères de recherche
73
	 * Retourne le nombre de collections correspondant aux critères de recherche
74
	 */
74
	 */
75
	public function getElementNombreCollections($param) {
75
	public function getElementNombreCollections($param) {
76
		
76
		
77
		// Pré traitement des paramêtres
77
		// Pré traitement des paramêtres
78
		$p = $this->pretraiterParametresUrlCollections($param, $_GET);
78
		$p = $this->pretraiterParametresUrlCollections($param, $_GET);
79
 
79
 
80
		// Construction des clauses
80
		// Construction des clauses
81
		self::construireFromEtWhereCollections($p);
81
		self::construireFromEtWhereCollections($p);
82
		
82
		
83
		// Construction de la requête
83
		// Construction de la requête
84
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
84
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
85
		// @WTF si on compte(*) on a le nombre d'associations structure-collection
85
		// @WTF si on compte(*) on a le nombre d'associations structure-collection
86
		// si on compte(cs_id_structure) on a le nombre d'associations structure-collection dont la structure n'est pas null
86
		// si on compte(cs_id_structure) on a le nombre d'associations structure-collection dont la structure n'est pas null
87
		// 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
87
		// 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
88
		// @AMHA on devrait compter(*) car la recherche de collections renvoie même celles qui ont une structure null
88
		// @AMHA on devrait compter(*) car la recherche de collections renvoie même celles qui ont une structure null
89
		$champs = 'COUNT(*) AS nbre, cc_id_collection ';
89
		$champs = 'COUNT(*) AS nbre, cc_id_collection ';
90
		$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
90
		$this->orderby = is_null($this->orderby) ? 'cs_ville ASC, cs_nom ASC, cc_nom ASC' : $this->orderby;
91
		$requete = $this->assemblerRequete($champs);
91
		$requete = $this->assemblerRequete($champs);
92
 
92
 
93
		$info = $this->lancerRequeteNombre($requete);
93
		$info = $this->lancerRequeteNombre($requete);
94
 
94
 
95
		return $info;
95
		return $info;
96
	}
96
	}
97
 
97
 
98
	/**
98
	/**
99
	 * Retourne les personnes correspondant aux critères de recherche
99
	 * Retourne les personnes correspondant aux critères de recherche
100
	 */
100
	 */
101
	public function getElementPersonnes($param) {
101
	public function getElementPersonnes($param) {
102
		// Pré traitement des paramêtres
102
		// Pré traitement des paramêtres
103
		$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
103
		$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
104
 
104
 
105
		// Construction des clauses
105
		// Construction des clauses
106
		self::construireFromEtWherePersonnes($p);
106
		self::construireFromEtWherePersonnes($p);
107
		$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';
107
		$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';
108
		$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
108
		$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
109
		$requete = $this->assemblerRequete($champs);
109
		$requete = $this->assemblerRequete($champs);
110
		
110
		
111
		$info = $this->lancerRequete($requete);
111
		$info = $this->lancerRequete($requete);
112
		return $info;
112
		return $info;
113
	}
113
	}
114
 
114
 
115
	/**
115
	/**
116
	 * Retourne le nombre de personnes correspondant aux critères de recherche
116
	 * Retourne le nombre de personnes correspondant aux critères de recherche
117
	 */
117
	 */
118
	public function getElementNombrePersonnes($param) {
118
	public function getElementNombrePersonnes($param) {
119
		// Pré traitement des paramêtres
119
		// Pré traitement des paramêtres
120
		$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
120
		$p = $this->pretraiterParametresUrlPersonnes($param, $_GET);
121
 
121
 
122
		// Construction des clauses
122
		// Construction des clauses
123
		self::construireFromEtWherePersonnes($p);
123
		self::construireFromEtWherePersonnes($p);
124
		$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
124
		$this->orderby = is_null($this->orderby) ? 'cp_nom ASC, cp_prenom ASC' : $this->orderby;
125
		$champs = 'count(*) as nbre';
125
		$champs = 'count(*) as nbre';
126
		// Construction de la requête
126
		// Construction de la requête
127
		$requete = $this->assemblerRequete($champs);
127
		$requete = $this->assemblerRequete($champs);
128
		$info = $this->lancerRequeteNombre($requete);
128
		$info = $this->lancerRequeteNombre($requete);
129
		return $info;
129
		return $info;
130
	}
130
	}
131
	
131
	
132
	/**
132
	/**
133
	 * Retourne les publications correspondant aux critères de recherche
133
	 * Retourne les publications correspondant aux critères de recherche
134
	 */
134
	 */
135
	public function getElementPublications($param) {
135
	public function getElementPublications($param) {
136
		// Pré traitement des paramêtres
136
		// Pré traitement des paramêtres
137
		$p = $this->pretraiterParametresUrlPublications($param, $_GET);
137
		$p = $this->pretraiterParametresUrlPublications($param, $_GET);
138
	
138
	
139
		// Construction des clauses
139
		// Construction des clauses
140
		self::construireFromEtWherePublications($p);
140
		self::construireFromEtWherePublications($p);
141
		$champs = '*';
141
		$champs = '*';
142
		$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
142
		$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
143
		$requete = $this->assemblerRequete($champs);
143
		$requete = $this->assemblerRequete($champs);
144
	
144
	
145
		$info = $this->lancerRequete($requete);
145
		$info = $this->lancerRequete($requete);
146
		return $info;
146
		return $info;
147
	}
147
	}
148
	
148
	
149
	/**
149
	/**
150
	 * Retourne le nombre de personnes correspondant aux critères de recherche
150
	 * Retourne le nombre de personnes correspondant aux critères de recherche
151
	 */
151
	 */
152
	public function getElementNombrePublications($param) {
152
	public function getElementNombrePublications($param) {
153
		// Pré traitement des paramêtres
153
		// Pré traitement des paramêtres
154
		$p = $this->pretraiterParametresUrlPublications($param, $_GET);
154
		$p = $this->pretraiterParametresUrlPublications($param, $_GET);
155
	
155
	
156
		// Construction des clauses
156
		// Construction des clauses
157
		self::construireFromEtWherePublications($p);
157
		self::construireFromEtWherePublications($p);
158
		$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
158
		$this->orderby = is_null($this->orderby) ? 'cpu_fmt_auteur ASC' : $this->orderby;
159
		$champs = 'count(*) as nbre';
159
		$champs = 'count(*) as nbre';
160
		// Construction de la requête
160
		// Construction de la requête
161
		$requete = $this->assemblerRequete($champs);
161
		$requete = $this->assemblerRequete($champs);
162
		$info = $this->lancerRequeteNombre($requete);
162
		$info = $this->lancerRequeteNombre($requete);
163
		return $info;
163
		return $info;
164
	}
164
	}
165
	
165
	
166
	private function assemblerRequete($champs) {
166
	private function assemblerRequete($champs) {
167
		// Construction de la requête
167
		// Construction de la requête
168
		$requete = sprintf(
168
		$requete = sprintf(
169
				'SELECT %s %s'
169
				'SELECT %s %s'
170
				. ' FROM %s %s'
170
				. ' FROM %s %s'
171
				. ' WHERE %s ORDER BY %s %s -- %s:%d',
171
				. ' WHERE %s ORDER BY %s %s -- %s:%d',
172
	
172
	
173
				$this->distinct ? 'DISTINCT' : '',
173
				$this->distinct ? 'DISTINCT' : '',
174
				$champs,
174
				$champs,
175
				implode(',', $this->fromClause),
175
				implode(',', $this->fromClause),
176
				implode(' ', $this->joinClause),
176
				implode(' ', $this->joinClause),
177
				$this->whereClause ? implode(" AND ", $this->whereClause) : TRUE,
177
				$this->whereClause ? implode(" AND ", $this->whereClause) : TRUE,
178
				$this->orderby,
178
				$this->orderby,
179
				$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
179
				$this->limit != -1 ? "LIMIT {$this->start}, {$this->limit}" : "",
180
				__FILE__,
180
				__FILE__,
181
				__LINE__
181
				__LINE__
182
		);
182
		);
183
		//echo "REQUETE: " . $requete;
183
		//echo "REQUETE: " . $requete;
184
		//exit;
184
		//exit;
185
		return $requete;
185
		return $requete;
186
	}
186
	}
187
	
187
	
188
	private function lancerRequete($requete) {
188
	private function lancerRequete($requete) {
189
		$info = array();
189
		$info = array();
190
		// Récupération des résultats
190
		// Récupération des résultats
191
		try {
191
		try {
192
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
192
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
193
			if ($donnees === false) {
193
			if ($donnees === false) {
194
				$this->messages[] = "La requête n'a retourné aucun résultat.";
194
				$this->messages[] = "La requête n'a retourné aucun résultat.";
195
			} else {
195
			} else {
196
				$info = $donnees;
196
				$info = $donnees;
197
			}
197
			}
198
		} catch (PDOException $e) {
198
		} catch (PDOException $e) {
199
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
199
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
200
		}
200
		}
201
		return $info;
201
		return $info;
202
	}
202
	}
203
	
203
	
204
	private function lancerRequeteNombre($requete) {
204
	private function lancerRequeteNombre($requete) {
205
		$info = array();
205
		$info = array();
206
		// Récupération des résultats
206
		// Récupération des résultats
207
		try {
207
		try {
208
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
208
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
209
			if ($donnees === false) {
209
			if ($donnees === false) {
210
				$this->messages[] = "La requête n'a retourné aucun résultat.";
210
				$this->messages[] = "La requête n'a retourné aucun résultat.";
211
			} else {
211
			} else {
212
				$info = $donnees['nbre'];
212
				$info = $donnees['nbre'];
213
			}
213
			}
214
		} catch (PDOException $e) {
214
		} catch (PDOException $e) {
215
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
215
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
216
		}
216
		}
217
		return $info;
217
		return $info;
218
	}
218
	}
219
 
219
 
220
	// Voici les paramètres qu'il faut passer au service Collections, tous et dans l'ordre (soit une valeur soit '*')
220
	// Voici les paramètres qu'il faut passer au service Collections, tous et dans l'ordre (soit une valeur soit '*')
221
	private function pretraiterParametresUrlCollections($param, $qs) {
221
	private function pretraiterParametresUrlCollections($param, $qs) {
222
		$params_passes = array(
222
		$params_passes = array(
223
			'mots' => 'str', 
223
			'mots' => 'str', 
224
			'sci' => 'bool', 
224
			'sci' => 'bool', 
225
			'bot' => 'int', 
225
			'bot' => 'int', 
226
			'lieu-stockage' => 'str',
226
			'lieu-stockage' => 'str',
227
			'zg' => 'str', 
227
			'zg' => 'str', 
228
			'p' => 'str', 
228
			'p' => 'str', 
229
			'pr' => 'int',
229
			'pr' => 'int',
230
			'str-d' => 'frdepliste',
230
			'str-d' => 'frdepliste',
231
			'veg' => 'int'
231
			'veg' => 'int'
232
		);
232
		);
233
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
233
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
234
	}
234
	}
235
 
235
 
236
	// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
236
	// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
237
	private function pretraiterParametresUrlPersonnes($param, $qs) {
237
	private function pretraiterParametresUrlPersonnes($param, $qs) {
238
		$params_passes = array(
238
		$params_passes = array(
239
			'nom-famille' => 'str', 
239
			'nom-famille' => 'str', 
240
			'adresse' => 'str', 
240
			'adresse' => 'str', 
241
			'date-vivant' => 'int'
241
			'date-vivant' => 'int'
242
		);
242
		);
243
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
243
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
244
	}
244
	}
245
	
245
	
246
	// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
246
	// Voici les paramètres qu'il faut passer au service Personnes, tous et dans l'ordre (soit une valeur soit '*')
247
	private function pretraiterParametresUrlPublications($param, $qs) {
247
	private function pretraiterParametresUrlPublications($param, $qs) {
248
		$params_passes = array(
248
		$params_passes = array(
-
 
249
				'libre' => 'str',
249
				'titre' => 'str',
250
				'titre' => 'str',
250
				'auteur' => 'str',
251
				'auteur' => 'str',
251
				'mot-cle' => 'str',
252
				'mot-cle' => 'str',
252
				'revue' => 'str',
253
				'ouvrage' => 'str',
253
				'date' => 'str'
254
				'date' => 'str'
254
		);
255
		);
255
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
256
		return $this->pretraiterParametresUrl($param, $qs, $params_passes);
256
	}
257
	}
257
 
258
 
258
	private function pretraiterParametresUrl($param, $qs, $params_passes) {
259
	private function pretraiterParametresUrl($param, $qs, $params_passes) {
259
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
260
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
260
		$this->debug[] = $param;
261
		$this->debug[] = $param;
261
		foreach ($params_passes as $param_passe => $type) {
262
		foreach ($params_passes as $param_passe => $type) {
262
			if (isset($p[$param_passe])) {
263
			if (isset($p[$param_passe])) {
263
				// Suppression des éventuels espaces en début et fin de chaine
264
				// Suppression des éventuels espaces en début et fin de chaine
264
				$valeur = trim($p[$param_passe]);
265
				$valeur = trim($p[$param_passe]);
265
				
266
				
266
				// Type de paramêtre chaine
267
				// Type de paramêtre chaine
267
				if ($type == 'str') {
268
				if ($type == 'str') {
268
					// Suppression des slash
269
					// Suppression des slash
269
					$valeur = stripslashes($valeur);
270
					$valeur = stripslashes($valeur);
270
					
271
					
271
					// Utilisation d'une recherche de chaîne exacte
272
					// Utilisation d'une recherche de chaîne exacte
272
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
273
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
273
						$valeur = '%'.$match[1].'%';
274
						$valeur = '%'.$match[1].'%';
274
					} else {
275
					} else {
275
						// Recherche de mots non liés
276
						// Recherche de mots non liés
276
						$mots = explode(' ', $valeur);
277
						$mots = explode(' ', $valeur);
277
						$valeur = '%'.implode ('%', $mots).'%';
278
						$valeur = '%'.implode ('%', $mots).'%';
278
					}
279
					}
279
					// Mise en place des quotes pour l'intérogation dans la bdd
280
					// Mise en place des quotes pour l'intérogation dans la bdd
280
					$valeur = $this->bdd->quote($valeur);
281
					$valeur = $this->bdd->quote($valeur);
281
				}
282
				}
282
				// Type de paramêtre booléen
283
				// Type de paramêtre booléen
283
				if ($type == 'bool') {
284
				if ($type == 'bool') {
284
					if (preg_match('/^[0]$/', $valeur)) {
285
					if (preg_match('/^[0]$/', $valeur)) {
285
						$valeur = false;
286
						$valeur = false;
286
					} else if (preg_match('/^[1]$/', $valeur)) {
287
					} else if (preg_match('/^[1]$/', $valeur)) {
287
						$valeur = true;
288
						$valeur = true;
288
					} else {
289
					} else {
289
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
290
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
290
						$valeur = null;
291
						$valeur = null;
291
					}
292
					}
292
					
293
					
293
				}
294
				}
294
				// Type de paramêtre entier
295
				// Type de paramêtre entier
295
				if ($type == 'int') {
296
				if ($type == 'int') {
296
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
297
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
297
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
298
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
298
							"séparés par des virgules et non '$valeur'.";
299
							"séparés par des virgules et non '$valeur'.";
299
						$valeur = null;
300
						$valeur = null;
300
					}
301
					}
301
				}
302
				}
302
 
303
 
303
				if ($type == 'frdepliste') {
304
				if ($type == 'frdepliste') {
304
					$valeur = array_filter(explode(',', $valeur), create_function('$val', 'return preg_match("/^(\d+|2A|2B)$/i", $val);'));
305
					$valeur = array_filter(explode(',', $valeur), create_function('$val', 'return preg_match("/^(\d+|2A|2B)$/i", $val);'));
305
				}
306
				}
306
 
307
 
307
				$p[$param_passe] = $valeur;
308
				$p[$param_passe] = $valeur;
308
			}
309
			}
309
		}
310
		}
310
 
311
 
311
        if(isset($qs['pays'])) {
312
        if(isset($qs['pays'])) {
312
            $p['pays'] = array_filter(explode(',', $qs['pays']), create_function('$val', 'return preg_match("/^[A-Z][A-Z]$/", $val);'));
313
            $p['pays'] = array_filter(explode(',', $qs['pays']), create_function('$val', 'return preg_match("/^[A-Z][A-Z]$/", $val);'));
313
            if(!$p['pays']) unset($p['pays']);
314
            if(!$p['pays']) unset($p['pays']);
314
        }
315
        }
315
 
316
 
316
		return $p;
317
		return $p;
317
	}
318
	}
318
 
319
 
319
	// construit les clauses FROM et WHERE pour la recherche de collections (#CaptainObvious)
320
	// construit les clauses FROM et WHERE pour la recherche de collections (#CaptainObvious)
320
	private function construireFromEtWhereCollections($p) {
321
	private function construireFromEtWhereCollections($p) {
321
		$this->fromClause = array('coel_collection');
322
		$this->fromClause = array('coel_collection');
322
		$this->joinClause = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
323
		$this->joinClause = array('LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure)');
323
		$this->whereClause = array();
324
		$this->whereClause = array();
324
 
325
 
325
		// Gestion du from en fonction des paramêtres
326
		// Gestion du from en fonction des paramêtres
326
		if (isset($p['str-d'])) {// ATTENTION : Remplace $this->fromClause, doit être situé en première position!
327
		if (isset($p['str-d'])) {// ATTENTION : Remplace $this->fromClause, doit être situé en première position!
327
			$this->fromClause = array('coel_structure');
328
			$this->fromClause = array('coel_structure');
328
			$this->joinClause = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
329
			$this->joinClause = array('LEFT JOIN coel_collection ON (cs_id_structure = cc_ce_structure)');
329
		}
330
		}
330
		
331
		
331
		// Construire from et where en fonction des paramêtres 
332
		// Construire from et where en fonction des paramêtres 
332
		if (isset($p['mots'])) {
333
		if (isset($p['mots'])) {
333
			$this->whereClause[] = '(' . implode(' OR ', array(
334
			$this->whereClause[] = '(' . implode(' OR ', array(
334
				"cc_nom LIKE {$p['mots']}",
335
				"cc_nom LIKE {$p['mots']}",
335
				"cc_truk_nom_alternatif LIKE {$p['mots']}",
336
				"cc_truk_nom_alternatif LIKE {$p['mots']}",
336
				"cc_truk_code LIKE {$p['mots']}",
337
				"cc_truk_code LIKE {$p['mots']}",
337
				"cc_description LIKE {$p['mots']}",
338
				"cc_description LIKE {$p['mots']}",
338
				"cc_description_specialiste LIKE {$p['mots']}",
339
				"cc_description_specialiste LIKE {$p['mots']}",
339
				"cc_historique LIKE {$p['mots']}",
340
				"cc_historique LIKE {$p['mots']}",
340
				"cs_nom LIKE {$p['mots']}",
341
				"cs_nom LIKE {$p['mots']}",
341
				"cs_truk_nom_alternatif LIKE {$p['mots']}",
342
				"cs_truk_nom_alternatif LIKE {$p['mots']}",
342
				"cs_description LIKE {$p['mots']}",
343
				"cs_description LIKE {$p['mots']}",
343
				"cs_adresse_01 LIKE {$p['mots']}",
344
				"cs_adresse_01 LIKE {$p['mots']}",
344
				"cs_ville LIKE {$p['mots']}",
345
				"cs_ville LIKE {$p['mots']}",
345
				"cs_truk_identifiant_alternatif LIKE {$p['mots']}",
346
				"cs_truk_identifiant_alternatif LIKE {$p['mots']}",
346
				"cs_condition_acces LIKE {$p['mots']}",
347
				"cs_condition_acces LIKE {$p['mots']}",
347
				"cs_condition_usage LIKE {$p['mots']}",
348
				"cs_condition_usage LIKE {$p['mots']}",
348
				"cs_truk_telephone LIKE {$p['mots']}",
349
				"cs_truk_telephone LIKE {$p['mots']}",
349
				"cs_courriel LIKE {$p['mots']}",
350
				"cs_courriel LIKE {$p['mots']}",
350
				"cs_truk_url LIKE {$p['mots']}")) . ')';
351
				"cs_truk_url LIKE {$p['mots']}")) . ')';
351
		}
352
		}
352
 
353
 
353
		if (isset($p['sci'])) {
354
		if (isset($p['sci'])) {
354
			if ($p['sci'] === true) {
355
			if ($p['sci'] === true) {
355
				$this->whereClause[] = 'csv_mark_visite_avec_motif = 1';
356
				$this->whereClause[] = 'csv_mark_visite_avec_motif = 1';
356
			} else if ($p['sci'] === false) {
357
			} else if ($p['sci'] === false) {
357
				$this->whereClause[] = 'csv_mark_acces_ss_motif = 1';
358
				$this->whereClause[] = 'csv_mark_acces_ss_motif = 1';
358
			}
359
			}
359
		}
360
		}
360
		if (isset($p['bot'])) {
361
		if (isset($p['bot'])) {
361
			$this->whereClause[] = "ccb_ce_truk_type IN ({$p['bot']})";
362
			$this->whereClause[] = "ccb_ce_truk_type IN ({$p['bot']})";
362
		}
363
		}
363
		if (isset($p['lieu-stockage'])) {
364
		if (isset($p['lieu-stockage'])) {
364
      $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays';
365
      $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cs_ce_truk_pays';
365
			$this->whereClause[] = '(' . implode(' OR ', array(
366
			$this->whereClause[] = '(' . implode(' OR ', array(
366
				"cs_adresse_01 LIKE {$p['lieu-stockage']}",
367
				"cs_adresse_01 LIKE {$p['lieu-stockage']}",
367
				"cs_code_postal LIKE {$p['lieu-stockage']}",
368
				"cs_code_postal LIKE {$p['lieu-stockage']}",
368
				"cs_ville LIKE {$p['lieu-stockage']}",
369
				"cs_ville LIKE {$p['lieu-stockage']}",
369
				"cs_ce_truk_pays LIKE {$p['lieu-stockage']}",
370
				"cs_ce_truk_pays LIKE {$p['lieu-stockage']}",
370
				"cmlv.cmlv_nom LIKE {$p['lieu-stockage']}",
371
				"cmlv.cmlv_nom LIKE {$p['lieu-stockage']}",
371
			)) . ')';
372
			)) . ')';
372
		}
373
		}
373
		if (isset($p['zg'])) {
374
		if (isset($p['zg'])) {
374
			$this->whereClause[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
375
			$this->whereClause[] = "cc_truk_couverture_lieu LIKE {$p['zg']}";
375
		}
376
		}
376
		if (isset($p['p'])) {
377
		if (isset($p['p'])) {
377
			$this->whereClause[] = "cp_fmt_nom_complet LIKE {$p['p']}";
378
			$this->whereClause[] = "cp_fmt_nom_complet LIKE {$p['p']}";
378
		}
379
		}
379
		if (isset($p['pr'])) {
380
		if (isset($p['pr'])) {
380
			$this->whereClause[] = "ccap_id_role IN ({$p['pr']})";
381
			$this->whereClause[] = "ccap_id_role IN ({$p['pr']})";
381
		}
382
		}
382
 
383
 
383
        // par défaut, spécifier un département restreint à la France
384
        // par défaut, spécifier un département restreint à la France
384
        // TODO: INNER JOIN
385
        // TODO: INNER JOIN
385
		if (isset($p['str-d'])) {
386
		if (isset($p['str-d'])) {
386
            $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
387
            $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
387
			$this->whereClause[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')";
388
			$this->whereClause[] = "cv.cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')";
388
			$this->whereClause[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d']));
389
			$this->whereClause[] = sprintf("cs_code_postal REGEXP '^(%s).*'", implode('|', $p['str-d']));
389
		}
390
		}
390
 
391
 
391
		if (isset($p['pays'])) {
392
		if (isset($p['pays'])) {
392
            if(array_search('FR', $p['pays']) !== FALSE) $p['pays'] = array_merge($p['pays'], array('RE','YT','GP','MQ','GF','NC'));
393
            if(array_search('FR', $p['pays']) !== FALSE) $p['pays'] = array_merge($p['pays'], array('RE','YT','GP','MQ','GF','NC'));
393
            $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
394
            $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cv ON cv.cmlv_id_valeur = cs_ce_truk_pays';
394
			$this->whereClause[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays']));
395
			$this->whereClause[] = sprintf('cv.cmlv_abreviation IN ("%s")', implode('","', $p['pays']));
395
		}
396
		}
396
 
397
 
397
		if (isset($p['veg'])) {
398
		if (isset($p['veg'])) {
398
			$veg = explode(',', $p['veg']);
399
			$veg = explode(',', $p['veg']);
399
			$veg_nbre = count($veg);
400
			$veg_nbre = count($veg);
400
			
401
			
401
			if ($veg_nbre == 1) {
402
			if ($veg_nbre == 1) {
402
				$this->whereClause[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
403
				$this->whereClause[] = "ccb_truk_nature LIKE '%{$p['veg']}%'";
403
			} else {
404
			} else {
404
				$recherche = array();
405
				$recherche = array();
405
				foreach ($veg as $id) {
406
				foreach ($veg as $id) {
406
					$recherche[] = "ccb_truk_nature LIKE '%$id%'";
407
					$recherche[] = "ccb_truk_nature LIKE '%$id%'";
407
				}
408
				}
408
				$this->whereClause[] = '('.implode(' OR ', $recherche).') ';
409
				$this->whereClause[] = '('.implode(' OR ', $recherche).') ';
409
			}
410
			}
410
		}
411
		}
411
		
412
		
412
 
413
 
413
		if (isset($p['sci'])) {
414
		if (isset($p['sci'])) {
414
			$this->joinClause[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
415
			$this->joinClause[] = 'LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure)';
415
		}
416
		}
416
		if (isset($p['bot']) || isset($p['veg'])) {
417
		if (isset($p['bot']) || isset($p['veg'])) {
417
			$this->joinClause[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
418
			$this->joinClause[] = 'LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection)';
418
		}
419
		}
419
		if (isset($p['p']) || isset($p['pr'])) {
420
		if (isset($p['p']) || isset($p['pr'])) {
420
			$this->joinClause[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
421
			$this->joinClause[] = 'LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection)';
421
		}
422
		}
422
		if (isset($p['p'])) {
423
		if (isset($p['p'])) {
423
			$this->joinClause[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
424
			$this->joinClause[] = 'LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne)';
424
		}
425
		}
425
 
426
 
426
        $this->joinClause = array_unique($this->joinClause);
427
        $this->joinClause = array_unique($this->joinClause);
427
	}
428
	}
428
 
429
 
429
	// construit les clauses FROM et WHERE pour la recherche de personnes (#CaptainObvious)
430
	// construit les clauses FROM et WHERE pour la recherche de personnes (#CaptainObvious)
430
	private function construireFromEtWherePersonnes($p) {
431
	private function construireFromEtWherePersonnes($p) {
431
		$this->fromClause = array('coel_personne');
432
		$this->fromClause = array('coel_personne');
432
		$this->joinClause = array();
433
		$this->joinClause = array();
433
		$this->whereClause = array();
434
		$this->whereClause = array();
434
 
435
 
435
		//"cp_truk_recolte LIKE {$p['adresse']}", // Inclure le lieu de récolte ?
436
		//"cp_truk_recolte LIKE {$p['adresse']}", // Inclure le lieu de récolte ?
436
 
437
 
437
		if (isset($p['nom-famille'])) {
438
		if (isset($p['nom-famille'])) {
438
			$this->whereClause[] = "cp_nom LIKE {$p['nom-famille']}";
439
			$this->whereClause[] = "cp_nom LIKE {$p['nom-famille']}";
439
		}
440
		}
440
		if (isset($p['adresse'])) {
441
		if (isset($p['adresse'])) {
441
      $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays';
442
      $this->joinClause[] = 'LEFT JOIN coel_meta_liste_valeur cmlv ON cmlv.cmlv_id_valeur = cp_ce_truk_pays';
442
			$this->whereClause[] = '(' . implode(' OR ', array(
443
			$this->whereClause[] = '(' . implode(' OR ', array(
443
				"cp_adresse_01 LIKE {$p['adresse']}",
444
				"cp_adresse_01 LIKE {$p['adresse']}",
444
				"cp_code_postal LIKE {$p['adresse']}",
445
				"cp_code_postal LIKE {$p['adresse']}",
445
				"cp_ville LIKE {$p['adresse']}",
446
				"cp_ville LIKE {$p['adresse']}",
446
				"cp_ce_truk_pays LIKE {$p['adresse']}",
447
				"cp_ce_truk_pays LIKE {$p['adresse']}",
447
				"cp_naissance_lieu LIKE {$p['adresse']}",
448
				"cp_naissance_lieu LIKE {$p['adresse']}",
448
				"cp_deces_lieu LIKE {$p['adresse']}",
449
				"cp_deces_lieu LIKE {$p['adresse']}",
449
				"cmlv.cmlv_nom LIKE {$p['adresse']}",
450
				"cmlv.cmlv_nom LIKE {$p['adresse']}",
450
			)) . ')';
451
			)) . ')';
451
		}
452
		}
452
		if (isset($p['date-vivant'])) {
453
		if (isset($p['date-vivant'])) {
453
			$this->whereClause[] = "cp_naissance_date <= {$p['date-vivant']}";
454
			$this->whereClause[] = "cp_naissance_date <= {$p['date-vivant']}";
454
			$this->whereClause[] = "cp_deces_date >= {$p['date-vivant']}";
455
			$this->whereClause[] = "cp_deces_date >= {$p['date-vivant']}";
455
			$this->whereClause[] = "cp_naissance_date IS NOT NULL";
456
			$this->whereClause[] = "cp_naissance_date IS NOT NULL";
456
			$this->whereClause[] = "cp_deces_date IS NOT NULL";
457
			$this->whereClause[] = "cp_deces_date IS NOT NULL";
457
			//$this->whereClause[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})";
458
			//$this->whereClause[] = "(cp_deces_date IS NULL OR cp_deces_date >= {$p['date-vivant']})";
458
		}
459
		}
459
 
460
 
460
		// pour inclure éventuellement les adresses de la structure
461
		// pour inclure éventuellement les adresses de la structure
461
		/*if (isset($p['adresse'])) {
462
		/*if (isset($p['adresse'])) {
462
			$this->joinClause[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)';
463
			$this->joinClause[] = 'JOIN coel_structure_a_personne ON (cp_id_personne = csap_id_personne)';
463
			$this->joinClause[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)';
464
			$this->joinClause[] = 'JOIN coel_structure ON (cs_id_structure = csap_id_structure)';
464
		}*/
465
		}*/
465
        $this->joinClause = array_unique($this->joinClause);
466
        $this->joinClause = array_unique($this->joinClause);
466
	}
467
	}
467
	
468
	
468
	// construit les clauses FROM et WHERE pour la recherche de publications (#CaptainObvious)
469
	// construit les clauses FROM et WHERE pour la recherche de publications (#CaptainObvious)
469
	private function construireFromEtWherePublications($p) {
470
	private function construireFromEtWherePublications($p) {
470
		$this->fromClause = array('coel_publication');
471
		$this->fromClause = array('coel_publication');
471
		$this->joinClause = array();
472
		$this->joinClause = array();
472
		$this->whereClause = array();
473
		$this->whereClause = array();
473
	
474
 
-
 
475
		if (isset($p['libre'])) {
-
 
476
			$this->whereClause[] = "cpu_fmt_nom_complet LIKE {$p['libre']}";
-
 
477
		}
474
		if (isset($p['titre'])) {
478
		if (isset($p['titre'])) {
475
			$this->whereClause[] = "cpu_titre LIKE {$p['titre']}";
479
			$this->whereClause[] = "cpu_titre LIKE {$p['titre']}";
476
		}
480
		}
477
		if (isset($p['auteur'])) {
481
		if (isset($p['auteur'])) {
478
			$this->whereClause[] = "cpu_fmt_auteur LIKE {$p['auteur']}";
482
			$this->whereClause[] = "cpu_fmt_auteur LIKE {$p['auteur']}";
479
		}
483
		}
480
		if (isset($p['mot-cle'])) {
484
		if (isset($p['mot-cle'])) {
481
			$this->whereClause[] = "cpu_resume_mot_cle LIKE {$p['mot-cle']}";
485
			$this->whereClause[] = "cpu_resume_mot_cle LIKE {$p['mot-cle']}";
482
		}
486
		}
483
		if (isset($p['revue'])) {
487
		if (isset($p['ouvrage'])) {
484
			$this->whereClause[] = "cpu_collection LIKE {$p['revue']}";
488
			$this->whereClause[] = "cpu_collection LIKE {$p['ouvrage']}";
485
		}
489
		}
486
		if (isset($p['date'])) {
490
		if (isset($p['date'])) {
487
			$this->whereClause[] = "cpu_date_parution LIKE {$p['date']}";
491
			$this->whereClause[] = "cpu_date_parution LIKE {$p['date']}";
488
		}
492
		}
489
	
493
	
490
	}
494
	}
491
}
495
}