Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 758 Rev 927
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
 
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 {
Line 13... Line 23...
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.
-
 
26
	* Renvoie les infos sur l'image correspondant à l'id passé en parametre
-
 
27
	* @param int uid[0] : utilisateur obligatoire
16
	 * Renvoie les infos sur l'image correspondant à l'id passé en parametre
28
	* @param int uid[1] : identifiant image obligatoire
17
	*/
29
	*/
18
	public function getElement($uid)
30
	public function getElement($uid)
19
	{	
-
 
20
		// uid[0] : utilisateur obligatoire
-
 
21
		// uid[1] : identifiant image obligatoire
-
 
22
 
31
	{
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])) {
-
 
37
	   		return;	
28
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
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]);
-
 
43
	   	
-
 
44
	   	$retour = null;
33
		
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
		}
-
 
37
 
48
	   	}
38
		$this->envoyer($image,'text/html','utf-8',true);
49
		$this->envoyer($retour,'application/json','utf-8',true);
Line 39... Line 50...
39
	}
50
	}
40
 
51
 
41
	/**
52
	/**
-
 
53
	* Méthode appelée avec une requête de type POST avec un identifiant d'image.
-
 
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
42
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
57
	* @param int $uid[1] ordre de l'image relatif à l'utilisateur
43
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
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
	{
Line 47... Line 62...
47
		// Controle detournement utilisateur
62
		// Controle detournement utilisateur
-
 
63
		$this->controleUtilisateur($uid[0]);
-
 
64
		
Line 48... Line -...
48
		$this->controleUtilisateur($uid[0]);
-
 
49
		
65
		if(count($pairs) == 0 || !isset($uid[1])) {
50
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
-
 
51
		
-
 
52
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
-
 
53
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
66
			return;	
Line 54... Line 67...
54
 
67
		}
55
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
-
 
56
 
68
		
57
		$resultat_mise_a_jour = $this->executerRequeteSimple($requete_mise_a_jour_image);
69
		$gestionnaire_image = new GestionImage($this->config);
58
		
70
		$resultat_mise_a_jour = $gestionnaire_image->modifierImage($uid[0],$uid[1],$pairs);
Line 59... Line 71...
59
		$retour = false;
71
		
60
		
72
		$retour = false;
Line 61... Line 73...
61
		if ($resultat_mise_a_jour) {
73
		if ($resultat_mise_a_jour) {
62
			$retour = 'OK';
-
 
63
		}
-
 
64
		
-
 
65
		$this->envoyer($retour);
-
 
66
	}
-
 
67
	
-
 
68
	/**
-
 
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," , ") ;
74
			$retour = 'OK';
97
		
75
		}
98
		return $requete_maj_champs;
76
		
-
 
77
		$this->envoyer($retour);
-
 
78
	}
99
	}
79
	
100
 
80
	/**
101
 
81
	* Méthode appelée avec une requête de type PUT.
102
	/**
82
	* Stocke une image, crée ses miniatures et enregistre ses informations
103
	 * Méthode appelée avec une requête de type PUT.
83
	* Renvoie l'identifiant d'image nouvellement crée en cas de succès
104
	 * Stocke une image, crée ses miniatures et enregistre ses informations
84
	* 
Line 105... Line 85...
105
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
85
	* @param $pairs array tableau contenant les valeurs de metadonnées à ajouter
106
	*/
86
	*/
107
	function createElement($pairs)
87
	function createElement($pairs)
Line -... Line 88...
-
 
88
	{
-
 
89
		// Controle detournement utilisateur
-
 
90
		session_start();
108
	{
91
		$this->controleUtilisateur($pairs['ce_utilisateur']);
Line 109... Line 92...
109
		// Controle detournement utilisateur
92
				
110
		session_start();
93
		foreach ($_FILES as $file) {
111
		$this->controleUtilisateur($pairs['identifiant']);
94
			$infos_fichier = $file ;
112
				
95
		}
113
		foreach ($_FILES as $file) {
96
		
114
			$infos_fichier = $file ;
-
 
115
		}
-
 
116
		
-
 
117
		if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
-
 
118
			
-
 
119
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
-
 
120
			// en quittant directement après l'envoi
-
 
121
			$this->envoyerMessageCreationEffectuee();
-
 
122
			exit;
-
 
123
		}
-
 
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, ';
97
		$gestionnaire_image = new GestionImage($this->config);
Line 243... Line 98...
243
        	$valeurs_a_inserer .= $this->proteger($informations_image['ci_meta_date_time']).',';
98
		$id_utilisateur = $pairs['ce_utilisateur'];
Line 244... Line 99...
244
		}
99
		
245
 
100
		if ($this->ajouterImage($id_utilisateur, $infos_fichier)) {
246
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
101
			
247
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
102
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
Line 248... Line 103...
248
 
103
			// en quittant directement après l'envoi
249
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
104
			$this->envoyerMessageCreationEffectuee();
250
		
105
			exit;
-
 
106
		}
-
 
107
	}
-
 
108
	
-
 
109
	private function envoyerMessageCreationEffectuee() {
-
 
110
			
251
		return $requete_insertion_image;
111
		header('HTTP/1.0 200 Created');
252
	}
112
		echo 'OK';
Line 253... Line -...
253
	
-
 
254
	private function envoyerMessageCreationEffectuee() {
-
 
255
			
-
 
256
		header('HTTP/1.0 200 Created');
113
		exit() ;
257
		echo 'OK';
114
	}
258
		exit() ;
115
 
Line 259... Line 116...
259
	}
116
	/**
260
 
117
	* Méthode appelée avec une requête de type DELETE.
261
	/**
118
	* Supprime les infos sur l'image et le fichier correspondant à l'ordre passé en parametre
Line 262... Line 119...
262
	 * Méthode appelée avec une requête de type DELETE.
119
	* Supporte la suppression multiple en passant plusieurs numéros séparés par des virgules
Line 263... Line -...
263
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
-
 
264
	*/
-
 
265
	function deleteElement($uid){
-
 
266
 
-
 
267
		// uid[0] : utilisateur obligatoire
-
 
268
		// uid[1] : identifiant image(s) obligatoire(s)
-
 
269
 
-
 
270
	 	// Controle detournement utilisateur
-
 
271
	    session_start();
-
 
272
		$this->controleUtilisateur($uid[0]);
-
 
273
 
-
 
274
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
-
 
275
			return;
-
 
276
		}
-
 
277
		
-
 
278
		$ids_images = $uid[1];
-
 
279
 
120
    * 
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);
121
    * @param int uid[0] id utilisateur
285
		
-
 
Line 286... Line 122...
286
		if (!$resultat_suppression_image) {
122
	* @param string uid[1] : ordre(s) image(s) obligatoire(s) séparés par des virgules
287
			$message =  'Erreur lors de la suppression de l\'image' ;
123
	* 
Line 288... Line 124...
288
			trigger_error($message, E_USER_ERROR);
124
	*/
Line 289... Line 125...
289
		}
125
	function deleteElement($uid){
290
		
126
 
291
		if (!$resultat_suppression_lien_images_obs) {
127
	 	// Controle detournement utilisateur
Line 292... Line 128...
292
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
128
	    session_start();
293
			trigger_error($message, E_USER_ERROR);
-
 
294
		}
129
		$this->controleUtilisateur($uid[0]);
295
 
-
 
296
		$manipulateur_image = new ImageRecreation($this->config);
130
 
297
		
131
		if (!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
298
		$tableau_ids_image = split(',',$ids_images);
132
			return;