Subversion Repositories eFlore/Applications.cel

Rev

Rev 758 | Rev 970 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 758 Rev 927
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
 
2
/**
16
/**
3
 * Service recherche  et ajout d'image a partir de divers critères
17
* Service recherche  et ajout d'image a partir de divers critères
4
 * Encodage en entrée : utf8
18
* in=utf8
5
 * Encodage en sortie : utf8
19
* out=utf8
6
 *
20
* 
7
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
-
 
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
-
 
10
 * @version $Id$
-
 
11
 */
21
*/
12
class InventoryImage extends Cel {
22
class InventoryImage extends Cel {
13
	
23
	
14
	/**
24
	/**
15
	 * Méthode appelée avec une requête de type GET.
25
	* Méthode appelée avec une requête de type GET.
16
	 * Renvoie les infos sur l'image correspondant à l'id passé en parametre
26
	* Renvoie les infos sur l'image correspondant à l'id passé en parametre
-
 
27
	* @param int uid[0] : utilisateur obligatoire
-
 
28
	* @param int uid[1] : identifiant image obligatoire
17
	*/
29
	*/
18
	public function getElement($uid)
30
	public function getElement($uid)
19
	{	
31
	{
20
		// uid[0] : utilisateur obligatoire
-
 
21
		// uid[1] : identifiant image obligatoire
-
 
22
 
-
 
23
		// Controle detournement utilisateur
32
		// Controle detournement utilisateur
24
	   	session_start();
33
	   	session_start();
25
	   	$this->controleUtilisateur($uid[0]);
34
	   	$this->controleUtilisateur($uid[0]);
26
 
35
	   	
27
		$id_image_protegee = $this->proteger($uid[1]); 
36
	   	if(!isset($uid[0]) || !isset($uid[1])) {
28
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
37
	   		return;	
-
 
38
	   	}
29
 
39
	   	
30
		$resultat_selection = $this->executerRequete($requete_selection_image);
40
	   	$chercheur_image = new RechercheImage($this->config);
31
		
41
	   	
32
		$image = false;
42
	   	$parametres = array('ordre' => $uid[1]);
33
		
43
	   	
-
 
44
	   	$retour = null;
-
 
45
	   	$image_recherchee = $chercheur_image->rechercherImages($uid[0], $parametres, 0, 1);		
34
		if (count($resultat_selection) > 0) {
46
	   	if(count($image_recherchee) > 0) {
35
			$image = $resultat_selection[0];
47
	   		$retour = $image_recherchee[0];
36
		}
48
	   	}
37
 
-
 
38
		$this->envoyer($image,'text/html','utf-8',true);
49
		$this->envoyer($retour,'application/json','utf-8',true);
39
	}
50
	}
40
 
51
 
41
	/**
52
	/**
42
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
53
	* Méthode appelée avec une requête de type POST avec un identifiant d'image.
43
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
54
	* Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
-
 
55
	* 
-
 
56
	* @param int $uid[0] identifiant utilisateur
-
 
57
	* @param int $uid[1] ordre de l'image relatif à l'utilisateur
-
 
58
	* @param pairs array tableau contenant les valeurs de metadonnées à modifier
44
	*/
59
	*/
45
	public function updateElement($uid,$pairs)
60
	public function updateElement($uid,$pairs)
46
	{
61
	{
47
		// Controle detournement utilisateur
62
		// Controle detournement utilisateur
48
		$this->controleUtilisateur($uid[0]);
63
		$this->controleUtilisateur($uid[0]);
49
		
64
		
-
 
65
		if(count($pairs) == 0 || !isset($uid[1])) {
-
 
66
			return;	
50
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
-
 
51
		
67
		}
52
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
-
 
53
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
-
 
54
 
-
 
55
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
68
		
56
 
69
		$gestionnaire_image = new GestionImage($this->config);
57
		$resultat_mise_a_jour = $this->executerRequeteSimple($requete_mise_a_jour_image);
-
 
58
		
70
		$resultat_mise_a_jour = $gestionnaire_image->modifierImage($uid[0],$uid[1],$pairs);
59
		$retour = false;
71
		
60
		
72
		$retour = false;
61
		if ($resultat_mise_a_jour) {
73
		if ($resultat_mise_a_jour) {
62
			$retour = 'OK';
74
			$retour = 'OK';
63
		}
75
		}
64
		
76
		
65
		$this->envoyer($retour);
77
		$this->envoyer($retour);
66
	}
78
	}
67
	
79
	
68
	/**
80
	/**
69
	 * Assemble la requete de mise à jour des champs de metadonnées
-
 
70
	 * 
-
 
71
	*/
-
 
72
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
-
 
73
		
-
 
74
		$requete_maj_champs = '';
-
 
75
		
-
 
76
		$champs_a_ignorer = array('ci_ce_observation','ci_id_image');
-
 
77
		
-
 
78
		foreach($valeurs_metadonnees as $champ  => $valeur)
-
 
79
		{
-
 
80
			
-
 
81
			if (!in_array($champ,$champs_a_ignorer)) {
-
 
82
				if ($champ == 'ci_meta_date') {
-
 
83
	
-
 
84
					$date_tab = split('/',$valeur) ;
-
 
85
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
-
 
86
	
-
 
87
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
-
 
88
	
-
 
89
				}
-
 
90
				else {
-
 
91
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
-
 
92
				}
-
 
93
			}
-
 
94
		}
-
 
95
 
-
 
96
		$requete_maj_champs = rtrim($requete_maj_champs," , ") ;
-
 
97
		
-
 
98
		return $requete_maj_champs;
-
 
99
	}
-
 
100
 
-
 
101
 
-
 
102
	/**
-
 
103
	 * Méthode appelée avec une requête de type PUT.
81
	* Méthode appelée avec une requête de type PUT.
104
	 * Stocke une image, crée ses miniatures et enregistre ses informations
82
	* Stocke une image, crée ses miniatures et enregistre ses informations
105
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
83
	* Renvoie l'identifiant d'image nouvellement crée en cas de succès
-
 
84
	* 
-
 
85
	* @param $pairs array tableau contenant les valeurs de metadonnées à ajouter
106
	*/
86
	*/
107
	function createElement($pairs)
87
	function createElement($pairs)
108
	{
88
	{
109
		// Controle detournement utilisateur
89
		// Controle detournement utilisateur
110
		session_start();
90
		session_start();
111
		$this->controleUtilisateur($pairs['identifiant']);
91
		$this->controleUtilisateur($pairs['ce_utilisateur']);
112
				
92
				
113
		foreach ($_FILES as $file) {
93
		foreach ($_FILES as $file) {
114
			$infos_fichier = $file ;
94
			$infos_fichier = $file ;
115
		}
95
		}
-
 
96
		
-
 
97
		$gestionnaire_image = new GestionImage($this->config);
-
 
98
		$id_utilisateur = $pairs['ce_utilisateur'];
116
		
99
		
117
		if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
100
		if ($this->ajouterImage($id_utilisateur, $infos_fichier)) {
118
			
101
			
119
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
102
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
120
			// en quittant directement après l'envoi
103
			// en quittant directement après l'envoi
121
			$this->envoyerMessageCreationEffectuee();
104
			$this->envoyerMessageCreationEffectuee();
122
			exit;
105
			exit;
123
		}
106
		}
124
 
-
 
125
	}
-
 
126
	
-
 
127
	/**
-
 
128
	 * Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
-
 
129
	 * renvoie le nouvel id d'image en cas de succès
-
 
130
	 * 
-
 
131
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
-
 
132
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
-
 
133
	 * élements du tableau $_FILES de php
-
 
134
	*/
-
 
135
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
-
 
136
		
-
 
137
		$identifiant_utilisateur = $pairs['identifiant'];
-
 
138
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($identifiant_utilisateur);
-
 
139
		
-
 
140
		if (!$nouvel_ordre) {
-
 
141
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
-
 
142
			trigger_error($message, E_USER_ERROR);
-
 
143
		}
-
 
144
		
-
 
145
		$extracteur_metadonnees = new ExtracteurMetadonnees();
-
 
146
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
-
 
147
		
-
 
148
		if(!$informations_image) {
-
 
149
			$message = 'Erreur lors de l\'extraction des metadonnées';
-
 
150
			trigger_error($message, E_USER_ERROR);
-
 
151
		}
-
 
152
		
-
 
153
		// ajout de quelques informations supplémentaire, en sus 
-
 
154
		// des metadonnées dejà extraites
-
 
155
		$informations_image['ci_ordre'] = $nouvel_ordre ;
-
 
156
		$informations_image['ci_publiable_eflore'] = 'false' ;
-
 
157
		$informations_image['ci_nom_original'] = $infos_fichier['name'] ;
-
 
158
		
-
 
159
		// le md5 du fichier sert à repérer les images en doublons
-
 
160
		$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
-
 
161
		$informations_image['ci_ce_utilisateur'] = $identifiant_utilisateur ;
-
 
162
		
-
 
163
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
-
 
164
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
-
 
165
 
-
 
166
		if (!$resultat_insertion_infos_image) {
-
 
167
			$message = "Echec de l'insertion dans la base de donnees : " ;
-
 
168
			trigger_error($message, E_USER_ERROR);
-
 
169
        }
-
 
170
 
-
 
171
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($identifiant_utilisateur, $nouvel_ordre);
-
 
172
		
-
 
173
		if (!$id_nouvelle_image)
-
 
174
		{
-
 
175
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
-
 
176
			trigger_error($message, E_USER_ERROR);
-
 
177
		}
-
 
178
		
-
 
179
		$manipulateur_image = new ImageRecreation($this->config);
-
 
180
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);
-
 
