Subversion Repositories eFlore/Applications.cel

Rev

Rev 3509 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3509 Rev 3726
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Classe métier de gestion de l'ajout, modification et suppression des images.
4
 * Classe métier de gestion de l'ajout, modification et suppression des images.
5
 *
5
 *
6
 * @internal   Mininum PHP version : 5.2
6
 * @internal   Mininum PHP version : 5.2
7
 * @category   CEL
7
 * @category   CEL
8
 * @package    Services
8
 * @package    Services
9
 * @subpackage Bibliothèques
9
 * @subpackage Bibliothèques
10
 * @version    0.1
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
17
 */
18
class GestionImage extends Cel {
18
class GestionImage extends Cel {
19
 
19
 
20
	/**
20
	/**
21
	* Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
21
	* Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
22
	* renvoie le nouvel id d'image en cas de succès
22
	* renvoie le nouvel id d'image en cas de succès
23
	*
23
	*
24
	* @param int $id_utilisateur identifiant de l'utilisateur
24
	* @param int $id_utilisateur identifiant de l'utilisateur
25
	* @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
25
	* @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
26
	* élements du tableau $_FILES de php
26
	* élements du tableau $_FILES de php
27
	*/
27
	*/
28
	public function ajouterImage($id_utilisateur, $infos_fichier) {
28
	public function ajouterImage($id_utilisateur, $infos_fichier) {
29
		$extracteur_metadonnees = new ExtracteurMetadonnees();
29
		$extracteur_metadonnees = new ExtracteurMetadonnees();
30
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
30
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
31
		if (!$informations_image) {
31
		if (!$informations_image) {
32
			$message = "Erreur lors de l'extraction des metadonnées";
32
			$message = "Erreur lors de l'extraction des metadonnées";
33
			$this->logger($message);
33
			$this->logger($message);
34
		}
34
		}
35
 
35
 
36
		// ajout de quelques informations supplémentaire, en sus
36
		// ajout de quelques informations supplémentaire, en sus
37
		// des metadonnées dejà extraites
37
		// des metadonnées dejà extraites
38
		$informations_image['original_name'] = $infos_fichier['name'] ;
38
		$informations_image['original_name'] = $infos_fichier['name'] ;
39
		//$informations_image['size'] = $infos_fichier['name'] ;
39
		//$informations_image['size'] = $infos_fichier['name'] ;
40
 
40
 
41
		// le md5 du fichier sert à repérer les images en doublons
41
		// le md5 du fichier sert à repérer les images en doublons
42
		$informations_image['md5'] = md5_file($infos_fichier['tmp_name']) ;
42
		$informations_image['md5'] = md5_file($infos_fichier['tmp_name']) ;
43
 
43
 
44
		$informations_image['user_id'] = $id_utilisateur ;
44
		$informations_image['user_id'] = $id_utilisateur ;
45
//manque une fonction
45
//manque une fonction
46
		$infos_utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
46
		$infos_utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
47
 
47
 
48
		$informations_image['user_email'] = $infos_utilisateur['courriel'];
48
		$informations_image['user_email'] = $infos_utilisateur['courriel'];
49
		$informations_image['user_pseudo'] = $infos_utilisateur['pseudo'];
49
		$informations_image['user_pseudo'] = $infos_utilisateur['pseudo'];
50
 
50
 
51
		$requete = $this->construireRequeteInsertionImage($informations_image);
51
		$requete = $this->construireRequeteInsertionImage($informations_image);
52
		$resultat_insertion_infos_image = Cel::db()->executer($requete);
52
		$resultat_insertion_infos_image = Cel::db()->executer($requete);
53
		if (!$resultat_insertion_infos_image) {
53
		if (!$resultat_insertion_infos_image) {
54
			$message = "Echec de l'insertion dans la base de donnees : " ;
54
			$message = "Echec de l'insertion dans la base de donnees : " ;
55
			$this->logger($message);
55
			$this->logger($message);
56
		}
56
		}
57
 
57
 
58
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $informations_image['original_name']);
58
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $informations_image['original_name']);
59
		if (!$id_nouvelle_image) {
59
		if (!$id_nouvelle_image) {
60
			$message = "Impossible d'obtenir le nouvel identifiant de l'image";
60
			$message = "Impossible d'obtenir le nouvel identifiant de l'image";
61
			$this->logger($message);
61
			$this->logger($message);
62
		}
62
		}
63
 
63
 
64
		$manipulateur_image = new ImageRecreation($this->config);
64
		$manipulateur_image = new ImageRecreation($this->config);
65
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier, $id_nouvelle_image);
65
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier, $id_nouvelle_image);
66
		if (!$fichier_stocke) {
66
		if (!$fichier_stocke) {
67
			$message = "Erreur lors du stockage du fichier";
67
			$message = "Erreur lors du stockage du fichier";
68
			$this->logger($message);
68
			$this->logger($message);
69
 
69
 
70
			// Remise à zéro d'idImage pour que l'erreur ne soit pas ignorée par l'appelant
70
			// Remise à zéro d'idImage pour que l'erreur ne soit pas ignorée par l'appelant
71
			$id_nouvelle_image = false;
71
			$id_nouvelle_image = false;
72
		}
72
		}
