Subversion Repositories eFlore/Applications.del

Rev

Rev 1398 | Rev 1417 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1398 Rev 1416
Line 152... Line 152...
152
	 * pour l'afficher.
152
	 * pour l'afficher.
153
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
153
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
154
	 * @param array $parametres les paramètres situés après le ? dans l'url
154
	 * @param array $parametres les paramètres situés après le ? dans l'url
155
	 **/	
155
	 **/	
156
	public function consulter($ressources, $parametres) {
156
	public function consulter($ressources, $parametres) {
-
 
157
		// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
157
		$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
158
		$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
-
 
159
 
158
		// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
160
		// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
159
		// toutes les images, mais nous voulons $limite observations uniques.
161
		// toutes les images, mais nous voulons $limite observations uniques.
160
		$req['groupby'][] = 'dob.id_observation';
162
		$req['groupby'][] = 'vdi.id_observation';
Line 161... Line 163...
161
 
163
 
Line 162... Line 164...
162
		$db = $this->bdd;
164
		$db = $this->bdd;
163
 
165
 
164
		// filtrage de l'INPUT
166
		// filtrage de l'INPUT
165
		$params = self::requestFilterParams($parametres, self::$parametres_autorises, $this->conteneur);
167
		$params = self::requestFilterParams($parametres, self::$parametres_autorises, $this->conteneur);
-
 
168
		// création des contraintes (masques)
Line 166... Line 169...
166
		// création des contraintes (masques)
169
		self::sqlAddConstraint($params, $db, $req, $this->conteneur);
167
		self::sqlAddConstraint($params, $db, $req, $this->conteneur);
170
		self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
168
 
171
 
169
		// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
172
		// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
Line 170... Line 173...
170
		$idobs_tab = self::getIdObs($params, $req, $db);
173
		$idobs_tab = self::getIdObs($params, $req, $db);
171
		// idobs est une liste (toujours ordonnée) des id d'observations recherchées
174
		// idobs est une liste (toujours ordonnée) des id d'observations recherchées
Line 172... Line 175...
172
		$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
175
		$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
-
 
176
 
-
 
177
		if($idobs) {
173
 
178
			$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
Line 174... Line 179...
174
		if($idobs) {
179
 
175
			$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
180
			// 2) récupération des données nécessaires pour ces observations (obs + images)
Line 220... Line 225...
220
	 * @param req: le tableau représentant les composants de la requete SQL
225
	 * @param req: le tableau représentant les composants de la requete SQL
221
	 * @param db: l'instance de db
226
	 * @param db: l'instance de db
222
	 */
227
	 */
223
	static function getIdObs($p, $req, $db) {
228
	static function getIdObs($p, $req, $db) {
224
		$req_s = sprintf('SELECT SQL_CALC_FOUND_ROWS id_observation' .
229
		$req_s = sprintf('SELECT SQL_CALC_FOUND_ROWS id_observation' .
225
						 ' FROM v_del_image dob'.
230
						 ' FROM v_del_image vdi'.
226
						 ' %s' . // LEFT JOIN if any
231
						 ' %s' . // LEFT JOIN if any
227
						 ' WHERE %s'. // where-clause ou TRUE
232
						 ' WHERE %s'. // where-clause ou TRUE
228
						 ' %s'. // group-by
233
						 ' %s'. // group-by
229
						 ' %s'. // having (si commentaires)
234
						 ' %s'. // having (si commentaires)
230
						 ' ORDER BY %s %s %s'.
235
						 ' ORDER BY %s %s %s'.
Line 236... Line 241...
236
						 $req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
241
						 $req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
237
						 $req['having'] ? ('HAVING ' . implode(' AND ', $req['having'])) : '',
242
						 $req['having'] ? ('HAVING ' . implode(' AND ', $req['having'])) : '',
Line 238... Line 243...
238
 
243
 
239
						 $p['tri'], strtoupper($p['ordre']),
244
						 $p['tri'], strtoupper($p['ordre']),
-
 
245
						 // date_transmission peut-être NULL et nous voulons de la consistence
240
						 // date_transmission peut-être NULL et nous voulons de la consistence
246
						 // (sauf après r1860 de Cel)
Line 241... Line 247...
241
						 $p['tri'] == 'date_transmission' ? ', id_observation' : '',
247
						 $p['tri'] == 'date_transmission' ? ', id_observation' : '',
Line 242... Line 248...
242
 
248
 
Line 254... Line 260...
254
	}
260
	}
Line 255... Line 261...
255
 
261
 
256
	/*
262
	/*
257
	  Champs récupérés:
263
	  Champs récupérés:
258
	  Pour del_images, la vue retourne déjà ce que nous recherchons de cel_obs et cel_images
264
	  Pour del_images, la vue retourne déjà ce que nous recherchons de cel_obs et cel_images
259
	  (cel_obs.* et cel_images.{id_observation, doi.id_image, date_prise_de_vue AS date, hauteur , largeur})
265
	  (cel_obs.* et cel_[obs_]images.{id_observation, id_image, date_prise_de_vue AS date, hauteur, largeur})
260
	  Pour del_commentaires: nous voulons *
266
	  Pour del_commentaires: nous voulons *
-
 
267
	  Reste ensuite à formatter.
-
 
268
	  Note: le préfixe de table utilisé ici (vdi) n'impacte *aucune* autre partie du code car rien
261
	  Reste ensuite à formatter
269
	  n'en dépend pour l'heure. (inutilisation de $req['select'])
262
	*/
270
	*/
263
	static function getInfos($idobs, $db) {
271
	static function getInfos($idobs, $db) {
264
		/*$select_fields = implode(',', array_merge(
272
		/*$select_fields = implode(',', array_merge(
265
			array_map(create_function('$a', 'return "dob.".$a;'), self::$sql_fields_liaisons['dob']),
273
			array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['dob']),
266
			array_map(create_function('$a', 'return "di.".$a;'), self::$sql_fields_liaisons['di']),
274
			array_map(create_function('$a', 'return "vdi.".$a;'), self::$sql_fields_liaisons['di']),
267
			array_map(create_function('$a', 'return "du.".$a;'), self::$sql_fields_liaisons['du'])));*/
275
			array_map(create_function('$a', 'return "du.".$a;'), self::$sql_fields_liaisons['du'])));*/
268
		$select_fields = array_merge(self::$sql_fields_liaisons['dob'],
276
		$select_fields = array_merge(self::$sql_fields_liaisons['dob'],
269
									 self::$sql_fields_liaisons['di']);
277
									 self::$sql_fields_liaisons['di']);
270
		$req_s = sprintf('SELECT %s FROM v_del_image di'.
278
		$req_s = sprintf('SELECT %s FROM v_del_image vdi'.
271
						 // ' LEFT JOIN del_commentaire AS dc ON di.id_observation = dc.ce_observation AND dc.nom_sel IS NOT NULL'.
279
						 // ' LEFT JOIN del_commentaire AS dc ON di.id_observation = dc.ce_observation AND dc.nom_sel IS NOT NULL'.
272
						 ' WHERE id_observation IN (%s)',
280
						 ' WHERE id_observation IN (%s)',
273
						 implode(',', $select_fields),
281
						 implode(',', $select_fields),
274
						 implode(',', $idobs));
282
						 implode(',', $idobs));
275
		return $db->recupererTous($req_s);
283
		return $db->recupererTous($req_s);
Line 276... Line 284...
276
	}
284
	}
277
 
285
 
278
 
286
 
-
 
287
	/**
279
	/**
288
	 * - Rempli le tableau des contraintes "where" et "join" nécessaire
280
	 * - Rempli le tableau des contraintes "where" et "join" nécessaire
289
	 * à la *recherche* des observations demandées ($req) utilisées par self::getIdObs()
281
	 * à la *recherche* des observations demandées ($req)
290
	 *
282
	 * Attention, cela signifie que toutes les tables ne sont pas *forcément*
291
	 * Attention, cela signifie que toutes les tables ne sont pas *forcément*
283
	 * join'ées, par exemple si aucune contrainte ne le nécessite.
292
	 * join'ées, par exemple si aucune contrainte ne le nécessite.
284
	 * $req tel qu'il est rempli ici est utile pour récupéré la seule liste des
293
	 * $req tel qu'il est rempli ici est utile pour récupéré la seule liste des
285
	 * id d'observation qui match.
294
	 * id d'observation qui match.
286
	 * Pour la récupération effective de "toutes" les données correspondante, il faut
295
	 * Pour la récupération effective de "toutes" les données correspondante, il faut
287
	 * réinitialiser $req["join"] afin d'y ajouter toutes les autres tables.
296
	 * réinitialiser $req["join"] afin d'y ajouter toutes les autres tables.
288
	 *
-
 
289
	 * Note: toujours rajouter les préfixes de table (dob,du,doi ou di)
297
	 *
290
	 * le préfix de del_observation est "dob"
298
	 * Note: toujours rajouter les préfixes de table (vdi,du,doi ou di), en fonction de ce que défini
291
	 * le préfix de del_utilisateur sur id_utilisateur = dob.ce_utilisateur est "du"
299
	 * les JOIN qui sont utilisés.
292
	 * le préfix de del_obs_image sur id_observation = dob.id_observation est "doi"
300
	 * le préfix de v_del_image est "vdi" (cf: "FROM" de self::getIdObs())
293
	 * le préfix de v_del_image sur id_image = doi.id_image est "di"
301
	 * le préfix de del_utilisateur sur id_utilisateur = vdi.ce_utilisateur est "du"
294
	 *
302
	 *
295
	 * @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
303
	 * @param $p les paramètres (notamment de masque) passés par l'URL et déjà traités/filtrés (sauf quotes)
296
	 * @param $req le tableau représentant les composants de la requête à bâtir
304
	 * @param $req le tableau, passé par référence représentant les composants de la requête à bâtir
297
	 * @param $c conteneur, utilisé soit pour l'appel récursif à requestFilterParams() en cas de param "masque"
305
	 * @param $c conteneur, utilisé soit pour l'appel récursif à requestFilterParams() en cas de param "masque"
298
	 *								soit pour la définition du type (qui utilise la variable nb_commentaires_discussion)
306
	 *								soit pour la définition du type (qui utilise la variable nb_commentaires_discussion)
299
	 */
307
	 */
300
	static function sqlAddConstraint($p, $db, &$req, Conteneur $c = NULL) {
308
	static function sqlAddConstraint($p, $db, &$req, Conteneur $c = NULL) {
301
		if(!empty($p['masque.auteur'])) {
309
		if(!empty($p['masque.auteur'])) {
302
			// id du poster de l'obs
310
			// id du poster de l'obs
303
			$req['join'][] = 'LEFT JOIN del_utilisateur AS du ON du.id_utilisateur = dob.ce_utilisateur';
311
			$req['join'][] = 'LEFT JOIN del_utilisateur AS du ON du.id_utilisateur = vdi.ce_utilisateur';
Line 304... Line 312...
304
			// id du poster de l'image... NON, c'est le même que le posteur de l'obs
312
			// id du poster de l'image... NON, c'est le même que le posteur de l'obs
305
			// Cette jointure de table est ignoré ci-dessous pour les recherches d'auteurs
313
			// Cette jointure de table est ignoré ci-dessous pour les recherches d'auteurs
306
			// $req['join'][] = 'LEFT JOIN del_utilisateur AS dui ON dui.id_utilisateur = dob.i_ce_utilisateur';
314
			// $req['join'][] = 'LEFT JOIN del_utilisateur AS dui ON dui.id_utilisateur = vdi.i_ce_utilisateur';
307
 
315
 
308
			if(is_numeric($p['masque.auteur'])) {
316
			if(is_numeric($p['masque.auteur'])) {
309
				$req['where'][] = sprintf('(du.id_utilisateur = %1$d OR dob.id_utilisateur = %1$d )', $p['masque.auteur']);
317
				$req['where'][] = sprintf('(du.id_utilisateur = %1$d OR vdi.id_utilisateur = %1$d )', $p['masque.auteur']);
310
			}
318
			}
311
			elseif(preg_match(';^.{5,}@[a-z0-9-.]{5,}$;i', $p['masque.auteur'])) {
319
			elseif(preg_match(';^.{5,}@[a-z0-9-.]{5,}$;i', $p['masque.auteur'])) {
312
				$req['where'][] = sprintf('(du.courriel LIKE %1$s OR dob.courriel LIKE %1$s )',
320
				$req['where'][] = sprintf('(du.courriel LIKE %1$s OR vdi.courriel LIKE %1$s )',
313
										  $db->proteger($p['masque.auteur'] . '%'));
321
										  $db->proteger($p['masque.auteur'] . '%'));
314
			}
322
			}
Line 315... Line 323...
315
			else {
323
			else {
316
				self::addAuteursConstraint($p['masque.auteur'], $db, $req['where']);
324
				self::addAuteursConstraint($p['masque.auteur'], $db, $req['where']);
317
			}
325
			}
318
		}
326
		}
319
 
327
 
320
		if(!empty($p['masque.date'])) {
328
		if(!empty($p['masque.date'])) {
321
			if(is_integer($p['masque.date']) && $p['masque.date'] < 2030 && $p['masque.date'] > 1600) {
329
			if(is_integer($p['masque.date']) && $p['masque.date'] < 2030 && $p['masque.date'] > 1600) {
322
				$req['where'][] = sprintf("YEAR(dob.date_observation) = %d", $p['masque.date']);
330
				$req['where'][] = sprintf("YEAR(vdi.date_observation) = %d", $p['masque.date']);
323
			}
331
			}
Line 324... Line 332...
324
			else {
332
			else {
325
				$req['where'][] = sprintf("DATE_FORMAT(dob.date_observation, '%%Y-%%m-%%d') = %s",
333
				$req['where'][] = sprintf("DATE_FORMAT(vdi.date_observation, '%%Y-%%m-%%d') = %s",
326
										  $db->proteger(strftime('%Y-%m-%d', $p['masque.date'])));
334
										  $db->proteger(strftime('%Y-%m-%d', $p['masque.date'])));
327
			}
335
			}
328
		}
336
		}
329
 
337
 
330
		// TODO: avoir des champs d'entrée distinct
338
		// TODO: avoir des champs d'entrée distinct
331
		if(!empty($p['masque.departement'])) {
339
		if(!empty($p['masque.departement'])) {
332
			$req['where'][] = sprintf("dob.ce_zone_geo = %s", $db->proteger('INSEE-C:'.$p['masque.departement']));
340
			$req['where'][] = sprintf("vdi.ce_zone_geo = %s", $db->proteger('INSEE-C:'.$p['masque.departement']));
333
		}
341
		}
334
		if(!empty($p['masque.id_zone_geo'])) {
342
		if(!empty($p['masque.id_zone_geo'])) {
335
			$req['where'][] = sprintf("dob.ce_zone_geo = %s", $db->proteger($p['masque.id_zone_geo']));
343
			$req['where'][] = sprintf("vdi.ce_zone_geo = %s", $db->proteger($p['masque.id_zone_geo']));
336
		}
344
		}
337
		if(!empty($p['masque.genre'])) {
345
		if(!empty($p['masque.genre'])) {
338
			$req['where'][] = 'dob.nom_sel LIKE '.$db->proteger('%' . $p['masque.genre'].'% %');
346
			$req['where'][] = 'vdi.nom_sel LIKE '.$db->proteger('%' . $p['masque.genre'].'% %');
339
		}
347
		}
340
		if(!empty($p['masque.famille'])) {
348
		if(!empty($p['masque.famille'])) {
341
			$req['where'][] = 'dob.famille = '.$db->proteger($p['masque.famille']);
349
			$req['where'][] = 'vdi.famille = '.$db->proteger($p['masque.famille']);
342
		}
350
		}
343
		if(!empty($p['masque.ns'])) {
351
		if(!empty($p['masque.ns'])) {
344
			$req['where'][] = 'dob.nom_sel LIKE '.$db->proteger($p['masque.ns'].'%');
352
			$req['where'][] = 'vdi.nom_sel LIKE '.$db->proteger($p['masque.ns'].'%');
345
		}
353
		}
346
		if(!empty($p['masque.nn'])) {
354
		if(!empty($p['masque.nn'])) {
347
			$req['where'][] = sprintf('dob.nom_sel_nn = %1$d OR dob.nom_ret_nn = %1$d', $p['masque.nn']);
355
			$req['where'][] = sprintf('vdi.nom_sel_nn = %1$d OR vdi.nom_ret_nn = %1$d', $p['masque.nn']);
348
		}
356
		}
349
		if(!empty($p['masque.referentiel'])) {
357
		if(!empty($p['masque.referentiel'])) {
350
			$req['where'][] = sprintf('dob.nom_referentiel LIKE %s', $db->proteger($p['masque.referentiel'].'%'));
358
			$req['where'][] = sprintf('vdi.nom_referentiel LIKE %s', $db->proteger($p['masque.referentiel'].'%'));
351
		}
359
		}
352
		if(!empty($p['masque.commune'])) {
360
		if(!empty($p['masque.commune'])) {
353
			$req['where'][] = 'dob.zone_geo LIKE '.$db->proteger($p['masque.commune'].'%');
361
			$req['where'][] = 'vdi.zone_geo LIKE '.$db->proteger($p['masque.commune'].'%');
354
		}
362
		}
Line 355... Line 363...
355
		if(!empty($p['masque.tag'])) {
363
		if(!empty($p['masque.tag'])) {
356
			// i_mots_cles_texte provient de la VIEW v_del_image
364
			// i_mots_cles_texte provient de la VIEW v_del_image
357
			$req['where'][] = sprintf('CONCAT(%s) REGEXP %s',
365
			$req['where'][] = sprintf('CONCAT(%s) REGEXP %s',
-
 
366
									  self::sqlAddIfNullPourConcat(array('vdi.mots_cles_texte', 'vdi.i_mots_cles_texte')),
Line 358... Line 367...
358
									  self::sqlAddIfNullPourConcat(array('dob.mots_cles_texte', 'dob.i_mots_cles_texte')),
367
									  $db->proteger($p['masque.tag']));
359
									  $db->proteger($p['masque.tag']));
368
		}
360
		}
369
 
361
 
370
		if(!empty($p['masque.type'])) {
-
 
371
			self::addTypeConstraints($p['masque.type'], $db, $req, $c);
362
		if(!empty($p['masque.type'])) {
372
		}
363
			self::addTypeConstraints($p['masque.type'], $db, $req, $c);
373
	}
364
		}
374
 
365
 
375
	/* Le masque fait une recherche générique parmi de nombreux champs ci-dessus.
366
		/* Le masque fait une recherche générique parmi de nombreux champs ci-dessus.
376
	   Nous initialisons donc ces paramètres (excepté masque biensur), et nous rappelons
367
		   Nous initialisons donc ces paramètres (excepté masque biensur), et nous rappelons
377
	   récursivement. À la seule différence que nous n'utiliserons que $or_req['where']
368
		   récursivement. À la seule différence que nous n'utiliserons que $or_req['where']
378
	   imploded par des " OR ". */
369
		   imploded par des " OR ". */
379
	static function sqlAddMasqueConstraint($p, $db, &$req, Conteneur $c = NULL) {
370
		if(!empty($p['masque'])) {
380
		if(!empty($p['masque'])) {
371
			$or_params = array('masque.auteur' => $p['masque'],
381
			$or_params = array('masque.auteur' => $p['masque'],
372
							   'masque.departement' => $p['masque'],
382
							   'masque.departement' => $p['masque'],
373
							   'masque.id_zone_geo' => $p['masque'],
383
							   'masque.id_zone_geo' => $p['masque'],
374
							   'masque.tag' => $p['masque'],
384
							   'masque.tag' => $p['masque'],
375
							   'masque.ns' => $p['masque'],
385
							   'masque.ns' => $p['masque'],
Line 408... Line 418...
408
		return implode(',',array_map(create_function('$a', 'return "IFNULL($a, \"\")";'), $tab));
418
		return implode(',',array_map(create_function('$a', 'return "IFNULL($a, \"\")";'), $tab));
409
	}
419
	}
Line 410... Line 420...
410
 
420
 
411
	/*
421
	/*
412
	  Retourne une clausse where du style:
422
	  Retourne une clausse where du style:
413
	  CONCAT(IF(du.prenom IS NULL, "", du.prenom), [...] dob.i_nomutilisateur) REGEXP 'xxx'
423
	  CONCAT(IF(du.prenom IS NULL, "", du.prenom), [...] vdi.i_nomutilisateur) REGEXP 'xxx'
414
	  Note; i_(nom|prenom_utilisateur), alias pour cel_images.(nom|prenom), n'est pas traité
424
	  Note; i_(nom|prenom_utilisateur), alias pour cel_images.(nom|prenom), n'est pas traité
415
	  car cette information est redondante dans cel_image et devrait être supprimée.
425
	  car cette information est redondante dans cel_image et devrait être supprimée.
416
	*/
426
	*/
417
	static function addAuteursConstraint($val, $db, &$where) {
427
	static function addAuteursConstraint($val, $db, &$where) {
418
		@list($a, $b) = explode(' ', $val, 2);
428
		@list($a, $b) = explode(' ', $val, 2);
419
		// un seul terme
429
		// un seul terme
420
		$champs_n = array('du.prenom', // info user authentifié de l'obs depuis l'annuaire
430
		$champs_n = array('du.prenom', // info user authentifié de l'obs depuis l'annuaire
421
						  'dob.prenom_utilisateur', // info user anonyme de l'obs
431
						  'vdi.prenom_utilisateur', // info user anonyme de l'obs
422
						  /* 'dob.i_prenom_utilisateur' */ ); // info user anonyme de l'image
432
						  /* 'vdi.i_prenom_utilisateur' */ ); // info user anonyme de l'image
423
		$champs_p = array('du.nom', // idem pour le nom
433
		$champs_p = array('du.nom', // idem pour le nom
424
						  'dob.nom_utilisateur',
434
						  'vdi.nom_utilisateur',
425
						  /* 'dob.i_nom_utilisateur' */ );
435
						  /* 'vdi.i_nom_utilisateur' */ );
426
		if(! $b) {
436
		if(! $b) {
427
			$where[] = sprintf('CONCAT(%s) REGEXP %s',
437
			$where[] = sprintf('CONCAT(%s) REGEXP %s',
428
							   self::sqlAddIfNullPourConcat($champs_n).
438
							   self::sqlAddIfNullPourConcat($champs_n).
429
							   ',' .
439
							   ',' .
Line 444... Line 454...
444
	 */
454
	 */
445
	static function addTypeConstraints($val, $db, &$req, Conteneur $c) {
455
	static function addTypeConstraints($val, $db, &$req, Conteneur $c) {
446
		if(array_key_exists('adeterminer', $val)) {
456
		if(array_key_exists('adeterminer', $val)) {
447
			//On récupère toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
457
			//On récupère toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
448
			$req['where'][] = '(' . implode(' OR ', array(
458
			$req['where'][] = '(' . implode(' OR ', array(
449
				'dob.certitude = "aDeterminer"',
459
				'vdi.certitude = "aDeterminer"',
450
				'dob.mots_cles_texte LIKE "%aDeterminer%"',
460
				'vdi.mots_cles_texte LIKE "%aDeterminer%"',
451
				'dob.nom_sel_nn IS NULL', // TODO: ensure pas d'entrée à 0
461
				'vdi.nom_sel_nn IS NULL', // TODO: ensure pas d'entrée à 0
452
			)) . ')';
462
			)) . ')';
453
		}
463
		}
454
		if(array_key_exists('aconfirmer', $val)) {
464
		if(array_key_exists('aconfirmer', $val)) {
455
			//On récupère toutes les observations qui ne sont pas "aDeterminer" *et* qui ont un nom d'espèce
465
			//On récupère toutes les observations qui ne sont pas "aDeterminer" *et* qui ont un nom d'espèce
456
			$req['where'][] = '(' . implode(' AND ', array(
466
			$req['where'][] = '(' . implode(' AND ', array(
457
				'dob.nom_sel IS NOT NULL',
467
				'vdi.nom_sel IS NOT NULL',
458
				'dob.certitude != "aDeterminer"',
468
				'vdi.certitude != "aDeterminer"',
459
				'(dob.mots_cles_texte IS NULL OR dob.mots_cles_texte NOT LIKE "%aDeterminer%"',
469
				'(vdi.mots_cles_texte IS NULL OR vdi.mots_cles_texte NOT LIKE "%aDeterminer%"',
460
			)) . ')';
470
			)) . ')';
461
		}
471
		}
Line 462... Line 472...
462
 
472
 
463
		// solution n°1: impraticable
473
		// solution n°1: impraticable
464
		if(false && array_key_exists('endiscussion', $val)) {
474
		if(false && array_key_exists('endiscussion', $val)) {
465
			//Si on veut les observations en discussion,
475
			//Si on veut les observations en discussion,
466
			// on va récupérer les ids des observations dont le nombre de commentaire est supérieur à N
476
			// on va récupérer les ids des observations dont le nombre de commentaire est supérieur à N
467
			$req['select'][] = 'COUNT(dc.id_commentaire) AS comm_count';
477
			$req['select'][] = 'COUNT(dc.id_commentaire) AS comm_count';
468
			$req['join'][] = 'INNER JOIN del_commentaire AS dc ON dob.id_observation = dc.ce_observation';
478
			$req['join'][] = 'INNER JOIN del_commentaire AS dc ON vdi.id_observation = dc.ce_observation';
469
			$req['groupby'][] = 'dob.id_observation';
479
			$req['groupby'][] = 'vdi.id_observation';
470
			$req['having'][] = "COUNT(id_commentaire) > " . $c->getParametre('nb_commentaires_discussion');
480
			$req['having'][] = "COUNT(id_commentaire) > " . $c->getParametre('nb_commentaires_discussion');
Line 471... Line 481...
471
		}
481
		}
472
 
482