Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2342 Rev 2370
Line 20... Line 20...
20
	private $projetTags = array();
20
	private $projetTags = array();
21
	private $tagsObs = null;
21
	private $tagsObs = null;
22
	private $tagsImg = null;
22
	private $tagsImg = null;
23
	private $champsEtendusObs = null;
23
	private $champsEtendusObs = null;
24
	private $utilisateur_id = null;
24
	private $utilisateur_id = null;
25
	const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 * 2 = 172 800
25
	const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 = 86 400 (1 journée)
26
	const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
26
	const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
Line 27... Line 27...
27
 
27
 
28
	private $correspondanceIdImgTags = array();
28
	private $correspondanceIdImgTags = array();
29
	private $gestionMotsClesObs = null;
29
	private $gestionMotsClesObs = null;
Line 37... Line 37...
37
			$this->projet = $requeteDonnees['projet'];
37
			$this->projet = $requeteDonnees['projet'];
Line 38... Line 38...
38
 
38
 
39
			// Traitements des tags multiples de projet
39
			// Traitements des tags multiples de projet
Line 40... Line 40...
40
			$this->traiterProjetTags();
40
			$this->traiterProjetTags();
41
 
41
 
Line 42... Line 42...
42
			// Traitement des tags spécifique aux obs
42
			// Traitement des tags spécifiques aux obs
43
			$this->traiterTagObs($requeteDonnees);
43
			$this->traiterTagObs($requeteDonnees);
Line 44... Line 44...
44
 
44
 
45
			// Traitement des tags spécifique aux images
45
			// Traitement des tags spécifiques aux images
46
			$this->traiterTagImg($requeteDonnees);
46
			$this->traiterTagImg($requeteDonnees);
47
 
47
 
48
			// Traitement des observations et des images
48
			// Traitement des observations et des images
