Subversion Repositories eFlore/Applications.cel

Rev

Rev 1905 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1905 Rev 1908
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
Line 48... Line 51...
48
		if(!$parametres['nom_sel_nn']) {
51
		if(!$parametres['nom_sel_nn']) {
49
			// quoiqu'il en soit, on le met à "autre"
52
			// quoiqu'il en soit, on le met à "autre"
50
			$parametres['nom_referentiel'] = Cel::$fallback_referentiel;
53
			$parametres['nom_referentiel'] = Cel::$fallback_referentiel;
51
		}
54
		}
Line -... Line 55...
-
 
55
 
52
 
56
		$this->ajoutInfoUtilisateurARequete($parametres);
Line 53... Line 57...
53
		$this->formaterParametresObservation($parametres);
57
        self::formaterParametresObservation($parametres);
54
 
58
 
Line 55... Line 59...
55
        $requete_insertion_observation = 'INSERT INTO cel_obs ';
59
        $requete_insertion_observation = 'INSERT INTO cel_obs ';
Line 150... Line 154...
150
		}
154
		}
151
		elseif(isset($parametres['nom_sel'])) {
155
		elseif(isset($parametres['nom_sel'])) {
152
			// uniquement en cas de nom_sel présent
156
			// uniquement en cas de nom_sel présent
153
			$this->traiterEspece($parametres);
157
			$this->traiterEspece($parametres);
154
		}
158
		}
155
		$this->formaterParametresObservation($parametres);
-
 
Line -... Line 159...
-
 
159
 
-
 
160
        self::formaterParametresObservation($parametres);
156
 
161
 
-
 
162
        $champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
-
 
163
        $champ_maj[] = "date_modification = now()";
-
 
164
 
-
 
165
		$requete_modification .= 
157
		$requete_modification .= $this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
166
            implode(', ', $champ_maj)
Line 158... Line 167...
158
			" WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
167
			. " WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
159
 
168
 
160
 
169
 
Line 168... Line 177...
168
        	$this->logger("CEL_bugs","Erreur de mise à jour d'une liste d'observations : ".$requete_modification);
177
        	$this->logger("CEL_bugs","Erreur de mise à jour d'une liste d'observations : ".$requete_modification);
169
        }
178
        }
Line 170... Line 179...
170
		
179
		
171
		return $retour;
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
 
-
 
210
        if($nb_upd === FALSE) return FALSE;
-
 
211
        return $nb_upd;
-
 
212
        // TODO: return json_encode(updated_rows());
-
 
213
   }
Line 172... Line 214...
172
	}
214
 
173
	
215
	
174
	/**
216
	/**
175
	* Modifie une observation publique dont l'id et l'utilisateur sont passé en paramètre
217
	* Modifie une observation publique dont l'id et l'utilisateur sont passé en paramètre
Line 186... Line 228...
186
							'nom_ret_nn' => NULL,
228
							'nom_ret_nn' => NULL,
187
							'nom_referentiel' => NULL);
229
							'nom_referentiel' => NULL);
188
		$parametres = array_merge($base_param, $parametres);
230
		$parametres = array_merge($base_param, $parametres);
Line 189... Line 231...
189
 
231
 
190
		$this->traiterEspece($parametres);
232
		$this->traiterEspece($parametres);
Line 191... Line 233...
191
		$this->formaterParametresObservation($parametres);
233
        self::formaterParametresObservation($parametres);
-
 
234
 
-
 
235
		$retour = true;
-
 
236
 
-
 
237
        $champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
192
 
238
        $champ_maj[] = "date_modification = now()";
193
		$retour = true;
239
 
194
		$requete_modification = "UPDATE cel_obs SET " .
240
		$requete_modification = "UPDATE cel_obs SET " .
195
			$this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
241
            implode(', ', $champ_maj) .
196
			" WHERE id_observation = ".Cel::db()->proteger($id).
242
			" WHERE id_observation = ".Cel::db()->proteger($id).
Line 197... Line 243...
197
			" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
243
			" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
Line 410... Line 456...
410
 
456
 
411
		// mise à jour du référentiel utilisé, sans n° de version
457
		// mise à jour du référentiel utilisé, sans n° de version
412
		$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'];
413
	}
469
    }
414
 
470
 
415
	/**
471
	/**
416
	* Formate les paramètres fournis en ajoutant des infos complementaires 
472
	* Formate les paramètres fournis en ajoutant des infos complementaires 
417
	* 
473
	* 
418
	* @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
419
	* 
475
	* 
420
	* @return $parametres le tableau modifié selon ce qu'il contenait
476
	* @return $parametres le tableau modifié selon ce qu'il contenait
421
	*/