73
 
73
 
74
		return $id_nouvelle_image;
74
		return $id_nouvelle_image;
75
	}
75
	}
76
 
76
 
77
 
77
 
78
 
78
 
79
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $nom) {
79
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $nom) {
80
		$id_image = false;
80
		$id_image = false;
81
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
81
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
82
		$nomP = Cel::db()->proteger($nom);
82
		$nomP = Cel::db()->proteger($nom);
83
		$requete ='SELECT id as id_image '.
83
		$requete ='SELECT id as id_image '.
84
			'FROM photo '.
84
			'FROM photo '.
85
			"WHERE user_id = $idUtilisateurP ".
85
			"WHERE user_id = $idUtilisateurP ".
86
			"	AND original_name = $nomP ".
86
			"	AND original_name = $nomP ".
87
			' -- '.__FILE__.' : '.__LINE__;
87
			' -- '.__FILE__.' : '.__LINE__;
88
		$resultat = Cel::db()->requeter($requete);
88
		$resultat = Cel::db()->requeter($requete);
89
 
89
 
90
		if (count($resultat) > 0) {
90
		if (count($resultat) > 0) {
91
			$id_image = $resultat[0]['id_image'];
91
			$id_image = $resultat[0]['id_image'];
92
		}
92
		}
93
		return $id_image;
93
		return $id_image;
94
	}
94
	}
95
 
95
 
96
	private function construireRequeteInsertionImage($informations_image) {
96
	private function construireRequeteInsertionImage($informations_image) {
97
		$infos = array(
97
		$infos = array(
98
			'date_created ' => 'NOW()',
98
			'date_created ' => 'NOW()',
99
			'date_updated ' => 'NOW()');
99
			'date_updated ' => 'NOW()');
100
		foreach ($informations_image as $champ => $valeur) {
100
		foreach ($informations_image as $champ => $valeur) {
101
			$infos[$champ] = is_null($valeur) ? 'NULL' : Cel::db()->proteger($valeur);
101
			$infos[$champ] = is_null($valeur) ? 'NULL' : Cel::db()->proteger($valeur);
102
		}
102
		}
103
		$champs = implode(', ', array_keys($infos));
103
		$champs = implode(', ', array_keys($infos));
104
		$valeurs = implode(', ', array_values($infos));
104
		$valeurs = implode(', ', array_values($infos));
105
 
105
 
106
		$requete = "INSERT INTO photo ($champs) ".
106
		$requete = "INSERT INTO photo ($champs) ".
107
			"VALUES ($valeurs) ".
107
			"VALUES ($valeurs) ".
108
			' -- '.__FILE__.' : '.__LINE__;
108
			' -- '.__FILE__.' : '.__LINE__;
109
		return $requete;
109
		return $requete;
110
	}
110
	}
111
 
111
 
112
	/**
112
	/**
113
	 * Modifie les champs de metadonnées d'une image
113
	 * Modifie les champs de metadonnées d'une image
114
	 *
114
	 *
115
	 * @param array $id_utilisateur identifiant utilisateur
115
	 * @param array $id_utilisateur identifiant utilisateur
116
	 * @param array $id id de l'image
116
	 * @param array $id id de l'image
117
	 * @param array $parametres un taleau contenant des valeurs indexées par les noms de champs de la bdd
117
	 * @param array $parametres un taleau contenant des valeurs indexées par les noms de champs de la bdd
118
	 * @return boolean true ou false suivant le succès de l'opération
118
	 * @return boolean true ou false suivant le succès de l'opération
119
	*/