49
			if (filter_var($requeteDonnees['utilisateur']['courriel'], FILTER_VALIDATE_EMAIL)) {
49
			if (filter_var($requeteDonnees['utilisateur']['courriel'], FILTER_VALIDATE_EMAIL)) {
50
				$this->debug[] = 'Utilisateur : '.print_r($requeteDonnees['utilisateur'], true);
50
				$this->debug[] = 'Utilisateur : '.print_r($requeteDonnees['utilisateur'], true);
-
 
51
				$utilisateur = $requeteDonnees['utilisateur'];
51
				$utilisateur = $requeteDonnees['utilisateur'];
52
				if (array_key_exists('courriel', $utilisateur)) {
52
				if (array_key_exists('courriel', $utilisateur)) {
53
					// début transaction car si insertions par le même utilisateur en parallèle, 
-
 
54
					// le getMaxOrdre et le INSERT sont en concurrence et risquent de foirer.
-
 
55
					// De plus, ça permet de ne pas conserver les données d'obs si l'image provoque une erreur
Line 53... Line 56...
53
					// début transaction car si insertions par le même utilisateur en parallèle, 
56
					//Cel::db()->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
54
					// le getMaxOrdre et le INSERT sont en concurrence et risquent de foirer
57
					Cel::db()->beginTransaction();
55
					//Cel::db()->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
58
					$erreursDurantTraitement = false;
56
					Cel::db()->beginTransaction();
59
					$nomsOriginauxImagesTemp = array();
Line 110... Line 113...
110
								$this->champsEtendusObs[$ordreObs] = isset($obs['obs_etendue']) ? $obs['obs_etendue'] : array();
113
								$this->champsEtendusObs[$ordreObs] = isset($obs['obs_etendue']) ? $obs['obs_etendue'] : array();
Line 111... Line 114...
111
 
114
 
112
								$imgAAjouter = null;
115
								$imgAAjouter = null;
113
								if (!empty($obs['image_nom'])) {
116
								if (!empty($obs['image_nom'])) {
-
 
117
									$imgAAjouter = $this->traiterImagesALierAObs($id_utilisateur, $ordreObs, $obs);
-
 
118
									if ($imgAAjouter != null) {
-
 
119
										foreach ($imgAAjouter as $uneImgAAjouter) {
-
 
120
											$nomsOriginauxImagesTemp[] = $uneImgAAjouter['nom'];
-
 
121
										}
114
									$imgAAjouter = $this->traiterImagesALierAObs($id_utilisateur, $ordreObs, $obs);
122
									}
Line 115... Line 123...
115
								}
123
								}
116
 
124
 
117
								if(!trim($courriel) && !trim($id_utilisateur)) {
125
								if(!trim($courriel) && !trim($id_utilisateur)) {
Line 141... Line 149...
141
							$champs = implode(', ', array_keys($obs));
149
							$champs = implode(', ', array_keys($obs));
142
							$valeurs = implode(', ', $obs);
150
							$valeurs = implode(', ', $obs);
143
							$requete = "INSERT INTO cel_obs ($champs) VALUES ($valeurs) ";
151
							$requete = "INSERT INTO cel_obs ($champs) VALUES ($valeurs) ";
Line 144... Line 152...
144
 
152
 
-
 
153
							if (Cel::db()->executer($requete) === false) {
145
							if (Cel::db()->executer($requete) === false) {
154
								$erreursDurantTraitement = true;
146
								$this->messages[] = "Un problème est survenu lors de l'insertion de l'obs dans la base de données.";
155
								$this->messages[] = "Un problème est survenu lors de l'insertion de l'obs dans la base de données.";
147
							} else {
156
							} else {
148
								$obs_a_taguer_ordres[] = trim($obs['ordre'], "'");
157
								$obs_a_taguer_ordres[] = trim($obs['ordre'], "'");
Line 153... Line 162...
153
 
162
 
154
							// si le formulaire contient une image on la traite
163
							// si le formulaire contient une image on la traite
155
							if ($img != null) {
164
							if ($img != null) {
156
								$this->nettoyerImagesUploades();
165
								$this->nettoyerImagesUploades();
-
 
166
								$img_a_taguer_ids = $this->stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur);
-
 
167
								if ($img_a_taguer_ids === false) {
-
 
168
									$erreursDurantTraitement = true;
-
 
169
									$this->messages[] = "Au moins une des images n'a pas pu être enregistrée.";
157
								$img_a_taguer_ids = $this->stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur);
170
								} else {
158
								$cmd = sprintf($this->config['cel']['commande_script_images'],implode(',', $img_a_taguer_ids));
171
									$cmd = sprintf($this->config['cel']['commande_script_images'],implode(',', $img_a_taguer_ids));
-
 
172
									pclose(popen($cmd,"r"));
159
								pclose(popen($cmd,"r"));
173
								}
160
							}
174
							}
Line 161... Line 175...
161
						}
175
						}
162
 
176
 
Line 163... Line 177...
163
						$this->gestionMotsClesObs = new GestionMotsClesChemin($this->config,'obs');
177
						$this->gestionMotsClesObs = new GestionMotsClesChemin($this->config,'obs');
164
						$this->gestionMotsClesImages = new GestionMotsClesChemin($this->config,'images');
178
						$this->gestionMotsClesImages = new GestionMotsClesChemin($this->config,'images');
-
 
179
 
165
 
180
						$obs_a_taguer_ids = $this->obtenirIdsObsPourTableauOrdres($this->utilisateur_id, $obs_a_taguer_ordres);
-
 
181
						$this->taguerObs($obs_a_taguer_ids);
Line 166... Line 182...
166
						$obs_a_taguer_ids = $this->obtenirIdsObsPourTableauOrdres($this->utilisateur_id, $obs_a_taguer_ordres);
182
						if ($img_a_taguer_ids !== false) {
167
						$this->taguerObs($obs_a_taguer_ids);
183
							$this->taguerImg($img_a_taguer_ids);
168
						$this->taguerImg($img_a_taguer_ids);
184
						}
-
 
185
 
169
 
186
						// Les champs taggés sont des champs supplémentaires stockés sous forme de clé => valeur
170
						// Les champs taggés sont des champs supplémentaires stockés sous forme de clé => valeur
187
						$this->ajouterChampsEtendusObs($obs_a_taguer_ids, $this->champsEtendusObs);
-
 
188
					} else {
-
 
189
						$erreursDurantTraitement = true;
-
 
190
						$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré.";
-
 
191
					}
171
						$this->ajouterChampsEtendusObs($obs_a_taguer_ids, $this->champsEtendusObs);
192
					// Fin de la transaction - on considère que commit() et rollback() ne ratent jamais
-
 
193
					if ($erreursDurantTraitement === false) {
-
 
194
						// Suppression des fichiers images temporaires
-
 
195
						$this->nettoyerImagesUploades($nomsOriginauxImagesTemp);
-
 
196
						Cel::db()->commit();
-
 
197
					} else {
-
 
198
						// On annule l'écriture des images enregistrées sur le disque dur - la transaction
-
 
199
						// se charge de les retirer de la base de données
-
 
200
						if ($img_a_taguer_ids !== false) {
-
 
201
							foreach ($img_a_taguer_ids as $idImageASupprimer) {
-
 
202
								$this->effacerImageDuDd($idImageASupprimer);
172
					} else {
203
							}
173
						$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré.";
204
						}
174
					}
205
						Cel::db()->rollBack();
175
					Cel::db()->commit();
206
					}
176
				} else {
207
				} else {
Line 183... Line 214...
183
			$this->messages[] = "Les informations concernant le projet coopératif n'ont pas été transmises.";
214
			$this->messages[] = "Les informations concernant le projet coopératif n'ont pas été transmises.";
184
		}
215
		}
