Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2385 → Rev 2386

/branches/v2.6-greffoir/jrest/services/CelWidgetSaisie.php
22,7 → 22,7
private $tagsImg = null;
private $champsEtendusObs = null;
private $utilisateur_id = null;
const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 * 2 = 172 800
const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 = 86 400 (1 journée)
const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
 
private $correspondanceIdImgTags = array();
39,10 → 39,10
// Traitements des tags multiples de projet
$this->traiterProjetTags();
 
// Traitement des tags spécifique aux obs
// Traitement des tags spécifiques aux obs
$this->traiterTagObs($requeteDonnees);
 
// Traitement des tags spécifique aux images
// Traitement des tags spécifiques aux images
$this->traiterTagImg($requeteDonnees);
 
// Traitement des observations et des images
51,9 → 51,12
$utilisateur = $requeteDonnees['utilisateur'];
if (array_key_exists('courriel', $utilisateur)) {
// début transaction car si insertions par le même utilisateur en parallèle,
// le getMaxOrdre et le INSERT sont en concurrence et risquent de foirer
// le getMaxOrdre et le INSERT sont en concurrence et risquent de foirer.
// De plus, ça permet de ne pas conserver les données d'obs si l'image provoque une erreur
//Cel::db()->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
Cel::db()->beginTransaction();
$erreursDurantTraitement = false;
$nomsOriginauxImagesTemp = array();
 
$this->debug[] = 'Courriel : '.$utilisateur['courriel'];
$utilisateur = $this->affecterChampsManquantsUtilisateur($utilisateur);
112,6 → 115,11
$imgAAjouter = null;
if (!empty($obs['image_nom'])) {
$imgAAjouter = $this->traiterImagesALierAObs($id_utilisateur, $ordreObs, $obs);
if ($imgAAjouter != null) {
foreach ($imgAAjouter as $uneImgAAjouter) {
$nomsOriginauxImagesTemp[] = $uneImgAAjouter['nom'];
}
}
}
 
if(!trim($courriel) && !trim($id_utilisateur)) {
143,6 → 151,7
$requete = "INSERT INTO cel_obs ($champs) VALUES ($valeurs) ";
 
if (Cel::db()->executer($requete) === false) {
$erreursDurantTraitement = true;
$this->messages[] = "Un problème est survenu lors de l'insertion de l'obs dans la base de données.";
} else {
$obs_a_taguer_ordres[] = trim($obs['ordre'], "'");
155,8 → 164,13
if ($img != null) {
$this->nettoyerImagesUploades();
$img_a_taguer_ids = $this->stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur);
$cmd = sprintf($this->config['cel']['commande_script_images'],implode(',', $img_a_taguer_ids));
pclose(popen($cmd,"r"));
if ($img_a_taguer_ids === false) {
$erreursDurantTraitement = true;
$this->messages[] = "Au moins une des images n'a pas pu être enregistrée.";
} else {
$cmd = sprintf($this->config['cel']['commande_script_images'],implode(',', $img_a_taguer_ids));
pclose(popen($cmd,"r"));
}
}
}
 
165,14 → 179,31
 
$obs_a_taguer_ids = $this->obtenirIdsObsPourTableauOrdres($this->utilisateur_id, $obs_a_taguer_ordres);
$this->taguerObs($obs_a_taguer_ids);
$this->taguerImg($img_a_taguer_ids);
if ($img_a_taguer_ids !== false) {
$this->taguerImg($img_a_taguer_ids);
}
 
// Les champs taggés sont des champs supplémentaires stockés sous forme de clé => valeur
$this->ajouterChampsEtendusObs($obs_a_taguer_ids, $this->champsEtendusObs);
} else {
$erreursDurantTraitement = true;
$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré.";
}
Cel::db()->commit();
// Fin de la transaction - on considère que commit() et rollback() ne ratent jamais
if ($erreursDurantTraitement === false) {
// Suppression des fichiers images temporaires
$this->nettoyerImagesUploades($nomsOriginauxImagesTemp);
Cel::db()->commit();
} else {
// On annule l'écriture des images enregistrées sur le disque dur - la transaction
// se charge de les retirer de la base de données
if ($img_a_taguer_ids !== false) {
foreach ($img_a_taguer_ids as $idImageASupprimer) {
$this->effacerImageDuDd($idImageASupprimer);
}
}
Cel::db()->rollBack();
}
} else {
$this->messages[] = "L'identifiant de l'utilisateur (courriel) n'a pas été transmis.";
}
185,7 → 216,12
if (count($this->messages) > 0) {
$this->debug[] = print_r($this->messages, true);
}
$msg = (count($this->messages) > 0) ? 'erreur' : 'ok';
if (count($this->messages) > 0) {
$msg = 'erreur';
$idNouvelleObs = null;
} else {
$msg = 'ok';
}
$retour = (object) array('msg' => $msg, 'id' => $idNouvelleObs);
$this->envoyerJson($retour);
exit;
285,7 → 321,7
return $imgAAjouter;
}
 
