Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1840 Rev 1914
Line 1... Line 1...
1
<?php
1
<?php
2
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
-
 
3
 
-
 
4
/**
-
 
5
* PHP Version 5
-
 
6
*
-
 
7
* @category  PHP
-
 
8
* @package   jrest
-
 
9
* @author    Aurelien Peronnet <aurelien@tela-botanica.org>
-
 
10
* @copyright 2010 Tela-Botanica
-
 
11
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
-
 
12
* @version   SVN: <svn_id>
-
 
13
* @link      /doc/jrest/
-
 
14
*/
-
 
15
 
-
 
16
/**
2
/**
-
 
3
 * PHP Version 5.2
-
 
4
 *
-
 
5
 * @category  PHP
-
 
6
 * @package   jrest
-
 
7
 * @author    Raphaël Droz <raphael@tela-botanica.org>
-
 
8
 * @author    Aurelien Peronnet <aurelien@tela-botanica.org>
-
 
9
 * @copyright 2010, 2013 Tela-Botanica
-
 
10
 * @license	 http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
-
 
11
 * @license	 GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
12
 * @link      /doc/jrest/
-
 
13
 *
17
* Classe de gestion de l'ajout, modification et suppression des observations
14
 * Classe de gestion de l'ajout, modification et suppression des observations
18
* 
15
 *
19
* in=utf8
16
 * TODO: $sous_requete .= ' date_modification = now() '
20
* out=utf8
17
 * devrait être une clause ON UPDATE ou un TRIGGER
-
 
18
 * afin de mettre à jour la date de modification uniquement lorsqu'une modification a effectivement eu lieu
21
*
19
 *
22
*/ 
20
 */ 