181
		
-
 
182
		if (!$fichier_stocke) {
-
 
183
			$message =  'Erreur lors du stockage du fichier' ;
-
 
184
			trigger_error($message, E_USER_ERROR);
-
 
185
		}
-
 
186
		
-
 
187
		return $id_nouvelle_image;
-
 
188
	}
-
 
189
	
-
 
190
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
-
 
191
 
-
 
192
		$nouvel_ordre = 0 ;
-
 
193
		
-
 
194
		$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;
-
 
195
		$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);
-
 
196
				
-
 
197
		if($resultat_requete_ordre_max) {
-
 
198
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
-
 
199
			$nouvel_ordre++;
-
 
200
		}
-
 
201
		
-
 
202
		return $nouvel_ordre;
-
 
203
	}
-
 
204
	
-
 
205
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
-
 
206
		
-
 
207
		$id_image = false;
-
 
208
		
-
 
209
		$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;
-
 
210
		$resultat_id_image = $this->executerRequete($requete_id_image);
-
 
211
 
-
 
212
        if (count($resultat_id_image) > 0)
-
 
213
		{
-
 
214
			$id_image = $resultat_id_image[0]['ci_id_image'];
-
 
215
        }
-
 
216
		
-
 
217
        return $id_image;
-
 
218
	}