private function stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur) {
protected function stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur) {
$img_a_taguer_ids = array();
if (!isset($img['nom']) && is_array($img)) {
foreach ($img as $index => $image) {
306,6 → 342,15
$this->correspondanceIdImgTags[$idImg] = $image['tags'];
}
}
} else {
// L'image n'a pas pu être écrite.
// On annule l'écriture des précédentes et on s'arrête là - la transaction
// se chargera de les retirer de la base de données
foreach ($img_a_taguer_ids as $idImageASupprimer) {
$this->effacerImageDuDd($idImageASupprimer);
}
$img_a_taguer_ids = false;
break;
}
}
} else {
326,6 → 371,9
$this->correspondanceIdImgTags[$idImg] = $img['tags'];
}
}
} else {
// L'image n'a pas pu être écrite
$img_a_taguer_ids = false;
}
}
 
538,21 → 586,35
return $ids;
}
 
public function nettoyerImagesUploades() {
/**
* Supprime toutes les images temporaires dont :
* - l'ancienneté est supérieure à DUREE_DE_VIE_IMG (si $nomsDeFichiers vaut false, par défaut)
* - le nom correspond à un des éléments du tableau $nomsDeFichiers (s'il est spécifié et non vide)
*/
protected function nettoyerImagesUploades($nomsDeFichiers=false) {
// mode de suppression
$suppressionParNom = (is_array($nomsDeFichiers) && count($nomsDeFichiers > 0));
 
$dossierStockage = $this->config['cel']['chemin_stockage_temp'].'/';
if (is_dir($dossierStockage)) {
$objets = scandir($dossierStockage);
if ($objets !== false) {
if (is_array($objets)) {
foreach ($objets as $objet) {
$chemin = $dossierStockage.$objet;
$chemin = $dossierStockage . $objet;
if (is_file($chemin)) {
$filemtime = @filemtime($chemin);
if ($filemtime !== false) {
$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_IMG) ? true : false;
if ($suppression === true) {
unlink($chemin);
// critère de suppression
if ($suppressionParNom) {
$suppression = in_array($objet, $nomsDeFichiers);
} else {
$filemtime = @filemtime($chemin);
if ($filemtime !== false) {
$suppression = (time() - $filemtime >= self::DUREE_DE_VIE_IMG) ? true : false;
}
}
// suppression
if ($suppression === true) {
unlink($chemin);
}
}
}
}
592,7 → 654,9
$idImage = $this->obtenirIdImagePourIdentifiantEtOrdre($idUtilisateur, $nouvelOrdre);
if ($idImage !== false) {
$manipulateurImage = new ImageRecreation($this->config);
$stockageOk = $manipulateurImage->stockerFichierOriginal($cheminImage, $idImage);
// Stocke le fichier en conservant les fichiers temporaires, ce qui permet de réessayer
// de les traiter en cas d'échec de la totalité du processus de traitement de l'obs
$stockageOk = $manipulateurImage->stockerFichierOriginal($cheminImage, $idImage, true);
if ($stockageOk) {
$miniatureChemin = str_replace('.jpg', '_min.jpg', $cheminImage);
if (file_exists($miniatureChemin)) {
622,6 → 686,20
return $idImage;
}
 
/**
* Supprime une image du disque dur. Ne touche pas à la base de données, on considère
* que c'est le rôle de la transaction d'annuler les écritures en cas de problème
*
* @param Integer $idImageASupprimer
* @return boolean $ok true si la suppression s'est bien passée, false s'il reste au moins un fichier
*/
protected function effacerImageDuDd($idImageASupprimer) {
$manipulateurImage = new ImageRecreation($this->config);
$ok = $manipulateurImage->detruireImageSurDisque($idImageASupprimer);
 
return $ok;
}
 
private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
$id_utilisateur = Cel::db()->proteger($id_utilisateur);
 
/branches/v2.6-greffoir/jrest/lib/Cel.php
183,13 → 183,14
 
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) {
// Traitements des messages d'erreurs et données
$sortie = $donnees;
if (count($this->messages) != 0) {
http_response_code(500);// Internal Server Error
$code_http = 500; // Internal Server Error
$mime = 'application/json';
$json = true;
$sortie = $this->messages;
$donnees->cause = $this->messages;
} else {
$sortie = $donnees;
$code_http = 200; // OK
if (is_null($donnees)) {
$sortie = 'OK';
}
201,7 → 202,7
// Encodage au format et JSON et envoie sur la sortie standard
$contenu = $json ? json_encode($sortie) : $sortie;
 
$this->envoyerContenu($encodage, $mime, $contenu);
$this->envoyerContenu($encodage, $mime, $contenu, $code_http);
}
 
private function envoyerDebogage() {
218,13 → 219,13
}
}
 
private function envoyerContenu($encodage, $mime, $contenu) {
private function envoyerContenu($encodage, $mime, $contenu, $code_http=200) {
if (!is_null($mime) && !is_null($encodage)) {
header("Content-Type: $mime; charset=$encodage");
} else if (!is_null($mime) && is_null($encodage)) {
header("Content-Type: $mime");
}
http_response_code(200);// OK
http_response_code($code_http);
print $contenu;
}
 
/branches/v2.6-greffoir/jrest/lib/ImageRecreation.php
147,8 → 147,18
 
return $image_redimensionnee;
}
public function stockerFichierOriginal($fichier, $id) {
 
/**
* Déplace une image temporaire uploadée vers le répertoire de stockage d'images,
* en enregistrant les métadonnées et tout le tintouin.
* Si $conserverFichiersTemporaires vaut true, l'image est copiée et non déplacée.
*
* @param unknown $fichier
* @param unknown $id
* @param unknown $conserverFichiersTemporaires
* @return Ambigous <multitype:, boolean>|boolean
*/
public function stockerFichierOriginal($fichier, $id, $conserverFichiersTemporaires=false) {
$chemin_fichier_origine = is_array($fichier) ? $fichier['tmp_name'] : $fichier;
$chemin_base_fichier = $this->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, 'O');
156,7 → 166,7
$chemin_fichier = $chemin_base_fichier.'/'.$nom_fichier;
$deplacement_fichier = $this->stockerImageExterne($chemin_fichier_origine, $chemin_fichier);
$deplacement_fichier = $this->stockerImageExterne($chemin_fichier_origine, $chemin_fichier, $conserverFichiersTemporaires);
if ($deplacement_fichier) {
$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_fichier);
310,11 → 320,25
return $image_redimensionnee;
}
 
public function stockerImageExterne($chemin_fichier_temp, $chemin_destination) {
if (is_uploaded_file($chemin_fichier_temp)) {
$deplacement = move_uploaded_file($chemin_fichier_temp, $chemin_destination);
/**
* Déplace un fichier temporaire vers une destination donnée. Si
* $conserverFichiersTemporaires vaut true, le fichier est copié et non déplacé.
*
* @param unknown $chemin_fichier_temp
* @param unknown $chemin_destination
* @param string $conserverFichiersTemporaires
* @return boolean
*/
public function stockerImageExterne($chemin_fichier_temp, $chemin_destination, $conserverFichiersTemporaires=false) {
if ($conserverFichiersTemporaires === true) {
// copie du fichier
$deplacement = copy($chemin_fichier_temp, $chemin_destination);
} else {
$deplacement = rename($chemin_fichier_temp, $chemin_destination);
if (is_uploaded_file($chemin_fichier_temp)) {
$deplacement = move_uploaded_file($chemin_fichier_temp, $chemin_destination);
} else {
$deplacement = rename($chemin_fichier_temp, $chemin_destination);
}
}
 
return $deplacement;
500,24 → 524,26
imagedestroy($image);
}
 
/**
* Supprime une image du disque, ainsi que tous les formats générés
*
* @param Integer $id
* @return boolean true si tous les formats y compris l'original ont été détruits, false s'il en reste au moins un
*/
public function detruireImageSurDisque($id) {
$formats = $this->getFormats();
 
// on detruit aussi l'image originale
$formats[] = 'O';
 
$destruction_formats_fichier = false;
 
// destructions de chacuns des formats définis
$destruction_formats_fichier = true;
// destructions de chacun des formats définis
foreach($formats as $format) {
 
$dossier_format = $this->obtenirDossierPourFormat($id, $format);
$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
 
if (file_exists($dossier_format.'/'.$nom_fichier)) {
$destruction_formats_fichier = unlink($dossier_format.'/'.$nom_fichier);
} else {
$destruction_formats_fichier = true;
$detruit = unlink($dossier_format.'/'.$nom_fichier);
$destruction_formats_fichier = ($destruction_formats_fichier && $detruit);
}
}
 
/branches/v2.6-greffoir/jrest
Property changes:
Modified: svn:mergeinfo
Merged /trunk/jrest:r2370
/branches/v2.6-greffoir/.
Property changes:
Modified: svn:mergeinfo
Merged /trunk:r2370