23
class GestionObservation extends Cel {
21
class GestionObservation extends Cel {
24
	
22
 
-
 
23
    static $cel_obs = array(
-
 
24
        "id_observation", "ordre", "ce_utilisateur", "prenom_utilisateur", "nom_utilisateur", "courriel_utilisateur", "nom_sel", "nom_sel_nn", "nom_ret", "nom_ret_nn", "nt", "famille", "nom_referentiel",
-
 
25
        "ce_zone_geo", "zone_geo", "lieudit", "station", "milieu", "latitude", "longitude", "altitude", "geodatum", "date_observation", "mots_cles_texte", "commentaire", "transmission",
-
 
26
        "date_creation", "date_modification", "date_transmission", "abondance", "certitude", "phenologie", "code_insee_calcul");
-
 
27
 
25
	/**
28
	/**
26
	* Ajoute une observation grâce aux paramètres fournis 
29
	* Ajoute une observation grâce aux paramètres fournis 
27
	* 
30
	* 
28
	* @param int $utilisateur id utilisateur du proprietaire de l'observation
31
	* @param int $utilisateur id utilisateur du proprietaire de l'observation
29
	* @param array $parametres tableau indexé avec les mêmes noms de champs que la bdd
32
	* @param array $parametres tableau indexé avec les mêmes noms de champs que la bdd
30
	* 
33
	* 
31
	* @return true ou false suivant le succès de l'opération
34
	* @return true ou false suivant le succès de l'opération
32
	*/
35
	*/
33
	public function ajouterObservation($utilisateur, $parametres) {
36
	public function ajouterObservation($utilisateur, $parametres) {
-
 
37
		$origin_params = $parametres;
-
 
38
		$base_param = array('nom_sel_nn' => NULL,
-
 
39
							'nom_sel' => NULL,
-
 
40
							'nom_ret_nn' => NULL,
-
 
41
							'nom_referentiel' => NULL);
-
 
42
		$parametres = array_merge($base_param, $parametres);
34
				 	
43
 
35
		$retour = true;
44
		$retour = true;
36
		$parametres['ordre'] = $this->renvoyerDernierOrdreUtilisePlusUn($utilisateur);
45
		$parametres['ordre'] = $this->renvoyerDernierOrdreUtilisePlusUn($utilisateur);
Line 37... Line 46...
37
		
46
		
-
 
47
		$this->traiterEspece($parametres);
-
 
48
 
-
 
49
		// si la détermination à échoué, alors:
-
 
50
		// soit le référentiel d'origine était "valide", soit non
-
 
51
		if(!$parametres['nom_sel_nn']) {
-
 
52
			// quoiqu'il en soit, on le met à "autre"
-
 
53
			$parametres['nom_referentiel'] = Cel::$fallback_referentiel;
-
 
54
		}
-
 
55
 
38
		$this->traiterEspece($parametres);
56
		$this->ajoutInfoUtilisateurARequete($parametres);
Line 39... Line 57...
39
		$this->formaterParametresObservation($parametres);
57
        self::formaterParametresObservation($parametres);
40
 
58
 
Line 41... Line 59...
41
        $requete_insertion_observation = 'INSERT INTO cel_obs ';
59
        $requete_insertion_observation = 'INSERT INTO cel_obs ';
Line 108... Line 126...
108
	public function modifierObservation($utilisateur, $ordre, $parametres) {
126
	public function modifierObservation($utilisateur, $ordre, $parametres) {
109
		$base_param = array('nom_sel_nn' => NULL,
127
		$base_param = array('nom_sel_nn' => NULL,
110
							'nom_sel' => NULL,
128
							'nom_sel' => NULL,
111
							'nom_ret_nn' => NULL,
129
							'nom_ret_nn' => NULL,
112
							'nom_referentiel' => NULL);
130
							'nom_referentiel' => NULL);
113
		$parametres = array_merge($base_param, $parametres);
131
		// $parametres = array_merge($base_param, $parametres);
114
		
-
 
115
		$retour = true;
132
		$retour = true;
116
		$requete_modification = "UPDATE cel_obs SET " ;
133
		$requete_modification = "UPDATE cel_obs SET " ;
Line 117... Line 134...
117
 
134
 
118
		// si pas de nom_sel : on supprime les champs automatiques. et le référentiel.
135
		// si pas de nom_sel : on supprime les champs automatiques. et le référentiel.
119
		if(!isset($parametres['nom_sel']) || !@$parametres['nom_sel']) {
136
		if(false && (!isset($parametres['nom_sel']) || !@$parametres['nom_sel'])) {
120
			$parametres['nom_referentiel'] = NULL; // pas d'update de traiterParametresObservationEtConstruireSousRequeteMaj()
137
			$parametres['nom_referentiel'] = NULL; // pas d'update de traiterParametresObservationEtConstruireSousRequeteMaj()
121
			$requete_modification .= "nom_referentiel = NULL, nom_sel_nn = NULL, nom_ret_nn = NULL, nom_ret = NULL, nt = NULL, famille = NULL,";
138
			$requete_modification .= "nom_referentiel = NULL, nom_sel_nn = NULL, nom_ret_nn = NULL, nom_ret = NULL, nt = NULL, famille = NULL,";
122
		}
139
		}
123
		elseif(false) {
140
		elseif(false) {
Line 133... Line 150...
133
nom_ret = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, nom_ret),
150
nom_ret = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, nom_ret),
134
nt = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, nt),
151
nt = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, nt),
135
famille = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, famille),
152
famille = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, famille),
136
EOF;
153
EOF;
137
		}
154
		}
138
		else {
155
		elseif(isset($parametres['nom_sel'])) {
139
			// uniquement en cas de nom_sel présent
156
			// uniquement en cas de nom_sel présent
140
			$this->traiterEspece($parametres);
157
			$this->traiterEspece($parametres);
141
		}
158
		}
142
		$this->formaterParametresObservation($parametres);
-
 
Line -... Line 159...
-
 
159
 
-
 
160
        self::formaterParametresObservation($parametres);
143
 
161
 
-
 
162
        $champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
-
 
163
        $champ_maj[] = "date_modification = now()";
-
 
164
 
-
 
165
		$requete_modification .= 
144
		$requete_modification .= $this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
166
            implode(', ', $champ_maj)
Line 145... Line 167...
145
			" WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
167
			. " WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
146
 
168
 
147
 
169
 
148
		// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
170
		// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