119
	*/
120
	public function modifierImage($id_utilisateur, $id_image, $parametres) {
120
	public function modifierImage($id_utilisateur, $id_image, $parametres) {
121
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($parametres);
121
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($parametres);
122
 
122
 
123
		$requete = "UPDATE photo SET $champs_a_mettre_a_jour ".
123
		$requete = "UPDATE photo SET $champs_a_mettre_a_jour ".
124
			' WHERE id = '.Cel::db()->proteger($id_image).
124
			' WHERE id = '.Cel::db()->proteger($id_image).
125
			' AND user_id = '.Cel::db()->proteger($id_utilisateur).
125
			' AND user_id = '.Cel::db()->proteger($id_utilisateur).
126
			' -- '.__FILE__.' : '.__LINE__;
126
			' -- '.__FILE__.' : '.__LINE__;
127
		$resultat = Cel::db()->executer($requete);
127
		$resultat = Cel::db()->executer($requete);
128
		return ($resultat !== false);
128
		return ($resultat !== false);
129
	}
129
	}
130
 
130
 
131
 
131
 
132
 
132
 
133
	/**
133
	/**
134
	 * Assemble la requete de mise à jour des champs de metadonnées
134
	 * Assemble la requete de mise à jour des champs de metadonnées
135
	 *
135
	 *
136
	 * @param array $valeurs_metadonnees un taleau contenant des valeurs indexées par les noms de champs de la bdd
136
	 * @param array $valeurs_metadonnees un taleau contenant des valeurs indexées par les noms de champs de la bdd
137
	 * @return string une sous chaine sql utilisable dans une requete de type UPPDATE table SET valeur1=champ1 ...
137
	 * @return string une sous chaine sql utilisable dans une requete de type UPPDATE table SET valeur1=champ1 ...
138
	*/
138
	*/
139
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
139
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
140
		$champs_maj = array('date_modification = NOW()');
140
		$champs_maj = array('date_modification = NOW()');
141
		$champs_a_ignorer = array('id_image', 'date_modification');
141
		$champs_a_ignorer = array('id_image', 'date_modification');
142
		foreach ($valeurs_metadonnees as $champ  => $valeur) {
142
		foreach ($valeurs_metadonnees as $champ  => $valeur) {
143
			if (!in_array($champ, $champs_a_ignorer)) {
143
			if (!in_array($champ, $champs_a_ignorer)) {
144
				if ($champ == 'date_prise_de_vue' && trim($valeur) != '') {
144
				if ($champ == 'date_prise_de_vue' && trim($valeur) != '') {
145
					$date_tab = explode('/', $valeur) ;
145
					$date_tab = explode('/', $valeur) ;
146
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
146
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
147
					$dateP = Cel::db()->proteger($date);
147
					$dateP = Cel::db()->proteger($date);
148
					$champs_maj[] = "$champ = $dateP";
148
					$champs_maj[] = "$champ = $dateP";
149
				} else {
149
				} else {
150
					$valeurP = Cel::db()->proteger($valeur);
150
					$valeurP = Cel::db()->proteger($valeur);
151
					$champs_maj[] = "$champ = $valeurP";
151
					$champs_maj[] = "$champ = $valeurP";
152
				}
152
				}
153
			}
153
			}
154
		}
154
		}
155
		return implode(', ', $champs_maj);
155
		return implode(', ', $champs_maj);
156
	}
156
	}
157
 
157
 
158
	public function supprimerImage($id_image_ou_tableau) {
158
	public function supprimerImage($id_image_ou_tableau) {
159
		$ids_images_non_protegees = array();
159
		$ids_images_non_protegees = array();
160
		if (is_array($id_image_ou_tableau)) {
160
		if (is_array($id_image_ou_tableau)) {
161
			$ids_images_non_protegees = $id_image_ou_tableau;
161
			$ids_images_non_protegees = $id_image_ou_tableau;
162
			$id_image_ou_tableau = Cel::db()->proteger($id_image_ou_tableau);
162
			$id_image_ou_tableau = Cel::db()->proteger($id_image_ou_tableau);
163
			$chaine_ids_images = implode(',', $id_image_ou_tableau);
163
			$chaine_ids_images = implode(',', $id_image_ou_tableau);
164
		} else {
164
		} else {
165
			$ids_images_non_protegees[] = $id_image_ou_tableau;
165
			$ids_images_non_protegees[] = $id_image_ou_tableau;
166
			$chaine_ids_images = Cel::db()->proteger($id_image_ou_tableau);
166
			$chaine_ids_images = Cel::db()->proteger($id_image_ou_tableau);
167
		}
167
		}
-
 
168
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'images');
-
 
169
		$resultat_suppression_lien_images_mots_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_images_non_protegees);