185
		if (count($this->messages) > 0) {
216
		if (count($this->messages) > 0) {
186
			$this->debug[] = print_r($this->messages, true);
217
			$this->debug[] = print_r($this->messages, true);
187
		}
218
		}
188
		$msg = (count($this->messages) > 0) ? 'erreur' : 'ok';
219
		if (count($this->messages) > 0) {
-
 
220
			$msg = 'erreur';
-
 
221
			$idNouvelleObs = null;
-
 
222
		} else {
-
 
223
			$msg = 'ok';
-
 
224
		}
189
		$retour = (object) array('msg' => $msg, 'id' => $idNouvelleObs);
225
		$retour = (object) array('msg' => $msg, 'id' => $idNouvelleObs);
190
		$this->envoyerJson($retour);
226
		$this->envoyerJson($retour);
191
		exit;
227
		exit;
192
	}
228
	}
Line 283... Line 319...
283
		}
319
		}
Line 284... Line 320...
284
 
320
 
285
		return $imgAAjouter;
321
		return $imgAAjouter;
Line 286... Line 322...
286
	}
322
	}
287
 
323
 
288
	private function stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur) {
324
	protected function stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur) {
289
		$img_a_taguer_ids = array();
325
		$img_a_taguer_ids = array();
290
		if (!isset($img['nom']) && is_array($img)) {
326
		if (!isset($img['nom']) && is_array($img)) {
291
			foreach ($img as $index => $image) {
327
			foreach ($img as $index => $image) {
Line 304... Line 340...
304
						$img_a_taguer_ids[] = $idImg;
340
						$img_a_taguer_ids[] = $idImg;
305
						if (isset($image['tags'])) {
341
						if (isset($image['tags'])) {
306
							$this->correspondanceIdImgTags[$idImg] = $image['tags'];
342
							$this->correspondanceIdImgTags[$idImg] = $image['tags'];
307
						}
343
						}
308
					}
344
					}
-
 
345
				} else {
-
 
346
					// L'image n'a pas pu être écrite.
-
 
347
					// On annule l'écriture des précédentes et on s'arrête là - la transaction
-
 
348
					// se chargera de les retirer de la base de données
-
 
349
					foreach ($img_a_taguer_ids as $idImageASupprimer) {
-
 
350
						$this->effacerImageDuDd($idImageASupprimer);
-
 
351
					}
-
 
352
					$img_a_taguer_ids = false;
-
 
353
					break;
309
				}
354
				}
310
			}
355
			}
311
		} else {
356
		} else {
312
			$nomFichierImg = $this->traiterNomFichierImage($img['nom']);
357
			$nomFichierImg = $this->traiterNomFichierImage($img['nom']);
313
			$cheminImage = $this->config['cel']['chemin_stockage_temp']."/$nomFichierImg";
358
			$cheminImage = $this->config['cel']['chemin_stockage_temp']."/$nomFichierImg";
Line 324... Line 369...
324
					$img_a_taguer_ids[] = $idImg;
369
					$img_a_taguer_ids[] = $idImg;
325
					if (isset($img['tags'])) {
370
					if (isset($img['tags'])) {
326
						$this->correspondanceIdImgTags[$idImg] = $img['tags'];
371
						$this->correspondanceIdImgTags[$idImg] = $img['tags'];
327
					}
372
					}
328
				}
373
				}
-
 
374
			} else {
-
 
375
				// L'image n'a pas pu être écrite
-
 
376
				$img_a_taguer_ids = false;
329
			}
377
			}
330
		}
378
		}
Line 331... Line 379...
331
 
379
 
332
		return $img_a_taguer_ids;
380
		return $img_a_taguer_ids;
Line 536... Line 584...
536
			$ids[] = $id['id_observation'];
584
			$ids[] = $id['id_observation'];
537
		}
585
		}
538
		return $ids;
586
		return $ids;
539
	}
587
	}
Line -... Line 588...
-
 
588
 
-
 
589
	/**
-
 
590
	 * Supprime toutes les images temporaires dont :
-
 
591
	 * - l'ancienneté est supérieure à DUREE_DE_VIE_IMG (si $nomsDeFichiers vaut false, par défaut)
-
 
592
	 * - le nom correspond à un des éléments du tableau $nomsDeFichiers (s'il est spécifié et non vide)
540
 
593
	 */
-
 