Line 149... Line 171...
149
		// ce qui peut arriver dans les commentaires
171
		// ce qui peut arriver dans les commentaires
150
		// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
172
		// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
151
    	$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification);
173
    	$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__);
152
    	
174
    	
Line 153... Line 175...
153
        if ($resultat_modification === false) {
175
        if ($resultat_modification === false) {
154
        	$retour = false;
176
        	$retour = false;
-
 
177
        	$this->logger("CEL_bugs","Erreur de mise à jour d'une liste d'observations : ".$requete_modification);
-
 
178
        }
-
 
179
		
-
 
180
		return $retour;
-
 
181
	}
-
 
182
 
-
 
183
    /**
-
 
184
     * @return nombre d'observations mises à jour, ou FALSE en cas de problème
-
 
185
     */
-
 
186
	static function modifierMultiplesObservation($utilisateur, Array $ordre, $parametres) {
-
 
187
        // nous pouvons aussi retirer 'ce_utilisateur' (== $utilisateur) qui sera dans la clause WHERE
-
 
188
		$exclusions = array('nom_sel_nn', 'nom_sel', 'nom_ret_nn', 'nom_referentiel', 'ce_utilisateur');
-
 
189
        $parametres = array_diff_key($parametres, array_flip($exclusions));
-
 
190
        $parametres = array_intersect_key($parametres, array_flip(self::$cel_obs));
-
 
191
 
-
 
192
        $parametres = array_filter(
-
 
193
            $parametres,
-
 
194
            create_function('$e','return strpos($e, "(Valeurs multiples)") === false;'));
-
 
195
 
-
 
196
        // modifie $parametres par référence
-
 
197
        self::formaterParametresObservation($parametres);
-
 
198
 
-
 
199
        $champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
-
 
200
        if(!$champ_maj) return 0; // rien à mettre à jour finalement
-
 
201
 
-
 
202
        $champ_maj[] = "date_modification = now()";
-
 
203
		$nb_upd = Cel::db()->executer(sprintf(
-
 
204
            "UPDATE cel_obs SET %s WHERE ordre IN (%s) AND ce_utilisateur = %s -- %s:%d",
-
 
205
            implode(', ', $champ_maj),
-
 
206
            implode(', ', $ordre),
-
 
207
            Cel::db()->proteger($utilisateur),
-
 
208
            __FILE__, __LINE__));
-
 
209
 
Line 155... Line 210...
155
        	$this->logger("CEL_bugs","Erreur de mise à jour d'une liste d'observations : ".$requete_modification);
210
        if($nb_upd === FALSE) return FALSE;
156
        }
211
        return $nb_upd;
157
		
212
        // TODO: return json_encode(updated_rows());
158
		return $retour;
213
   }
Line 173... Line 228...
173
							'nom_ret_nn' => NULL,
228
							'nom_ret_nn' => NULL,
174
							'nom_referentiel' => NULL);
229
							'nom_referentiel' => NULL);
175
		$parametres = array_merge($base_param, $parametres);
230
		$parametres = array_merge($base_param, $parametres);
Line 176... Line 231...
176
 
231
 
177
		$this->traiterEspece($parametres);
232
		$this->traiterEspece($parametres);
Line 178... Line 233...
178
		$this->formaterParametresObservation($parametres);
233
        self::formaterParametresObservation($parametres);
-
 
234
 
-
 
235
		$retour = true;
-
 
236
 
-
 
237
        $champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
179
 
238
        $champ_maj[] = "date_modification = now()";
180
		$retour = true;
239
 
181
		$requete_modification = "UPDATE cel_obs SET " .
240
		$requete_modification = "UPDATE cel_obs SET " .
182
			$this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
241
            implode(', ', $champ_maj) .
183
			" WHERE id_observation = ".Cel::db()->proteger($id).
242
			" WHERE id_observation = ".Cel::db()->proteger($id).
Line 184... Line 243...
184
			" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
243
			" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
185
			" AND transmission = 1";
244
			" AND transmission = 1";
186
 
245
 
187
		// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
246
		// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
