Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
929 aurelien 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
/**
17
* Classe de gestion de l'ajout, modification et suppression des images
18
*
19
* in=utf8
20
* out=utf8
21
*
22
*/
23
class GestionImage extends Cel {
24
 
25
	/**
26
	* Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
27
	* renvoie le nouvel id d'image en cas de succès
28
	*
29
	* @param int $id_utilisateur identifiant de l'utilisateur
30
	* @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
31
	* élements du tableau $_FILES de php
32
	*/
33
	public function ajouterImage($id_utilisateur, $infos_fichier) {
34
 
35
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($id_utilisateur);
36
 
37
		if (!$nouvel_ordre) {
38
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
39
			$this->logger($message);
40
		}
41
 
42
		$extracteur_metadonnees = new ExtracteurMetadonnees();
43
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
970 aurelien 44
 
929 aurelien 45
		if(!$informations_image) {
46
			$message = 'Erreur lors de l\'extraction des metadonnées';
47
			$this->logger($message);
48
		}
49
 
50
		// ajout de quelques informations supplémentaire, en sus
51
		// des metadonnées dejà extraites
52
		$informations_image['ordre'] = $nouvel_ordre ;
53
		$informations_image['publiable_eflore'] = 'false' ;
54
		$informations_image['nom_original'] = $infos_fichier['name'] ;
55
 
56
		// le md5 du fichier sert à repérer les images en doublons
57
		$informations_image['md5'] = md5_file($infos_fichier['tmp_name']) ;
58
 
59
		$informations_image['ce_utilisateur'] = $id_utilisateur ;
60
 
970 aurelien 61
		$infos_utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
929 aurelien 62
 
970 aurelien 63
		$informations_image['courriel_utilisateur'] = $infos_utilisateur['courriel'];
64
		$informations_image['nom_utilisateur'] = $infos_utilisateur['nom'];
65
		$informations_image['prenom_utilisateur'] = $infos_utilisateur['prenom'];
66
 
929 aurelien 67
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
970 aurelien 68
 
929 aurelien 69
		$resultat_insertion_infos_image = $this->executer($requete_insertion_infos_image);
70
 
71
		if (!$resultat_insertion_infos_image) {
72
			$message = "Echec de l'insertion dans la base de donnees : " ;
73
			$this->logger($message);
74
        }
75
 
76
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $nouvel_ordre);
77
 
78
		if (!$id_nouvelle_image)
79
		{
80
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
81
			$this->logger($message);
82
		}
83
 
84
		$manipulateur_image = new ImageRecreation($this->config);
85
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);
86
 
87
		if (!$fichier_stocke) {
88
			$message =  'Erreur lors du stockage du fichier' ;
89
			$this->logger($message);
90
		}
91
 
92
		return $id_nouvelle_image;
93
	}
94
 
95
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
96
 
97
		$nouvel_ordre = 0 ;
98
 
99
		$requete_selection_ordre_max ='SELECT MAX(ordre) as max_ordre FROM cel_images WHERE ce_utilisateur = '.$this->proteger($id_utilisateur) ;
970 aurelien 100
		$resultat_requete_ordre_max = $this->requeter($requete_selection_ordre_max);
101
 
1304 aurelien 102
		if($resultat_requete_ordre_max !== false) {
929 aurelien 103
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
104
			$nouvel_ordre++;
105
		}
106
 
107
		return $nouvel_ordre;
108
	}
109
 
110
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
111
 
112
		$id_image = false;
113
 
970 aurelien 114
		$requete_id_image ='SELECT id_image FROM cel_images WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ordre = '.$ordre ;
115
		$resultat_id_image = $this->requeter($requete_id_image);
929 aurelien 116
 
117
        if (count($resultat_id_image) > 0)
118
		{
119
			$id_image = $resultat_id_image[0]['id_image'];
120
        }
121
 
122
        return $id_image;
123
	}
124
 
125
	private function construireRequeteInsertionImage($informations_image) {
126
 
127
		$requete_insertion_image = "INSERT INTO cel_images ";
128
 
129
		$champs_a_inserer = '' ;
130
		$valeurs_a_inserer = '' ;
131
 
132
		foreach ($informations_image as $champ => $valeur)
133
		{
134
			$champs_a_inserer .= $champ.',' ;
135
 
136
			if (is_null($valeur))
137
			{
138
				$valeurs_a_inserer .= 'NULL,' ;
139
			}
140
			else
141
			{
142
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
143
			}
144
		}
145
 
970 aurelien 146
        $champs_a_inserer .= 'date_modification,' ;
147
        $valeurs_a_inserer .= '"0000-00-00 00:00:00",' ;
929 aurelien 148
        $champs_a_inserer .= 'date_creation' ;
149
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
150
 
151
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
152
 
153
		return $requete_insertion_image;
154
	}
155
 
156
	/**
157
	 * Modifie les champs de metadonnées d'une image
158
	 *
159
	 * @param array $utilisateur identifiant utilisateur
1304 aurelien 160
	 * @param array $id id de l'image
929 aurelien 161
	 * @param array $parametres un taleau contenant des valeurs indexées par les noms de champs de la bdd
162
	 *
163
	 * @return boolean true ou false suivant le succès de l'opération
164
	 *
165
	*/