-
 
422
	private function formaterParametresObservation(&$parametres) {		
-
 
423
		if(isset($parametres['ce_utilisateur'])) {
-
 
424
		
-
 
425
			$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']);
-
 
426
			
-
 
427
			$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel'];
-
 
428
			$parametres['nom_utilisateur'] = $infos_utilisateur['nom'];
-
 
429
			$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom'];
-
 
430
		}
477
	*/
431
 
478
	static function formaterParametresObservation(&$parametres) {		
432
		// 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 433... Line 480...
433
		// 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 439... Line 486...
439
	        	if (strlen($parametres['ce_zone_geo']) == 4) {
486
	        	if (strlen($parametres['ce_zone_geo']) == 4) {
440
	            	$parametres['ce_zone_geo'] = '0'.$parametres['ce_zone_geo'];
487
	            	$parametres['ce_zone_geo'] = '0'.$parametres['ce_zone_geo'];
441
	        	}
488
	        	}
Line 442... Line 489...
442
	        	
489
	        	
443
	        	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) {
444
	            	$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']);
445
	        	} else {     	        	 
492
	        	} else {     	        	 
446
	        	 	$parametres['ce_zone_geo'] = $this->convertirCodeInseeVersCodeZoneGeo($parametres['ce_zone_geo']);
493
	        	 	$parametres['ce_zone_geo'] = 'INSEE-C:'. $parametres['ce_zone_geo'];
447
	        	}
494
	        	}
448
        	}
495
        	}
Line 449... Line 496...
449
        }
496
        }
Line 503... Line 550...
503
	 * @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 
504
	 * 
551
	 * 
505
	 * @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
506
	 * 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 
507
	 */	
554
	 */	
508
	private function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
555
	static function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
509
		$sous_requete = '';
556
		$champs = array();
510
		
557
 
511
		// Nullifiage ...
558
		// Nullifiage ...
512
		// 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
513
		foreach($parametres as $cle => $valeur) {
560
		foreach($parametres as $cle => $valeur) {
514
			
-
 
515
			// Pour apparaitre le premier dans les tris ...
561
			// Pour apparaitre le premier dans les tris ...
516
			if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") {
562
			if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") {
517
				$valeur = "NULL";
563
				$valeur = "NULL";
518
			} else {
564
			} else {
519
				$valeur = Cel::db()->proteger($valeur);
565
				$valeur = Cel::db()->proteger($valeur);
520
			}
566
			}
521
			
-
 
522
        	$sous_requete .= $cle." = ".$valeur.", ";
567
        	$champs[] = $cle." = ".$valeur;
523
		}
568
		}
524
 
-
 
525
		// TODO: devrait être une clause ON UPDATE ou un TRIGGER
-
 
526
		// afin de mettre à jour la date de modification uniquement lorsqu'une modification
-
 
527
		// a effectivement eu lieu
-
 
528
		$sous_requete .= ' date_modification = now() ';
-
 
529
		
-
 
530
		return $sous_requete;
569
        return $champs;
531
	}
570
	}
532
} 
-
 
533
?>
-
 
534
571
}
-
 
572