-
 
170
		if (!$resultat_suppression_lien_images_mots_cles === false) {
-
 
171
		    $message =  "Erreur lors de la suppression des mots cles associés à l'image" ;
-
 
172
		    $this->logger($message);
-
 
173
		}
168
 
174
 
169
		$requete = 'DELETE FROM photo '.
175
		$requete = 'DELETE FROM photo '.
170
			"WHERE id in ($chaine_ids_images) ".
176
			"WHERE id in ($chaine_ids_images) ".
171
			' -- '.__FILE__.' : '.__LINE__;
177
			' -- '.__FILE__.' : '.__LINE__;
172
		$resultat_suppression_image = Cel::db()->executer($requete);
178
		$resultat_suppression_image = Cel::db()->executer($requete);
173
		if ($resultat_suppression_image === false) {
179
		if ($resultat_suppression_image === false) {
174
			$message = "Erreur lors de la suppression de l'image" ;
180
			$message = "Erreur lors de la suppression de l'image" ;
175
			$this->logger($message);
181
			$this->logger($message);
176
		}
-
 
177
 
-
 
178
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'images');
-
 
179
		$resultat_suppression_lien_images_mots_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_images_non_protegees);
-
 
180
		if (!$resultat_suppression_lien_images_mots_cles === false) {
-
 
181
			$message =  "Erreur lors de la suppression des mots cles associés à l'image" ;
-
 
182
			$this->logger($message);
-
 
183
		}
182
		}
184
 
183
 
185
		$manipulateur_image = new ImageRecreation($this->config);
184
		$manipulateur_image = new ImageRecreation($this->config);
186
		$tableau_ids_image = explode(',', $chaine_ids_images);
185
		$tableau_ids_image = explode(',', $chaine_ids_images);
187
		foreach ($tableau_ids_image as $id_image_a_detruire) {
186
		foreach ($tableau_ids_image as $id_image_a_detruire) {
188
			$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
187
			$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
189
		}
188
		}
190
		return $destruction_fichier_image;
189
		return $destruction_fichier_image;
191
	}
190
	}
192
 
191
 
193
	/**
192
	/**
194
	* Fonction utilisée pour importer les anciennes images saisies dans les widget dans un compte identifié
193
	* Fonction utilisée pour importer les anciennes images saisies dans les widget dans un compte identifié
195
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
194
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
196
	* @param string $mail_utilisateur
195
	* @param string $mail_utilisateur
197
	* @param string $id_utilisateur
196
	* @param string $id_utilisateur
198
	*/
197
	*/
199
	public function migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur) {
198
	public function migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur) {
200
		// ATTENTION : cette fonction suppose que l'utilisateur n'a pas déjà d'images dans le CEL
199
		// ATTENTION : cette fonction suppose que l'utilisateur n'a pas déjà d'images dans le CEL
201
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
200
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
202
		$requete = 'UPDATE photo SET '.
201
		$requete = 'UPDATE photo SET '.
203
			'user_id = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).', '.
202
			'user_id = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).', '.
204
			'user_pseudo = '.Cel::db()->proteger($infos_utilisateur['prenom']).', '.
203
			'user_pseudo = '.Cel::db()->proteger($infos_utilisateur['prenom']).', '.
205
			'user_email = '.Cel::db()->proteger($infos_utilisateur['courriel']).' '.
204
			'user_email = '.Cel::db()->proteger($infos_utilisateur['courriel']).' '.
206
			'WHERE user_id = '.Cel::db()->proteger($mail_utilisateur).' '.
205
			'WHERE user_id = '.Cel::db()->proteger($mail_utilisateur).' '.
207
			' -- '.__FILE__.' : '.__LINE__;
206
			' -- '.__FILE__.' : '.__LINE__;
208
 
207
 
209
		$migration_releve = Cel::db()->executer($requete);
208
		$migration_releve = Cel::db()->executer($requete);
210
		return $migration_releve;
209
		return $migration_releve;
211
	}
210
	}
212
}
211
}