Subversion Repositories eFlore/Applications.cel

Rev

Rev 2486 | Rev 3091 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
929 aurelien 1
<?php
2460 jpm 2
// declare(encoding='UTF-8');
929 aurelien 3
/**
2460 jpm 4
 * Classe métier de gestion de l'ajout, modification et suppression des images.
5
 *
6
 * @internal   Mininum PHP version : 5.2
7
 * @category   CEL
8
 * @package    Services
9
 * @subpackage Bibliothèques
10
 * @version    0.1
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
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>
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 */
929 aurelien 18
class GestionImage extends Cel {
2129 jpm 19
 
929 aurelien 20
	/**
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
2129 jpm 23
	*
929 aurelien 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
26
	* élements du tableau $_FILES de php
27
	*/
28
	public function ajouterImage($id_utilisateur, $infos_fichier) {
29
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($id_utilisateur);
2129 jpm 30
 
929 aurelien 31
		$extracteur_metadonnees = new ExtracteurMetadonnees();
32
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
2129 jpm 33
		if (!$informations_image) {
34
			$message = "Erreur lors de l'extraction des metadonnées";
929 aurelien 35
			$this->logger($message);
36
		}
2129 jpm 37
 
38
		// ajout de quelques informations supplémentaire, en sus
929 aurelien 39
		// des metadonnées dejà extraites
40
		$informations_image['ordre'] = $nouvel_ordre ;
2460 jpm 41
		$informations_image['transmission'] = '0' ;
929 aurelien 42
		$informations_image['nom_original'] = $infos_fichier['name'] ;
2129 jpm 43
 
929 aurelien 44
		// le md5 du fichier sert à repérer les images en doublons
45
		$informations_image['md5'] = md5_file($infos_fichier['tmp_name']) ;
2129 jpm 46
 
929 aurelien 47
		$informations_image['ce_utilisateur'] = $id_utilisateur ;
2129 jpm 48
 
49
		$infos_utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
50
 
970 aurelien 51
		$informations_image['courriel_utilisateur'] = $infos_utilisateur['courriel'];
52
		$informations_image['nom_utilisateur'] = $infos_utilisateur['nom'];
53
		$informations_image['prenom_utilisateur'] = $infos_utilisateur['prenom'];
2129 jpm 54
 
2460 jpm 55
		$requete = $this->construireRequeteInsertionImage($informations_image);
56
		$resultat_insertion_infos_image = Cel::db()->executer($requete);
929 aurelien 57
		if (!$resultat_insertion_infos_image) {
58
			$message = "Echec de l'insertion dans la base de donnees : " ;
59
			$this->logger($message);
2129 jpm 60
		}
929 aurelien 61
 
62
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $nouvel_ordre);
2129 jpm 63
		if (!$id_nouvelle_image) {
64
			$message = "Impossible d'obtenir le nouvel identifiant de l'image";
929 aurelien 65
			$this->logger($message);
66
		}
2129 jpm 67
 
929 aurelien 68
		$manipulateur_image = new ImageRecreation($this->config);
2129 jpm 69
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier, $id_nouvelle_image);
929 aurelien 70
		if (!$fichier_stocke) {
2129 jpm 71
			$message = "Erreur lors du stockage du fichier";
929 aurelien 72
			$this->logger($message);
73
		}
2129 jpm 74
 
929 aurelien 75
		return $id_nouvelle_image;
76
	}
2129 jpm 77
 
929 aurelien 78
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
2129 jpm 79
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
80
		$requete = 'SELECT MAX(ordre) AS max_ordre '.
81
			'FROM cel_images '.
82
			"WHERE ce_utilisateur = $idUtilisateurP ".
83
			' -- '.__FILE__.' : '.__LINE__;
2143 jpm 84
		$resultat = Cel::db()->requeter($requete);
929 aurelien 85
 
2129 jpm 86
		$nouvel_ordre = 0;
87
		if ($resultat !== false) {
88
			$nouvel_ordre = $resultat[0]['max_ordre'];
929 aurelien 89
			$nouvel_ordre++;
2460 jpm 90
		} else {
91
			$message = "Erreur lors du calcul du nouvel ordre de l'image";
92
			$this->logger($message);
929 aurelien 93
		}
94
		return $nouvel_ordre;
95
	}
2129 jpm 96
 
929 aurelien 97
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
98
		$id_image = false;
2129 jpm 99
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
100
		$ordreP = Cel::db()->proteger($ordre);
101
		$requete ='SELECT id_image '.
102
			'FROM cel_images '.
103
			"WHERE ce_utilisateur = $idUtilisateurP ".