-
 
219
	
-
 
220
	private function construireRequeteInsertionImage($informations_image) {
-
 
221
		
-
 
222
		$requete_insertion_image = "INSERT INTO cel_images ";
-
 
223
		
-
 
224
		$champs_a_inserer = '' ;
-
 
225
		$valeurs_a_inserer = '' ;
-
 
226
 
-
 
227
		foreach ($informations_image as $champ => $valeur)
-
 
228
		{
-
 
229
			$champs_a_inserer .= $champ.',' ;
-
 
230
 
-
 
231
			if (is_null($valeur))
-
 
232
			{
-
 
233
				$valeurs_a_inserer .= 'NULL,' ;
-
 
234
			}
-
 
235
			else
-
 
236
			{
-
 
237
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
-
 
238
			}
-
 
239
		}
-
 
240
		
-
 
241
		if ($informations_image['ci_meta_date_time'] != 'NULL') {
-
 
242
			$champs_a_inserer .= 'ci_meta_date, ';
-
 
243
        	$valeurs_a_inserer .= $this->proteger($informations_image['ci_meta_date_time']).',';
-
 
244
		}
-
 
245
 
-
 
246
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
-
 
247
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
-
 
248
 
-
 
249
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
-
 
250
		
-
 
251
		return $requete_insertion_image;
-
 
252
	}
