Subversion Repositories eFlore/Applications.coel

Rev

Rev 1760 | Rev 1785 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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