104
			"	AND ordre = $ordreP ".
105
			' -- '.__FILE__.' : '.__LINE__;
2143 jpm 106
		$resultat = Cel::db()->requeter($requete);
929 aurelien 107
 
2129 jpm 108
		if (count($resultat) > 0) {
109
			$id_image = $resultat[0]['id_image'];
110
		}
111
		return $id_image;
929 aurelien 112
	}
2129 jpm 113
 
929 aurelien 114
	private function construireRequeteInsertionImage($informations_image) {
2460 jpm 115
		$infos = array(
116
			'date_creation' => 'NOW()',
2486 jpm 117
			'date_modification' => 'NOW()');
2129 jpm 118
		foreach ($informations_image as $champ => $valeur) {
2460 jpm 119
			$infos[$champ] = is_null($valeur) ? 'NULL' : Cel::db()->proteger($valeur);
929 aurelien 120
		}
2460 jpm 121
		$champs = implode(', ', array_keys($infos));
122
		$valeurs = implode(', ', array_values($infos));
929 aurelien 123
 
2460 jpm 124
		$requete = "INSERT INTO cel_images ($champs) ".
125
			"VALUES ($valeurs) ".
126
			' -- '.__FILE__.' : '.__LINE__;
127
		return $requete;
929 aurelien 128
	}
2129 jpm 129
 
929 aurelien 130
	/**
131
	 * Modifie les champs de metadonnées d'une image
2129 jpm 132
	 *
2460 jpm 133
	 * @param array $id_utilisateur identifiant utilisateur
1304 aurelien 134
	 * @param array $id id de l'image
929 aurelien 135
	 * @param array $parametres un taleau contenant des valeurs indexées par les noms de champs de la bdd
136
	 * @return boolean true ou false suivant le succès de l'opération
137
	*/
2460 jpm 138
	public function modifierImage($id_utilisateur, $id_image, $parametres) {
929 aurelien 139
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($parametres);
2460 jpm 140
 
141
		$requete = "UPDATE cel_images SET $champs_a_mettre_a_jour ".
142
			' WHERE id_image = '.Cel::db()->proteger($id_image).
143
			' AND ce_utilisateur = '.Cel::db()->proteger($id_utilisateur).
2129 jpm 144
			' -- '.__FILE__.' : '.__LINE__;
2460 jpm 145
		$resultat = Cel::db()->executer($requete);
146
		return ($resultat !== false);
929 aurelien 147
	}
2129 jpm 148
 
2461 jpm 149
	public function modifierTransmissionParObs($idsObs, $publier) {
150
		$ids_obs_proteges = Cel::db()->proteger($idsObs);
151
		$idsObsConcat = is_array($ids_obs_proteges) ? implode(', ', $ids_obs_proteges) : $ids_obs_proteges;
152
		$etatTransmission = $publier ? 1 : 0;
153
		$dateTransmission = $publier ? 'NOW()' : 'NULL';
154
 
155
		$requete = "UPDATE cel_images ".
156
			"SET transmission = $etatTransmission, date_transmission = $dateTransmission ".
157
			"WHERE ce_observation IN ($idsObsConcat) ".
158
			' -- ' . __FILE__ . ':' . __LINE__;
159
		$resultat = Cel::db()->executer($requete);
160
		return $resultat;
161
	}
162
 
929 aurelien 163
	/**
164
	 * Assemble la requete de mise à jour des champs de metadonnées
2129 jpm 165
	 *
929 aurelien 166
	 * @param array $valeurs_metadonnees un taleau contenant des valeurs indexées par les noms de champs de la bdd
167
	 * @return string une sous chaine sql utilisable dans une requete de type UPPDATE table SET valeur1=champ1 ...
168
	*/
169
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
2486 jpm 170
		$champs_maj = array('date_modification = NOW()');
171
		$champs_a_ignorer = array('id_image', 'date_modification');
2129 jpm 172
		foreach ($valeurs_metadonnees as $champ  => $valeur) {
2486 jpm 173
			if (!in_array($champ, $champs_a_ignorer)) {
174
				if ($champ == 'date_prise_de_vue' && trim($valeur) != '') {
2460 jpm 175
					$date_tab = explode('/', $valeur) ;
929 aurelien 176
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
2486 jpm 177
					$dateP = Cel::db()->proteger($date);
178
					$champs_maj[] = "$champ = $dateP";
2129 jpm 179
				} else {
2486 jpm 180
					$valeurP = Cel::db()->proteger($valeur);
181
					$champs_maj[] = "$champ = $valeurP";
929 aurelien 182
				}
183
			}
184
		}
2486 jpm 185
		return implode(', ', $champs_maj);