107
	}
253
	
108
	
254
	private function envoyerMessageCreationEffectuee() {
109
	private function envoyerMessageCreationEffectuee() {
255
			
110
			
256
		header('HTTP/1.0 200 Created');
111
		header('HTTP/1.0 200 Created');
257
		echo 'OK';
112
		echo 'OK';
258
		exit() ;
113
		exit() ;
259
	}
114
	}
260
 
115
 
261
	/**
116
	/**
262
	 * Méthode appelée avec une requête de type DELETE.
117
	* Méthode appelée avec une requête de type DELETE.
263
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
118
	* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
-
 
119
	* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
-
 
120
    * 
-
 
121
    * @param int uid[0] id utilisateur
-
 
122
	* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
-
 
123
	* 
264
	*/
124
	*/
265
	function deleteElement($uid){
125
	function deleteElement($uid){
266
 
-
 
267
		// uid[0] : utilisateur obligatoire
-
 
268
		// uid[1] : identifiant image(s) obligatoire(s)
-
 
269
 
126
 
270
	 	// Controle detournement utilisateur
127
	 	// Controle detournement utilisateur
271
	    session_start();
128
	    session_start();
272
		$this->controleUtilisateur($uid[0]);
129
		$this->controleUtilisateur($uid[0]);
273
 
130
 
274
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
131
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
275
			return;
132
			return;
276
		}
133
		}
277
		
134
		
278
		$ids_images = $uid[1];
-
 
279
 
-
 
280
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
-
 
281
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
-
 
282
		
-
 
283
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
-
 
284
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
-
 
285
		
-
 
286
		if (!$resultat_suppression_image) {
-
 
287
			$message =  'Erreur lors de la suppression de l\'image' ;
-
 
288
			trigger_error($message, E_USER_ERROR);
-
 
289
		}
-
 
290
		
-
 
291
		if (!$resultat_suppression_lien_images_obs) {
-
 
292
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
-
 
293
			trigger_error($message, E_USER_ERROR);
-
 
294
		}
135
		$ordres_images = explode(',',$uid[1]);
295
 
-
 
296
		$manipulateur_image = new ImageRecreation($this->config);
-
 
297
		
-
 
298
		$tableau_ids_image = split(',',$ids_images);
-
 
299
		
136
 
300
		foreach($tableau_ids_image as $id_image_a_detruire) {
-
 
301
        	$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
137
	    $gestionnaire_image = new GestionImage($this->config);
302
		}
138
	    $suppression_image = $gestionnaire_image->supprimerImage($uid[0], $ordres_images);
303
 
139
 
304
		$this->envoyer('OK');
140
		$this->envoyer('OK');
305
	}
141
	}
306
	
142
	
307
	private function estUneSuiteIdentifiantsImage($chaine) {
143
	private function estUneSuiteIdentifiantsImage($chaine) {
308
		
144
		
309
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
145
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
310
		// sans virgule terminale
146
		// sans virgule terminale
311
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
147
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
312
		
148
		
313
		return preg_match($reg_exp, $chaine);
-
 
314
		
149
		return preg_match($reg_exp, $chaine);	
315
	}
-
 
316
 
150
	}
317
}
151
}
318
?>
152
?>