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