594
	protected function nettoyerImagesUploades($nomsDeFichiers=false) {
-
 
595
		// mode de suppression
-
 
596
		$suppressionParNom = (is_array($nomsDeFichiers) && count($nomsDeFichiers > 0));
541
	public function nettoyerImagesUploades() {
597
 
542
		$dossierStockage = $this->config['cel']['chemin_stockage_temp'].'/';
598
		$dossierStockage = $this->config['cel']['chemin_stockage_temp'].'/';
543
		if (is_dir($dossierStockage)) {
599
		if (is_dir($dossierStockage)) {
544
			$objets = scandir($dossierStockage);
600
			$objets = scandir($dossierStockage);
545
			if ($objets !== false) {
601
			if (is_array($objets)) {
546
				foreach ($objets as $objet) {
602
				foreach ($objets as $objet) {
547
					$chemin = $dossierStockage.$objet;
603
					$chemin = $dossierStockage . $objet;
-
 
604
					if (is_file($chemin)) {
-
 
605
						// critère de suppression
-
 
606
						if ($suppressionParNom) {
-
 
607
							$suppression = in_array($objet, $nomsDeFichiers);
548
					if (is_file($chemin)) {
608
						} else {
549
						$filemtime = @filemtime($chemin);
609
							$filemtime = @filemtime($chemin);
550
						if ($filemtime !== false) {
610
							if ($filemtime !== false) {
551
							$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_IMG) ? true : false;
-
 
552
							if ($suppression === true) {
-
 
553
								unlink($chemin);
611
								$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_IMG) ? true : false;
554
							}
612
							}
-
 
613
						}
-
 
614
						// suppression
-
 
615
						if ($suppression === true) {
-
 
616
							unlink($chemin);
555
						}
617
						}
556
					}
618
					}
557
				}
619
				}
558
			}
620
			}
559
		}
621
		}
Line 590... Line 652...
590
					$resultat = Cel::db()->executer($requete);
652
					$resultat = Cel::db()->executer($requete);
591
					if ($resultat !== false) {
653
					if ($resultat !== false) {
592
						$idImage = $this->obtenirIdImagePourIdentifiantEtOrdre($idUtilisateur, $nouvelOrdre);
654
						$idImage = $this->obtenirIdImagePourIdentifiantEtOrdre($idUtilisateur, $nouvelOrdre);
593
						if ($idImage !== false) {
655
						if ($idImage !== false) {
594
							$manipulateurImage = new ImageRecreation($this->config);
656
							$manipulateurImage = new ImageRecreation($this->config);
-
 
657
							// Stocke le fichier en conservant les fichiers temporaires, ce qui permet de réessayer
-
 
658
							// de les traiter en cas d'échec de la totalité du processus de traitement de l'obs
595
							$stockageOk = $manipulateurImage->stockerFichierOriginal($cheminImage, $idImage);
659
							$stockageOk = $manipulateurImage->stockerFichierOriginal($cheminImage, $idImage, true);
596
							if ($stockageOk) {
660
							if ($stockageOk) {
597
								$miniatureChemin = str_replace('.jpg', '_min.jpg', $cheminImage);
661
								$miniatureChemin = str_replace('.jpg', '_min.jpg', $cheminImage);
598
								if (file_exists($miniatureChemin)) {
662
								if (file_exists($miniatureChemin)) {
599
									if (@unlink($miniatureChemin) === false) {
663
									if (@unlink($miniatureChemin) === false) {
600
										$this->messages[] = "La miniature de l'image n'a pu être supprimée.";
664
										$this->messages[] = "La miniature de l'image n'a pu être supprimée.";
Line 620... Line 684...
620
			$this->messages[] = "Erreur lors du calcul du nouvel ordre de l'image.";
684
			$this->messages[] = "Erreur lors du calcul du nouvel ordre de l'image.";
621
		}
685
		}
622
		return $idImage;
686
		return $idImage;
623
	}
687
	}
Line -... Line 688...
-
 
688
 
-
 
689
	/**
-
 
690
	 * Supprime une image du disque dur. Ne touche pas à la base de données, on considère
-
 
691
	 * que c'est le rôle de la transaction d'annuler les écritures en cas de problème
-
 
692
	 * 
-
 
693
	 * @param Integer $idImageASupprimer
-
 
694
	 * @return boolean $ok true si la suppression s'est bien passée, false s'il reste au moins un fichier
-
 
695
	 */
-
 
696
	protected function effacerImageDuDd($idImageASupprimer) {
-
 
697
		$manipulateurImage = new ImageRecreation($this->config);
-
 
698
		$ok = $manipulateurImage->detruireImageSurDisque($idImageASupprimer);
-
 
699
 
-
 
700
		return $ok;
-
 
701
	}
624
 
702
 
625
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
703
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
Line 626... Line 704...
626
		$id_utilisateur = Cel::db()->proteger($id_utilisateur);
704
		$id_utilisateur = Cel::db()->proteger($id_utilisateur);
627
 
705