17,67 → 17,90 |
class CelWidgetSaisie extends CelMotCle { |
|
private $projet = null; |
private $tagsObs = null; |
private $tagsImg = null; |
private $utilisateur_id = null; |
const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 * 2 = 172 800 |
const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur |
|
public function getElement($params) { |
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Projets coopératifs', self::OBS_RACINE_ID.'.projets-cooperatifs', self::OBS_RACINE_ID); |
//$resultat[] = $this->ajouterMotCleObs('jpm@clapas.org', 'Biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs.biodiversite34', self::OBS_RACINE_ID.'.projets-cooperatifs'); |
//$this->envoyerJson($resultat); |
} |
|
public function createElement($requeteDonnees) { |
if (array_key_exists('projet', $requeteDonnees)) { |
if (self::ARRET_SERVICE) { |
$this->messages[] = "Désactivation temporaire du service d'envoi des données au CEL."; |
} else if (array_key_exists('projet', $requeteDonnees)) { |
$this->debug[] = 'Projet : ok'; |
$this->projet = $requeteDonnees['projet']; |
if (array_key_exists('tag-obs', $requeteDonnees) && $requeteDonnees['tag-obs'] != '') { |
$this->tagsObs = explode(',', $requeteDonnees['tag-obs']); |
} |
$this->tagsObs[] = 'Projets coopératifs>'.$this->projet; |
if (array_key_exists('tag-img', $requeteDonnees) && $requeteDonnees['tag-img'] != '') { |
$this->tagsImg = explode(',', $requeteDonnees['tag-img']); |
} |
$this->tagsImg[] = 'Projets coopératifs>'.$this->projet; |
if (array_key_exists('utilisateur', $requeteDonnees)) { |
$this->debug[] = 'Utilisateur : ok'; |
$utilisateur = $requeteDonnees['utilisateur']; |
if (array_key_exists('courriel', $utilisateur)) { |
$this->debug[] = 'Courriel : ok'; |
$utilisateur = $this->affecterChampsManquantsUtilisateur($utilisateur); |
extract($utilisateur); |
$this->utilisateur_id = $courriel; |
$ordre = $this->getMaxOrdre($courriel); |
$this->utilisateur_id = $id_utilisateur; |
$ordre = $this->getMaxOrdre($id_utilisateur); |
if (!is_null($ordre)) { |
$this->debug[] = 'Ordre : ok'; |
$requeteDonnees = $this->supprimerSlashesProfond($requeteDonnees); |
|
// Triage et manipulation des données |
$observations = array(); |
foreach ($requeteDonnees as $cle => $obs) { |
if (preg_match('/^obsId[0-9]+$/', $cle)) { |
$idObs = $ordre++; |
$ordreObs = $ordre++; |
|
$this->debug[] = 'commune_nom : '.$obs['commune_nom']; |
$this->debug[] = 'commune_code_insee : '.$obs['commune_code_insee']; |
|
$obsAAjouter = array(); |
$obsAAjouter['identifiant'] = $courriel; |
$obsAAjouter['ce_utilisateur'] = $id_utilisateur; |
$obsAAjouter['courriel_utilisateur'] = $courriel; |
$obsAAjouter['prenom_utilisateur'] = $prenom; |
$obsAAjouter['nom_utilisateur'] = $nom; |
$obsAAjouter['ordre'] = $idObs; |
$obsAAjouter['ordre'] = $ordreObs; |
|
$obsAAjouter['nom_sel'] = $obs['nom_sel']; |
$obsAAjouter['num_nom_sel'] = $obs['num_nom_sel']; |
$obsAAjouter['nom_ret'] = $obs['nom_ret']; |
$obsAAjouter['num_nom_ret'] = $obs['num_nom_ret']; |
$obsAAjouter['num_taxon'] = $obs['num_taxon']; |
$obsAAjouter['famille'] = $obs['famille']; |
$obsAAjouter['nom_sel_nn'] = isset($obs['num_nom_sel']) ? $obs['num_nom_sel'] : null; |
$obsAAjouter['nom_ret'] = isset($obs['nom_ret']) ? $obs['nom_ret'] : null; |
$obsAAjouter['nom_ret_nn'] = isset($obs['num_nom_ret']) ? $obs['num_nom_ret'] : null; |
$obsAAjouter['nt'] = isset($obs['num_taxon']) ? $obs['num_taxon'] : null; |
$obsAAjouter['famille'] = isset($obs['famille']) ? $obs['famille'] : null; |
$obsAAjouter['nom_referentiel'] = isset($obs['referentiel']) ? $obs['referentiel'] : null; |
|
$obsAAjouter['date_observation'] = $this->transormerDateFrVersMysql($obs['date']); |
$obsAAjouter['commentaire'] = $obs['notes']; |
|
$obsAAjouter['zone_geo'] = $obs['commune_nom']; |
$obsAAjouter['ce_zone_geo'] = 'INSEE-C:'.$obs['commune_code_insee']; |
$obsAAjouter['lieudit'] = isset($obs['lieudit']) ? $obs['lieudit'] : null; |
$obsAAjouter['station'] = isset($obs['station']) ? $obs['station'] : null; |
$obsAAjouter['milieu'] = $obs['milieu']; |
$obsAAjouter['commentaire'] = $obs['notes']; |
$obsAAjouter['latitude'] = $obs['latitude']; |
$obsAAjouter['longitude'] = $obs['longitude']; |
$obsAAjouter['geodatum'] = 'WGS84'; |
|
$obsAAjouter['transmission'] = '1'; |
$obsAAjouter['date_creation'] = date('Y-m-d H:i:s'); |
$obsAAjouter['date_transmission'] = date('Y-m-d H:i:s'); |
$obsAAjouter['coord_x'] = $obs['latitude']; |
$obsAAjouter['coord_y'] = $obs['longitude']; |
$obsAAjouter['location'] = $obs['commune_nom']; |
$obsAAjouter['id_location'] = substr($obs['commune_code_insee'], 0, 2); |
$obsAAjouter['ref_geo'] = 'WGS84'; |
$obsAAjouter['date_modification'] = $obsAAjouter['date_creation']; |
$obsAAjouter['date_transmission'] = $obsAAjouter['date_creation']; |
|
$imgAAjouter = null; |
if (!empty($obs['image_nom'])) { |
$imgAAjouter = array(); |
$imgAAjouter['id_utilisateur'] = $courriel; |
$imgAAjouter['id_obs'] = $idObs; |
$imgAAjouter['id_utilisateur'] = $id_utilisateur; |
$imgAAjouter['id_obs'] = $ordreObs; |
$imgAAjouter['nom'] = $obs['image_nom']; |
$imgAAjouter['b64'] = $obs['image_b64']; |
$this->debug[] = 'Contient B64 : '.(empty($obs['image_b64']) ? 'non' : 'oui'); |
} |
|
$observations[$idObs] = array( |
$observations[$ordreObs] = array( |
'obs' => $this->protegerTableau($obsAAjouter), |
'img' => $imgAAjouter); |
} |
85,50 → 108,45 |
$this->debug[] = 'Nbre obs ajoutée : '.count($observations); |
|
// Insertion dans la base |
$ok = true; |
$obs_a_lier = array(); |
$obs_a_taguer_ordres = array(); |
$img_a_taguer_ids = array(); |
foreach ($observations as $infos) { |
$obs = $infos['obs']; |
$img = $infos['img']; |
|
$champs = implode(', ', array_keys($obs)); |
$valeurs = implode(', ', $obs); |
$requete = "INSERT INTO cel_obs ($champs) VALUES ($valeurs) "; |
|
if ($this->executerRequeteSimple($requete) === false) { |
$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'], "'"); |
} |
|
// si le formulaire contient une image on la traite |
if ($img != null) { |
$this->nettoyerImagesUploades(); |
$nomFichierImg = $this->traiterNomFichierImage($img['nom']); |
$cheminImage = $this->config['cel']['chemin_stockage_temp']."/$nomFichierImg"; |
// Si l'image est transmise en base 64 |
if (empty($img['b64']) === false) { |
$this->transformerBase64enFichier($nomFichierImg, $img['b64']); |
$this->transformerBase64enFichier($cheminImage, $img['b64']); |
} |
$cheminImage = $this->config['cel_db']['chemin_stockage_temp']."/$nomFichierImg"; |
$idImg = $this->ajouterImageSurDdEtBdd($img['id_utilisateur'], $cheminImage); |
|
$this->debug[] = 'Nom fichier img debut :'.$nomFichierImg; |
$idImg = $this->ajouterImageSurDdEtBdd($img['id_utilisateur'], $cheminImage, $nomFichierImg); |
if ($idImg !== false) { |
$this->lierObsEtImg($idImg, $img['id_utilisateur'], $img['id_obs']); |
$liaisonOk = $this->lierObsEtImg($idImg, $id_utilisateur, $img['id_obs']); |
if ($liaisonOk === true) { |
$img_a_taguer_ids[] = $idImg; |
} |
} |
|
|
$insert = "INSERT INTO cel_inventory "; |
$champs = '('.implode(', ', array_keys($obs)).') '; |
$values = 'VALUES ('.implode(', ', $obs).') '; |
$requete = $insert.$champs.$values; |
|
if ($this->executerRequeteSimple($requete) === false) { |
$ok = false; |
} else { |
$obs_ok[] = trim($obs['ordre'], "'"); |
} |
} |
|
if ($ok === true) { |
$this->debug[] = print_r($obs_ok, true); |
$liaison_ok = $this->lierObsAMotsCles($obs_ok); |
if ($liaison_ok === false) { |
$e = "Toutes les observations n'ont pas pu être liées au mot-clé du projet."; |
$this->messages[] = $e; |
} |
//$this->taguerObs($obs_a_taguer_ordres); |
//$this->taguerImg($img_a_taguer_ids); |
} else { |
$this->messages[] = "Un problème est survenu lors de l'insertion dans la base de données."; |
} |
} else { |
$this->messages[] = "Un nouveau numéro d'ordre d'observation n'a pu être généré."; |
} |
} else { |
146,12 → 164,31 |
$this->envoyerJson($retour); |
} |
|
private function getMaxOrdre($identifiant) { |
private function affecterChampsManquantsUtilisateur($utilisateur) { |
if(!isset($utilisateur['id_utilisateur']) || trim($utilisateur['id_utilisateur']) == '') { |
$gestion_utilisateur = new User($this->config); |
$infos_complementaires = $gestion_utilisateur->obtenirUtilisateurSiExiste($utilisateur['courriel']); |
$utilisateur['id_utilisateur'] = $infos_complementaires['id_utilisateur']; |
$utilisateur['prenom'] = trim($infos_complementaires['prenom']) != '' ? $infos_complementaires['prenom'] : $utilisateur['prenom']; |
$utilisateur['nom'] = trim($infos_complementaires['nom']) != '' ? $infos_complementaires['nom'] : $utilisateur['nom']; |
} |
|
return $utilisateur; |
} |
|
private function supprimerSlashesProfond($valeur) { |
$valeur = is_array($valeur) ? array_map(array($this, 'supprimerSlashesProfond'), $valeur) : stripslashes($valeur); |
return $valeur; |
} |
|
|
private function getMaxOrdre($id_utilisateur) { |
$ordre = null; |
$identifiant = $this->bdd->quote($identifiant); |
$identifiant = $this->bdd->quote($id_utilisateur); |
$requete = "SELECT MAX(ordre) AS ordre ". |
"FROM cel_inventory ". |
"WHERE identifiant = $identifiant "; |
"FROM cel_obs ". |
"WHERE ce_utilisateur = $id_utilisateur "; |
|
$ordre_max = $this->executerRequete($requete, 'Column'); |
if ($ordre_max !== false) { |
$ordre = $ordre_max + 1; |
173,21 → 210,73 |
return $dateMysql; |
} |
|
private function lierObsAMotsCles($observations) { |
$categorie = self::OBS_RACINE_ID.'.projets-cooperatifs'; |
$projet = $categorie.'.'.strtolower($this->projet); |
$ajout_mot_cle_1 = $this->ajouterMotCleObs($this->utilisateur_id, 'Projets coopératifs', $categorie, self::OBS_RACINE_ID); |
$ajout_mot_cle_2 = $this->ajouterMotCleObs($this->utilisateur_id, $this->projet, $projet, $categorie); |
$liaison_ok = false; |
if ($ajout_mot_cle_1 && $ajout_mot_cle_2) { |
$liaison_ok = $this->lierMotCleObs($this->utilisateur_id, array($projet), $observations); |
} else { |
$e = "La catégorie du projet et le mot-clé du projet n'ont pas pu être ajouté."; |
private function taguerObs($obs_a_taguer_ordres) { |
if (count($obs_a_taguer_ordres) > 0) { |
foreach ($this->tagsObs as $hierarchieTag) { |
$tagsALier = explode('>', $hierarchieTag); |
$liaisonOk = $this->lierObsAMotsCles($obs_a_taguer_ordres, $tagsALier); |
if ($liaisonOk === false) { |
$e = "Toutes les observations n'ont pas pu être liées aux mots-clés : $hierarchieTag"; |
$this->messages[] = $e; |
} |
} |
} |
} |
|
private function lierObsAMotsCles($observations_ordres, $tags) { |
$idTagParent = self::OBS_RACINE_ID; |
$listeIdsTags = array(); |
foreach ($tags as $tag) { |
$tag = $this->nettoyerTag($tag); |
if ($tag != '') { |
$id_mot_cle = $this->ajouterMotCleObs($this->utilisateur_id, $tag, $idTagParent); |
if ($id_mot_cle !== false) { |
$listeIdsTags[] = $id_mot_cle; |
$idTagParent = $id_mot_cle; |
} |
} |
} |
$liaison_ok = $this->lierMotCleObs($this->utilisateur_id, $listeIdsTags, $observations_ordres); |
return $liaison_ok; |
} |
|
private function taguerImg($img_a_taguer_ids) { |
if (count($img_a_taguer_ids) > 0) { |
$this->debug[] = "Tags img : ".print_r($this->tagsImg, true); |
foreach ($this->tagsImg as $hierarchieTag) { |
$tagsALier = explode('>', $hierarchieTag); |
$liaisonOk = $this->lierImgAMotsCles($img_a_taguer_ids, $tagsALier); |
if ($liaisonOk === false) { |
$e = "Toutes les images n'ont pas pu être liées aux mots-clés : $hierarchieTag"; |
$this->messages[] = $e; |
} |
} |
} |
} |
|
private function lierImgAMotsCles($images_ids, $tags) { |
$idTagParent = self::IMG_RACINE_ID; |
$listeIdsTags = array(); |
foreach ($tags as $tag) { |
$tag = $this->nettoyerTag($tag); |
if ($tag != '') { |
$id_mot_cle = $this->ajouterMotCleImg($this->utilisateur_id, $tag, $idTagParent); |
if ($id_mot_cle !== false) { |
$listeIdsTags[] = $id_mot_cle; |
$idTagParent = $id_mot_cle; |
} |
} |
} |
$liaison_ok = $this->lierMotCleImg($this->utilisateur_id, $listeIdsTags, $images_ids); |
return $liaison_ok; |
} |
|
private function nettoyerTag($tag) { |
$tag = trim($tag); |
$tag = preg_replace('/(?:\s+|[,]+)/', ' ', $tag); |
return $tag; |
} |
|
private function traiterNomFichierImage($fichierNom) { |
$fichierNom = preg_replace('/[.](jpeg|jpg)$/i', '.jpg', strtolower(trim($fichierNom))); |
return $fichierNom; |
197,14 → 286,12 |
* Décode l'image en base64,enregistre celle-ci sous forme de fichier du type de l'image |
* dans un dossier temporaire. |
*/ |
private function transformerBase64enFichier($fichierNom, $imageInfosB64) { |
private function transformerBase64enFichier($cheminImage, $imageInfosB64) { |
// Enleve la partie data:image qui permet la previsalisation pour firefox de l'image en base64 |
$imageBase64 = explode(';', $imageInfosB64); |
$type = explode('/',$imageBase64[0]); |
$dataBase64 = explode(',',$imageBase64[1]); |
$dataImg = base64_decode($dataBase64[1]); |
|
$cheminImage = $this->config['cel_db']['chemin_stockage_temp'].'/'.$fichierNom.'.'.$type[1]; |
$imageRessource = fopen($cheminImage, 'wb'); |
fwrite($imageRessource, $dataImg); |
fclose($imageRessource); |
214,28 → 301,67 |
} |
} |
|
public function lierObsEtImg($id_image, $id_utilisateur, $id_obs) { |
public function lierObsEtImg($id_image, $utilisateur, $ordre_obs) { |
$id_image = $this->proteger($id_image); |
$id_utilisateur = $this->proteger($id_utilisateur); |
$id_obs = $this->proteger($id_obs); |
$id_obs = $this->proteger($this->obtenirIdObsPourIdentifiantEtOrdre($utilisateur, $ordre_obs)); |
|
$requete = 'INSERT INTO cel_obs_images '. |
' (coi_ce_image, coi_ce_utilisateur, coi_ce_observation, coi_date_liaison) '. |
"VALUES ($id_image, $id_utilisateur, $id_obs, NOW()) ". |
' ON DUPLICATE KEY UPDATE coi_ce_image = coi_ce_image'; |
' (id_image, id_observation, date_liaison) '. |
"VALUES ($id_image, $id_obs, NOW()) ". |
' ON DUPLICATE KEY UPDATE id_image = id_image'; |
|
$liaison = true; |
if ($this->executerRequeteSimple($requete) === false) { |
$this->messages[] = "La requête de liaison de l'obs $id_obs à l'image $id_image pour l'utilisateur $id_utilisateur a échouée."; |
$liaison = false; |
} |
return $liaison; |
} |
|
private function obtenirIdObsPourIdentifiantEtOrdre($id_utilisateur, $ordre) { |
|
$id_utilisateur = $this->proteger($id_utilisateur); |
$ordre = $this->proteger($ordre); |
|
$requete = 'SELECT id_observation '. |
'FROM cel_obs '. |
"WHERE ce_utilisateur = $id_utilisateur ". |
" AND ordre = $ordre "; |
|
$resultat = $this->executerRequete($requete); |
|
$id_obs = (count($resultat) > 0) ? $resultat[0]['id_observation'] : false; |
return $id_obs; |
} |
|
public function nettoyerImagesUploades() { |
$dossierStockage = $this->config['cel']['chemin_stockage_temp'].'/'; |
if (is_dir($dossierStockage)) { |
$objets = scandir($dossierStockage); |
if ($objets !== false) { |
foreach ($objets as $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); |
} |
} |
} |
} |
} |
} |
} |
|
/** |
* 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 array $pairs le tableau contenant l'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 |
* @param string $idUtilisateur l'identifiant de l'utilisateur |
* @param string $cheminImage le chemin vers le fichier original de l'image |
* @param string $nomFichierImage le nom du fichier original de l'image |
*/ |
public function ajouterImageSurDdEtBdd($idUtilisateur, $cheminImage, $nomFichierImage) { |
$idImage = false; |
246,12 → 372,12 |
$metadonnees = $extracteurMetadonnees->extraireMetadonnees($cheminImage) ; |
if ($metadonnees !== false) { |
$infosImage = $metadonnees; |
$infosImage['ci_ordre'] = $nouvelOrdre; |
$infosImage['ci_publiable_eflore'] = 'false'; |
$infosImage['ci_nom_original'] = $nomFichierImage; |
$infosImage['ci_ce_utilisateur'] = $idUtilisateur; |
$infosImage['ci_md5'] = md5_file($cheminImage); |
|
$infosImage['ordre'] = $nouvelOrdre; |
$infosImage['publiable_eflore'] = 'false'; |
$infosImage['nom_original'] = $nomFichierImage; |
$infosImage['ce_utilisateur'] = $idUtilisateur; |
$infosImage['md5'] = md5_file($cheminImage); |
$this->debug[] = 'Nom fichier img meta :'.$nomFichierImage; |
$requete = $this->construireRequeteInsertionImage($infosImage); |
$resultat = $this->executerRequeteSimple($requete); |
if ($resultat !== false) { |
259,7 → 385,15 |
if ($idImage !== false) { |
$manipulateurImage = new ImageRecreation($this->config); |
$stockageOk = $manipulateurImage->stockerFichierEtCreerMiniatures($cheminImage, $idImage); |
if ($stockageOk == false) { |
if ($stockageOk) { |
$miniatureChemin = str_replace('.jpg', '_min.jpg', $cheminImage); |
if (file_exists($miniatureChemin)) { |
if (@unlink($miniatureChemin) === false) { |
$this->messages[] = "La miniature de l'image n'a pu être supprimée."; |
} |
} |
|
} else { |
$this->messages[] = "Une erreur s'est produite lors du stockage du fichier."; |
} |
} else { |
283,12 → 417,12 |
private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) { |
$id_utilisateur = $this->proteger($id_utilisateur); |
|
$requete = 'SELECT MAX(ci_ordre) as max_ordre '. |
$requete = 'SELECT MAX(ordre) as max_ordre '. |
'FROM cel_images '. |
"WHERE ci_ce_utilisateur = $id_utilisateur "; |
"WHERE ce_utilisateur = $id_utilisateur "; |
$resultat = $this->executerRequete($requete); |
|
$ordre = ($resultat) ? $resultat[0]['max_ordre']++ : 0; |
$ordre = ($resultat) ? ++$resultat[0]['max_ordre'] : 0; |
return $ordre; |
} |
|
296,19 → 430,19 |
$id_utilisateur = $this->proteger($id_utilisateur); |
$ordre = $this->proteger($ordre); |
|
$requete = 'SELECT ci_id_image '. |
$requete = 'SELECT id_image '. |
'FROM cel_images '. |
"WHERE ci_ce_utilisateur = $id_utilisateur ". |
" AND ci_ordre = $ordre "; |
"WHERE ce_utilisateur = $id_utilisateur ". |
" AND ordre = $ordre "; |
$resultat = $this->executerRequete($requete); |
|
$id_image = (count($resultat) > 0) ? $resultat[0]['ci_id_image'] : false; |
$id_image = (count($resultat) > 0) ? $resultat[0]['id_image'] : false; |
return $id_image; |
|
} |
|
private function construireRequeteInsertionImage($informations) { |
$champs = array('ci_meta_date_ajout'); |
$champs = array('date_creation'); |
$valeurs = array('CURRENT_TIMESTAMP()'); |
|
foreach ($informations as $champ => $valeur) { |
315,7 → 449,7 |
$champs[] = $champ; |
$valeurs[] = is_null($valeur) ? 'NULL' : $this->proteger($valeur); |
if ($champ == 'ci_meta_date_time' && $valeur != 'NULL') { |
$champs[] = 'ci_meta_date'; |
$champs[] = 'date_prise_de_vue'; |
$valeurs[] = $this->proteger($valeur); |
} |
} |