188
		// ce qui peut arriver dans les commentaires
247
		// ce qui peut arriver dans les commentaires
189
		// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
248
		// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
190
		$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification);
-
 
191
		 
249
		$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__);
192
		if ($resultat_modification === false) {
250
 
Line 193... Line 251...
193
			$retour = false;
251
		if ($resultat_modification === false) {
194
			$this->logger("CEL_bugs","Erreur de mise à jour de l\'observation : ".$id);
252
			$this->logger("CEL_bugs","Erreur de mise à jour de l\'observation : ".$id);
Line 195... Line 253...
195
		}
253
		}
196
	
254
	
197
		return $retour;
255
		return $resultat_modification;
Line 372... Line 430...
372
				}
430
				}
373
			}
431
			}
Line 374... Line 432...
374
 
432
 
375
			// XXX: ne devrait plus être nécessaire maintenant que rechercherInformationsComplementairesSurNom() [plus précisément effectuerRequeteUrlRecherche()]
433
			// XXX: ne devrait plus être nécessaire maintenant que rechercherInformationsComplementairesSurNom() [plus précisément effectuerRequeteUrlRecherche()]
376
			// a été modifiée pour retourner tous les champs nécessaire.
434
			// a été modifiée pour retourner tous les champs nécessaire.
377
			if ($deuxieme_passe && (!$parametres['nom_ret_nn'] || !$parametres['nt'])) {
435
			if ($deuxieme_passe && (! array_key_exists('nom_ret_nn', $parametres) || ! array_key_exists('nt', $parametres))) {
378
				// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
436
				// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
379
				$chercheur_infos_complementaires = new RechercheInfosTaxonBeta($this->config , $code_referentiel);
437
				$chercheur_infos_complementaires = new RechercheInfosTaxonBeta($this->config , $code_referentiel);
380
				$complement = $chercheur_infos_complementaires->effectuerRequeteInfosComplementairesSurNumNom($parametres['nom_sel_nn']);
438
				$complement = $chercheur_infos_complementaires->effectuerRequeteInfosComplementairesSurNumNom($parametres['nom_sel_nn']);
381
				// les paramètres passés datait peut-être d'une précédente autocomplétion, mais le référentiel ayant été changé par l'utilisateur
439
				// les paramètres passés datait peut-être d'une précédente autocomplétion, mais le référentiel ayant été changé par l'utilisateur
Line 398... Line 456...
398
 
456
 
399
		// mise à jour du référentiel utilisé, sans n° de version
457
		// mise à jour du référentiel utilisé, sans n° de version
400
		$parametres['nom_referentiel'] = $code_referentiel;
458
		$parametres['nom_referentiel'] = $code_referentiel;
Line -... Line 459...
-
 
459
	}
-
 
460
 
-
 
461
    // uniquement nécessaire lors de l'ajout
-
 
462
	private function ajoutInfoUtilisateurARequete(&$parametres) {		
-
 
463
		if(! isset($parametres['ce_utilisateur'])) return;
-
 
464
		
-
 
465
        $infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']);
-
 
466
        $parametres['courriel_utilisateur'] = $infos_utilisateur['courriel'];
-
 
467
        $parametres['nom_utilisateur'] = $infos_utilisateur['nom'];
-
 
468
        $parametres['prenom_utilisateur'] = $infos_utilisateur['prenom'];
401
	}
469
    }
402
 
470
 
403
	/**
471
	/**
404
	* Formate les paramètres fournis en ajoutant des infos complementaires 
472
	* Formate les paramètres fournis en ajoutant des infos complementaires 
405
	* 
473
	* 
406
	* @param array $parametres tableau indexé avec les mêmes noms de champs que la bdd
474
	* @param array $parametres tableau indexé avec les mêmes noms de champs que la bdd
407
	* 
475
	* 
408
	* @return $parametres le tableau modifié selon ce qu'il contenait
476
	* @return $parametres le tableau modifié selon ce qu'il contenait
409
	*/
-
 