1304 aurelien 166
	public function modifierImage($utilisateur, $id_image, $parametres) {
929 aurelien 167
 
168
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
169
 
170
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($parametres);
171
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
172
 
1304 aurelien 173
		$requete_mise_a_jour_image .= ' WHERE id_image = '.$this->proteger($id_image).
929 aurelien 174
									  ' AND ce_utilisateur = '.$this->proteger($utilisateur);
175
 
176
		$resultat_mise_a_jour = $this->executer($requete_mise_a_jour_image);
1304 aurelien 177
 
178
		return ($resultat_mise_a_jour !== false);
929 aurelien 179
	}
180
 
181
	/**
182
	 * Assemble la requete de mise à jour des champs de metadonnées
183
	 *
184
	 * @param array $valeurs_metadonnees un taleau contenant des valeurs indexées par les noms de champs de la bdd
185
	 *
186
	 * @return string une sous chaine sql utilisable dans une requete de type UPPDATE table SET valeur1=champ1 ...
187
	 *
188
	*/
189
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
190
 
191
		$requete_maj_champs = '';
192
 
193
		$champs_a_ignorer = array('id_image');
194
 
195
		foreach ($valeurs_metadonnees as $champ  => $valeur)
196
		{
197
			if (!in_array($champ,$champs_a_ignorer)) {
198
				if ($champ == 'date_prise_de_vue') {
199
 
995 aurelien 200
					$date_tab = explode('/',$valeur) ;
929 aurelien 201
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
202
 
203
					$requete_maj_champs .= $champ.' = '.$this->proteger($date).' , ' ;
204
 
205
				}
206
				else {
207
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
208
				}
209
			}
210
		}
211
 
212
		$requete_maj_champs = rtrim($requete_maj_champs,' , ') ;
213
 
214
		return $requete_maj_champs;
215
	}
216
 
1020 aurelien 217
	public function supprimerImageParOrdre($id_utilisateur, $ordre_image_ou_tableau) {
929 aurelien 218
 
219
		if(is_array($ordre_image_ou_tableau)) {
220
			$id_image_ou_tableau = array_map(array($this,'proteger'),$ordre_image_ou_tableau);
221
			$ids_images = implode(',',$ordre_image_ou_tableau);
222
		} else {
223
			$ids_images = $this->proteger($ordre_image_ou_tableau);
224
		}
225
 
226
		$requete_selection_ids_images = 'SELECT id_image FROM cel_images WHERE '.
1020 aurelien 227
												'ce_utilisateur = '.$this->proteger($id_utilisateur).' '.
228
												'AND ordre IN ('.$ids_images.') ';
229
 
230
		$tableau_ids_images = $this->requeter($requete_selection_ids_images);
929 aurelien 231
		$chaine_ids_images = '';
232
		foreach($tableau_ids_images as $id_image) {
233
			$chaine_ids_images .= $id_image['id_image'];
1020 aurelien 234
		}
929 aurelien 235
 
236
		$chaine_ids_images = rtrim($chaine_ids_images,',');
1020 aurelien 237
 
238
		return $this->supprimerImage($id_utilisateur, $ordre_image_ou_tableau);
239
	}
240
 
241
	public function supprimerImage($id_utilisateur, $id_image_ou_tableau) {
242
 
243
		if(is_array($id_image_ou_tableau)) {
244
			$id_image_ou_tableau = array_map(array($this,'proteger'),$id_image_ou_tableau);
245
			$chaine_ids_images = implode(',',$id_image_ou_tableau);
246
		} else {
247
			$chaine_ids_images = $this->proteger($id_image_ou_tableau);
248
		}
249
 
929 aurelien 250
		$requete_suppression_images = "DELETE FROM cel_images WHERE id_image in (".$chaine_ids_images.")";
1020 aurelien 251
 
929 aurelien 252
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE id_image in (".$chaine_ids_images.")";
253
		$requete_suppression_lien_images_mots_cles = "DELETE FROM cel_images_mots_cles WHERE id_image in (".$chaine_ids_images.")";
254
 
255
		$resultat_suppression_image = $this->executer($requete_suppression_images);
256
		$resultat_suppression_lien_images_obs = $this->executer($requete_suppression_lien_images_obs);
257
		$resultat_suppression_lien_images_mots_cles = $this->executer($requete_suppression_lien_images_mots_cles);
258
 
1304 aurelien 259
		if ($resultat_suppression_image === false) {
929 aurelien 260
			$message =  'Erreur lors de la suppression de l\'image' ;
261
			$this->logger($message);
262
		}
263
 
1304 aurelien 264
		if ($resultat_suppression_lien_images_obs === false) {
929 aurelien 265
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
266
			$this->logger($message);
267
		}
268
 
1304 aurelien 269
		if (!$resultat_suppression_lien_images_mots_cles === false) {
929 aurelien 270
			$message =  'Erreur lors de la suppression des mots cles associés à l\'image' ;
271
			$this->logger($message);
272
		}
273
 
274
		$manipulateur_image = new ImageRecreation($this->config);
275
 
995 aurelien 276
		$tableau_ids_image = explode(',',$ids_images);
929 aurelien 277
 
278
		foreach($tableau_ids_image as $id_image_a_detruire) {
279
        	$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
280
		}
281
 
282
		return $destruction_fichier_image;
283
	}
284
}
285
?>