Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2369 → Rev 2370

/trunk/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);