410
	private function formaterParametresObservation(&$parametres) {		
-
 
411
		if(isset($parametres['ce_utilisateur'])) {
-
 
412
		
-
 
413
			$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']);
-
 
414
			
-
 
415
			$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel'];
-
 
416
			$parametres['nom_utilisateur'] = $infos_utilisateur['nom'];
-
 
417
			$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom'];
-
 
418
		}
477
	*/
419
		
478
	static function formaterParametresObservation(&$parametres) {		
420
		// Pour empecher que des numéros de département de 1 à 9 soient saisis sans 0
479
		// Pour empecher que des numéros de département de 1 à 9 soient saisis sans 0
Line 421... Line 480...
421
		// TODO: décider quoi faire pour les zones géo plus générales
480
		// TODO: décider quoi faire pour les zones géo plus générales
Line 427... Line 486...
427
	        	if (strlen($parametres['ce_zone_geo']) == 4) {
486
	        	if (strlen($parametres['ce_zone_geo']) == 4) {
428
	            	$parametres['ce_zone_geo'] = '0'.$parametres['ce_zone_geo'];
487
	            	$parametres['ce_zone_geo'] = '0'.$parametres['ce_zone_geo'];
429
	        	}
488
	        	}
Line 430... Line 489...
430
	        	
489
	        	
431
	        	if (strlen($parametres['ce_zone_geo']) > 0 && strlen($parametres['ce_zone_geo']) <= 2) {
490
	        	if (strlen($parametres['ce_zone_geo']) > 0 && strlen($parametres['ce_zone_geo']) <= 2) {
432
	            	$parametres['ce_zone_geo'] = $this->obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']);
491
	            	$parametres['ce_zone_geo'] = Cel::obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']);
433
	        	} else {     	        	 
492
	        	} else {     	        	 
434
	        	 	$parametres['ce_zone_geo'] = $this->convertirCodeInseeVersCodeZoneGeo($parametres['ce_zone_geo']);
493
	        	 	$parametres['ce_zone_geo'] = 'INSEE-C:'. $parametres['ce_zone_geo'];
435
	        	}
494
	        	}
436
        	}
495
        	}
Line 437... Line 496...
437
        }
496
        }
Line 491... Line 550...
491
	 * @param array $parametres un tableau avec les index correspondant aux champs de la bdd 
550
	 * @param array $parametres un tableau avec les index correspondant aux champs de la bdd 
492
	 * 
551
	 * 
493
	 * @return string une sous requete utilisable pour la modification d'une observation
552
	 * @return string une sous requete utilisable pour la modification d'une observation
494
	 * selon la syntaxe UPDATE table SET colonne1 = valeur1, colonne2 = valeur2 WHERE condition 
553
	 * selon la syntaxe UPDATE table SET colonne1 = valeur1, colonne2 = valeur2 WHERE condition 
495
	 */	
554
	 */	
496
	private function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
555
	static function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
497
		$sous_requete = '';
556
		$champs = array();
498
		
557
 
499
		// Nullifiage ...
558
		// Nullifiage ...
500
		// TODO: code dupliqué, en faire une fonction à mettre à la place appropriée
559
		// TODO: code dupliqué, en faire une fonction à mettre à la place appropriée
501
		foreach($parametres as $cle => $valeur) {
560
		foreach($parametres as $cle => $valeur) {
502
			
-
 
503
			// Pour apparaitre le premier dans les tris ...
561
			// Pour apparaitre le premier dans les tris ...
504
			if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") {
562
			if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") {
505
				$valeur = "NULL";
563
				$valeur = "NULL";
506
			} else {
564
			} else {
507
				$valeur = Cel::db()->proteger($valeur);
565
				$valeur = Cel::db()->proteger($valeur);
508
			}
566
			}
509
			
-
 
510
        	$sous_requete .= $cle." = ".$valeur.", ";
567
        	$champs[] = $cle." = ".$valeur;
511
		}
568
		}
512
		
-
 
513
		$sous_requete .= ' date_modification = now() ';
-
 
514
		
-
 
515
		return $sous_requete;
569
        return $champs;
516
	}
570
	}
517
} 
-
 
518
?>
-
 
519
571
}
-
 
572