New file |
0,0 → 1,286 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
|
/** |
* PHP Version 5 |
* |
* @category CEL |
* @package jrest |
* @author Aurelien Peronnet <aurelien@tela-botanica.org> |
* @author Jean-Pascal Milcent <jpm@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
|
/** |
* Classe de gestion de l'ajout, modification et suppression des images |
* |
* in=utf8 |
* out=utf8 |
* |
*/ |
class GestionImage extends Cel { |
|
/** |
* Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures, |
* renvoie le nouvel id d'image en cas de succès |
* |
* @param int $id_utilisateur identifiant de l'utilisateur |
* @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les |
* élements du tableau $_FILES de php |
*/ |
public function ajouterImage($id_utilisateur, $infos_fichier) { |
$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($id_utilisateur); |
if (!$nouvel_ordre) { |
$message = "Erreur lors du calcul du nouvel ordre de l'image"; |
$this->logger($message); |
} |
|
$extracteur_metadonnees = new ExtracteurMetadonnees(); |
$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ; |
|
if (!$informations_image) { |
$message = "Erreur lors de l'extraction des metadonnées"; |
$this->logger($message); |
} |
|
// ajout de quelques informations supplémentaire, en sus |
// des metadonnées dejà extraites |
$informations_image['ordre'] = $nouvel_ordre ; |
$informations_image['publiable_eflore'] = 'false' ; |
$informations_image['nom_original'] = $infos_fichier['name'] ; |
|
// le md5 du fichier sert à repérer les images en doublons |
$informations_image['md5'] = md5_file($infos_fichier['tmp_name']) ; |
|
$informations_image['ce_utilisateur'] = $id_utilisateur ; |
|
$infos_utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur); |
|
$informations_image['courriel_utilisateur'] = $infos_utilisateur['courriel']; |
$informations_image['nom_utilisateur'] = $infos_utilisateur['nom']; |
$informations_image['prenom_utilisateur'] = $infos_utilisateur['prenom']; |
|
$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image); |
|
// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes) |
// ce qui est fréquent dans les métadonnées |
// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple |
$resultat_insertion_infos_image = Cel::db()->executer($requete_insertion_infos_image); |
|
if (!$resultat_insertion_infos_image) { |
$message = "Echec de l'insertion dans la base de donnees : " ; |
$this->logger($message); |
} |
|
$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $nouvel_ordre); |
|
if (!$id_nouvelle_image) { |
$message = "Impossible d'obtenir le nouvel identifiant de l'image"; |
$this->logger($message); |
} |
|
$manipulateur_image = new ImageRecreation($this->config); |
$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier, $id_nouvelle_image); |
|
if (!$fichier_stocke) { |
$message = "Erreur lors du stockage du fichier"; |
$this->logger($message); |
} |
|
return $id_nouvelle_image; |
} |
|
private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) { |
$idUtilisateurP = Cel::db()->proteger($id_utilisateur); |
$requete = 'SELECT MAX(ordre) AS max_ordre '. |
'FROM cel_images '. |
"WHERE ce_utilisateur = $idUtilisateurP ". |
' -- '.__FILE__.' : '.__LINE__; |
$resultat = Cel::db()->requeter($requete); |
|
$nouvel_ordre = 0; |
if ($resultat !== false) { |
$nouvel_ordre = $resultat[0]['max_ordre']; |
$nouvel_ordre++; |
} |
return $nouvel_ordre; |
} |
|
private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) { |
$id_image = false; |
$idUtilisateurP = Cel::db()->proteger($id_utilisateur); |
$ordreP = Cel::db()->proteger($ordre); |
$requete ='SELECT id_image '. |
'FROM cel_images '. |
"WHERE ce_utilisateur = $idUtilisateurP ". |
" AND ordre = $ordreP ". |
' -- '.__FILE__.' : '.__LINE__; |
$resultat = Cel::db()->requeter($requete); |
|
if (count($resultat) > 0) { |
$id_image = $resultat[0]['id_image']; |
} |
return $id_image; |
} |
|
private function construireRequeteInsertionImage($informations_image) { |
$requete_insertion_image = "INSERT INTO cel_images "; |
$champs_a_inserer = '' ; |
$valeurs_a_inserer = '' ; |
foreach ($informations_image as $champ => $valeur) { |
$champs_a_inserer .= $champ.',' ; |
|
if (is_null($valeur)) { |
$valeurs_a_inserer .= 'NULL,' ; |
} else { |
$valeurs_a_inserer .= Cel::db()->proteger($valeur).',' ; |
} |
} |
|
$champs_a_inserer .= 'date_modification,' ; |
$valeurs_a_inserer .= '"0000-00-00 00:00:00",' ; |
$champs_a_inserer .= 'date_creation' ; |
$valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ; |
$requete_insertion_image .= "($champs_a_inserer) VALUES ($valeurs_a_inserer)" ; |
$requete_insertion_image .= ' -- '.__FILE__.' : '.__LINE__; |
|
return $requete_insertion_image; |
} |
|
/** |
* Modifie les champs de metadonnées d'une image |
* |
* @param array $utilisateur identifiant utilisateur |
* @param array $id id de l'image |
* @param array $parametres un taleau contenant des valeurs indexées par les noms de champs de la bdd |
* @return boolean true ou false suivant le succès de l'opération |
*/ |
public function modifierImage($utilisateur, $id_image, $parametres) { |
$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ; |
$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($parametres); |
$requete_mise_a_jour_image .= $champs_a_mettre_a_jour; |
$requete_mise_a_jour_image .= ' WHERE id_image = '.Cel::db()->proteger($id_image). |
' AND ce_utilisateur = '.Cel::db()->proteger($utilisateur). |
' -- '.__FILE__.' : '.__LINE__; |
$resultat_mise_a_jour = Cel::db()->executer($requete_mise_a_jour_image); |
return ($resultat_mise_a_jour !== false); |
} |
|
/** |
* Assemble la requete de mise à jour des champs de metadonnées |
* |
* @param array $valeurs_metadonnees un taleau contenant des valeurs indexées par les noms de champs de la bdd |
* @return string une sous chaine sql utilisable dans une requete de type UPPDATE table SET valeur1=champ1 ... |
*/ |
private function construireRequeteMajMetaDonnees($valeurs_metadonnees) { |
$requete_maj_champs = ''; |
$champs_a_ignorer = array('id_image'); |
foreach ($valeurs_metadonnees as $champ => $valeur) { |
if (!in_array($champ,$champs_a_ignorer)) { |
if ($champ == 'date_prise_de_vue' && trim($valeur != "")) { |
$date_tab = explode('/',$valeur) ; |
$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ; |
$requete_maj_champs .= $champ.' = '.Cel::db()->proteger($date).' , ' ; |
} else { |
$requete_maj_champs .= $champ.' = '.Cel::db()->proteger($valeur).' , ' ; |
} |
} |
} |
$requete_maj_champs = rtrim($requete_maj_champs, ' , ') ; |
return $requete_maj_champs; |
} |
|
public function supprimerImageParOrdre($id_utilisateur, $ordre_images) { |
if (is_array($ordre_images)) { |
$ordre_images = Cel::db()->proteger($ordre_images); |
$idsImagesP = implode(',', $ordre_images); |
} else { |
$idsImagesP = Cel::db()->proteger($ordre_images); |
} |
$idUtilisateurP = Cel::db()->proteger($id_utilisateur); |
|
$requete = 'SELECT id_image '. |
'FROM cel_images WHERE '. |
"ce_utilisateur = $idUtilisateurP ". |
"AND ordre IN ($idsImagesP) ". |
' -- '.__FILE__.' : '.__LINE__; |
|
$resultats = Cel::db()->requeter($requete); |
|
$idsImages = array(); |
foreach ($resultats as $id_image) { |
$idsImages[] = $id_image['id_image']; |
} |
|
return $this->supprimerImage($idsImages); |
} |
|
public function supprimerImage($id_image_ou_tableau) { |
$ids_images_non_protegees = array(); |
if (is_array($id_image_ou_tableau)) { |
$ids_images_non_protegees = $id_image_ou_tableau; |
$id_image_ou_tableau = Cel::db()->proteger($id_image_ou_tableau); |
$chaine_ids_images = implode(',', $id_image_ou_tableau); |
} else { |
$ids_images_non_protegees[] = $id_image_ou_tableau; |
$chaine_ids_images = Cel::db()->proteger($id_image_ou_tableau); |
} |
|
$requete = 'DELETE FROM cel_images '. |
"WHERE id_image in ($chaine_ids_images) ". |
' -- '.__FILE__.' : '.__LINE__; |
$resultat_suppression_image = Cel::db()->executer($requete); |
if ($resultat_suppression_image === false) { |
$message = "Erreur lors de la suppression de l'image" ; |
$this->logger($message); |
} |
|
$requete = 'DELETE FROM cel_obs_images '. |
"WHERE id_image in ($chaine_ids_images) ". |
' -- '.__FILE__.' : '.__LINE__; |
$resultat_suppression_lien_images_obs = Cel::db()->executer($requete); |
if ($resultat_suppression_lien_images_obs === false) { |
$message = "Erreur lors de la suppression des observations associées à l'image" ; |
$this->logger($message); |
} |
|
$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'images'); |
$resultat_suppression_lien_images_mots_cles = $gestion_mots_cles->supprimerToutesLiaisonsPourIdsElementsLies($ids_images_non_protegees); |
if (!$resultat_suppression_lien_images_mots_cles === false) { |
$message = "Erreur lors de la suppression des mots cles associés à l'image" ; |
$this->logger($message); |
} |
|
$manipulateur_image = new ImageRecreation($this->config); |
$tableau_ids_image = explode(',', $chaine_ids_images); |
foreach ($tableau_ids_image as $id_image_a_detruire) { |
$destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id_image_a_detruire); |
} |
return $destruction_fichier_image; |
} |
|
/** |
* Fonction utilisée pour importer les anciennes images saisies dans les widget dans un compte identifié |
* Dans ce cas là, le widget remplit la case id_utilisateur par le mail indiqué lors de la saisie |
* @param string $mail_utilisateur |
* @param string $id_utilisateur |
*/ |
public function migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur) { |
// ATTENTION : cette fonction suppose que l'utilisateur n'ai pas déjà d'images dans le CEL |
// avec l'identifiant $id_utilisateur ce qui est normalement le cas |
$requete = 'UPDATE cel_images SET '. |
'ce_utilisateur = '.Cel::db()->proteger($infos_utilisateur['id_utilisateur']).', '. |
'prenom_utilisateur = '.Cel::db()->proteger($infos_utilisateur['prenom']).', '. |
'nom_utilisateur = '.Cel::db()->proteger($infos_utilisateur['nom']).', '. |
'courriel_utilisateur = '.Cel::db()->proteger($infos_utilisateur['courriel']).' '. |
'WHERE ce_utilisateur = '.Cel::db()->proteger($mail_utilisateur).' '. |
' -- '.__FILE__.' : '.__LINE__; |
|
$migration_releve = Cel::db()->executer($requete); |
return $migration_releve; |
} |
} |
?> |