Subversion Repositories eFlore/Applications.coel

Rev

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

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