929 aurelien 186
	}
2129 jpm 187
 
188
	public function supprimerImageParOrdre($id_utilisateur, $ordre_images) {
189
		if (is_array($ordre_images)) {
2143 jpm 190
			$ordre_images = Cel::db()->proteger($ordre_images);
2129 jpm 191
			$idsImagesP = implode(',', $ordre_images);
929 aurelien 192
		} else {
2129 jpm 193
			$idsImagesP = Cel::db()->proteger($ordre_images);
929 aurelien 194
		}
2129 jpm 195
		$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
196
 
197
		$requete = 'SELECT id_image '.
2449 jpm 198
			'FROM cel_images '.
199
			"WHERE ce_utilisateur = $idUtilisateurP ".
2129 jpm 200
			"AND ordre IN ($idsImagesP) ".
201
			' -- '.__FILE__.' : '.__LINE__;
2143 jpm 202
		$resultats = Cel::db()->requeter($requete);
2129 jpm 203
 
204
		$idsImages = array();
205
		foreach ($resultats as $id_image) {
206
			$idsImages[] = $id_image['id_image'];
1020 aurelien 207
		}
2129 jpm 208
		return $this->supprimerImage($idsImages);
1020 aurelien 209
	}
2129 jpm 210
 
211
	public function supprimerImage($id_image_ou_tableau) {
2048 aurelien 212
		$ids_images_non_protegees = array();
2129 jpm 213
		if (is_array($id_image_ou_tableau)) {
2048 aurelien 214
			$ids_images_non_protegees = $id_image_ou_tableau;
2143 jpm 215
			$id_image_ou_tableau = Cel::db()->proteger($id_image_ou_tableau);
2129 jpm 216
			$chaine_ids_images = implode(',', $id_image_ou_tableau);
1020 aurelien 217
		} else {
2048 aurelien 218
			$ids_images_non_protegees[] = $id_image_ou_tableau;
1765 raphael 219
			$chaine_ids_images = Cel::db()->proteger($id_image_ou_tableau);
1020 aurelien 220
		}
2129 jpm 221
 
222
		$requete = 'DELETE FROM cel_images '.
223
			"WHERE id_image in ($chaine_ids_images) ".
224
			' -- '.__FILE__.' : '.__LINE__;
2143 jpm 225
		$resultat_suppression_image = Cel::db()->executer($requete);
1304 aurelien 226
		if ($resultat_suppression_image === false) {
2129 jpm 227
			$message = "Erreur lors de la suppression de l'image" ;
929 aurelien 228
			$this->logger($message);
229
		}
2129 jpm 230
 
231
		$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'images');
232
		$resultat_suppression_lien_images_mots_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_images_non_protegees);
1304 aurelien 233
		if (!$resultat_suppression_lien_images_mots_cles === false) {
2129 jpm 234
			$message =  "Erreur lors de la suppression des mots cles associés à l'image" ;
929 aurelien 235
			$this->logger($message);
236
		}
237
 
238
		$manipulateur_image = new ImageRecreation($this->config);
2129 jpm 239
		$tableau_ids_image = explode(',', $chaine_ids_images);
240
		foreach ($tableau_ids_image as $id_image_a_detruire) {
241
			$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire);
929 aurelien 242
		}
243
		return $destruction_fichier_image;
244
	}
2129 jpm 245
 
1470 aurelien 246
	/**
247
	* Fonction utilisée pour importer les anciennes images saisies dans les widget dans un compte identifié
248
	* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie
249
	* @param string $mail_utilisateur
250
	* @param string $id_utilisateur
251
	*/
252
	public function migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur) {
3027 mathias 253
		// ATTENTION : cette fonction suppose que l'utilisateur n'a pas déjà d'images dans le CEL
1470 aurelien 254
		// avec l'identifiant $id_utilisateur ce qui est normalement le cas
2129 jpm 255
		$requete = 'UPDATE cel_images SET '.
256
			'ce_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).', '.
257
			'prenom_utilisateur = '.Cel::db()->proteger($infos_utilisateur['prenom']).', '.
258
			'nom_utilisateur = '.Cel::db()->proteger($infos_utilisateur['nom']).', '.
259
			'courriel_utilisateur = '.Cel::db()->proteger($infos_utilisateur['courriel']).' '.
2459 jpm 260
			'WHERE ce_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' '.
2129 jpm 261
			' -- '.__FILE__.' : '.__LINE__;
262
 
2143 jpm 263
		$migration_releve = Cel::db()->executer($requete);
1470 aurelien 264
		return $migration_releve;
265
	}
2460 jpm 266
}