Subversion Repositories eFlore/Applications.cel

Rev

Rev 3675 | Rev 3716 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3675 Rev 3715
Line 18... Line 18...
18
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
18
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
19
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
20
 */
20
 */
21
class CelWidgetSaisie extends Cel {
21
class CelWidgetSaisie extends Cel {
Line 22... Line 22...
22
 
22
 
23
	private $projet = null;
23
    private $projet = null;
24
	private $projetId = null;
24
    private $projetId = null;
25
	private $projetTags = array();
25
    private $projetTags = array();
26
	private $tagsObs = null;
26
    private $tagsObs = null;
27
	private $tagsImg = null;
27
    private $tagsImg = null;
28
	private $userId = null;
28
    private $userId = null;
29
	private $userEmail = null;
29
    private $userEmail = null;
30
	private $userIntitule = null;
30
    private $userIntitule = null;
31
	private $isFromPlantNet = false;
31
    private $isFromPlantNet = false;
32
	private $isSauvages = false;
32
    private $isSauvages = false;
33
	const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 = 86 400 (1 journée)
33
    const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 = 86 400 (1 journée)
34
	const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
34
    const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
35
 
35
 
36
	private $correspondanceIdImgTags = array();
36
    private $correspondanceIdImgTags = array();
37
	private $gestionMotsClesObs = null;
37
    private $gestionMotsClesObs = null;
38
	private $gestionMotsClesImages = null;
38
    private $gestionMotsClesImages = null;
39
 
39
 
40
	public function createElement($requeteDonnees) {
40
    public function createElement($requeteDonnees) {
41
		if (self::ARRET_SERVICE) {
41
        if (self::ARRET_SERVICE) {
42
			$this->messages[] = "Désactivation temporaire du service d'envoi des données au CEL.";
42
            $this->messages[] = "Désactivation temporaire du service d'envoi des données au CEL.";
43
		} else if (array_key_exists('projet', $requeteDonnees)) {
43
        } else if (array_key_exists('projet', $requeteDonnees)) {
44
			$this->debug[] = 'Projet : '.$requeteDonnees['projet'];
44
            $this->debug[] = 'Projet : '.$requeteDonnees['projet'];
45
			if ($requeteDonnees['projet'] != "base") {
45
            if ($requeteDonnees['projet'] != "base") {
46
    			$this->projet = $requeteDonnees['projet'];
46
                $this->projet = $requeteDonnees['projet'];
47
    			$this->projetId = $requeteDonnees['id_projet'] ?? null;
47
                $this->projetId = $requeteDonnees['id_projet'] ?? null;
48
			}
48
            }
49
 
49
 
50
			// Si c'est une obs Pl@ntNet
50
            // Si c'est une obs Pl@ntNet
51
			if (! empty($requeteDonnees['tag-obs']) && strpos(strtolower($requeteDonnees['tag-obs']), 'plantnet') !== false) {
51
            if (! empty($requeteDonnees['tag-obs']) && strpos(strtolower($requeteDonnees['tag-obs']), 'plantnet') !== false) {
-
 
52
                $this->isFromPlantNet = true;
-
 
53
            }
-
 
54
            // Si c'est une obs Pl@ntNet
-
 
55
            if (! empty($requeteDonnees['tag-obs']) && strpos(strtolower($requeteDonnees['tag-obs']), 'mobileSauvages') !== false) {
52
				$this->isFromPlantNet = true;
56
                $this->isSauvages = true;
53
			}
57
            }
54
			// Si c'est une obs Pl@ntNet
58
			// Si c'est une obs Pl@ntNet
55
			if (! empty($requeteDonnees['tag-obs']) && strpos(strtolower($requeteDonnees['tag-obs']), 'mobileSauvages') !== false) {
59
			if (! empty($requeteDonnees['tag-obs']) && strpos(strtolower($requeteDonnees['tag-obs']), 'mobileSauvages') !== false) {
56
			    $this->isSauvages = true;
60
			    $this->isSauvages = true;
Line 57... Line 61...
57
			}
61
			}
58
 
62
 
Line 59... Line 63...
59
			// Traitements des tags multiples de projet
63
            // Traitements des tags multiples de projet
60
			$this->traiterProjetTags();
64
            $this->traiterProjetTags();
Line 61... Line 65...
61
 
65
 
62
			// Traitement des tags spécifiques aux obs
66
            // Traitement des tags spécifiques aux obs
Line 63... Line 67...
63
			$this->traiterTagObs($requeteDonnees);
67
            $this->traiterTagObs($requeteDonnees);
64
 
68
 
65
			// Traitement des tags spécifiques aux images
69
            // Traitement des tags spécifiques aux images
66
			$this->traiterTagImg($requeteDonnees);
70
            $this->traiterTagImg($requeteDonnees);
67
 
71
 
68
			// Traitement des observations et des images
72
            // Traitement des observations et des images
69
			if (isset($requeteDonnees['utilisateur']['courriel']) && filter_var($requeteDonnees['utilisateur']['courriel'], FILTER_VALIDATE_EMAIL)) {
73
            if (isset($requeteDonnees['utilisateur']['courriel']) && filter_var($requeteDonnees['utilisateur']['courriel'], FILTER_VALIDATE_EMAIL)) {
70
				$this->debug[] = 'Utilisateur : '.print_r($requeteDonnees['utilisateur'], true);
74
                $this->debug[] = 'Utilisateur : '.print_r($requeteDonnees['utilisateur'], true);
71
				$utilisateur = $requeteDonnees['utilisateur'];
75
                $utilisateur = $requeteDonnees['utilisateur'];
72
				// début transaction car si insertions par le même utilisateur en parallèle,
76
                // début transaction car si insertions par le même utilisateur en parallèle,
73
				// De plus, ça permet de ne pas conserver les données d'obs si l'image provoque une erreur
77
                // De plus, ça permet de ne pas conserver les données d'obs si l'image provoque une erreur
74
				//Cel::db()->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
78
                //Cel::db()->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
75
				Cel::db()->beginTransaction();
79
                Cel::db()->beginTransaction();
76
				$erreursDurantTraitement = false;
80
                $erreursDurantTraitement = false;
77
				$nomsOriginauxImagesTemp = array();
81
                $nomsOriginauxImagesTemp = array();
78
 
82
 
79
				// hop on récupère les infos de l'utilisateur
83
                // hop on récupère les infos de l'utilisateur
80
				$infosUtilisateur = $this->infosInscritTela($utilisateur['courriel']);
84
                $infosUtilisateur = $this->infosInscritTela($utilisateur['courriel']);
81
				if ($infosUtilisateur) {
85
                if ($infosUtilisateur) {
82
					$this->userId = $infosUtilisateur['id'];
86
                    $this->userId = $infosUtilisateur['id'];
83
					$this->userIntitule = $infosUtilisateur['intitule'];
87
                    $this->userIntitule = $infosUtilisateur['intitule'];
84
				} else {
88
                } else {
85
					$this->userId = '';
89
                    $this->userId = 0;
86
					$this->userIntitule = $utilisateur['prenom'] . ' ' . $utilisateur['nom'];
90
                    $this->userIntitule = $utilisateur['prenom'] . ' ' . $utilisateur['nom'];
87
				}
91
                }
88
				$this->userEmail = $utilisateur['courriel'];
92
                $this->userEmail = $utilisateur['courriel'];
89
 
93
 
90
				$this->debug[] = 'Courriel : ' . $this->userEmail;
94
                $this->debug[] = 'Courriel : ' . $this->userEmail;
91
				$requeteDonnees = $this->supprimerSlashesProfond($requeteDonnees);
95
                $requeteDonnees = $this->supprimerSlashesProfond($requeteDonnees);
92
				// Triage et manipulation des données
96
                // Triage et manipulation des données
93
				$observations = array();
97
                $observations = array();
94
				foreach ($requeteDonnees as $cle => $obs) {
98
                foreach ($requeteDonnees as $cle => $obs) {
95
					if (preg_match('/^obsId[0-9]+$/', $cle)) {
99
                    if (preg_match('/^obsId[0-9]+$/', $cle)) {
96
						$this->debug[] = 'commune_nom : '.$obs['commune_nom'];
100
                        $this->debug[] = 'commune_nom : '.$obs['commune_nom'];
97
						$this->debug[] = 'commune_code_insee : '. (isset($obs['commune_code_insee']) ? $obs['commune_code_insee'] : 'n/a');
101
                        $this->debug[] = 'commune_code_insee : '. (isset($obs['commune_code_insee']) ? $obs['commune_code_insee'] : 'n/a');
98
 
102
 
99
						$obsAAjouter = array();
103
                        $obsAAjouter = array();
100
						$obsAAjouter['user_id'] = $this->userId;
104
                        $obsAAjouter['user_id'] = $this->userId;
101
						$obsAAjouter['user_email'] = $this->userEmail;
105
                        $obsAAjouter['user_email'] = $this->userEmail;
102
						$obsAAjouter['user_pseudo'] = $this->userIntitule;
106
                        $obsAAjouter['user_pseudo'] = $this->userIntitule;
103
 
107
 
104
						$obsAAjouter['user_sci_name'] = isset($obs['nom_sel']) ? $obs['nom_sel'] : null;
108
                        $obsAAjouter['user_sci_name'] = isset($obs['nom_sel']) ? $obs['nom_sel'] : null;
105
						$obsAAjouter['user_sci_name_id'] = isset($obs['num_nom_sel']) ? $obs['num_nom_sel'] : null;
109
                        $obsAAjouter['user_sci_name_id'] = isset($obs['num_nom_sel']) ? $obs['num_nom_sel'] : null;
106
						$obsAAjouter['accepted_sci_name'] = isset($obs['nom_ret']) ? $obs['nom_ret'] : null;
110
                        $obsAAjouter['accepted_sci_name'] = isset($obs['nom_ret']) ? $obs['nom_ret'] : null;
107
						$obsAAjouter['accepted_sci_name_id'] = isset($obs['num_nom_ret']) ? $obs['num_nom_ret'] : null;
111
                        $obsAAjouter['accepted_sci_name_id'] = isset($obs['num_nom_ret']) ? $obs['num_nom_ret'] : null;
108
						$obsAAjouter['family'] = isset($obs['famille']) ? $obs['famille'] : null;
112
                        $obsAAjouter['family'] = isset($obs['famille']) ? $obs['famille'] : null;
109
						$obsAAjouter['taxo_repo'] = isset($obs['referentiel']) ? ($obs['referentiel'] == 'bdtfxr') ? 'bdtfx' : $obs['referentiel'] : null;
113
                        $obsAAjouter['taxo_repo'] = isset($obs['referentiel']) ? ($obs['referentiel'] == 'bdtfxr') ? 'bdtfx' : $obs['referentiel'] : null;
110
 
114
 
111
						$obsAAjouter['date_observed'] = $this->transormerDateFrVersMysql($obs['date']);
115
                        $obsAAjouter['date_observed'] = $this->transormerDateFrVersMysql($obs['date']);
112
						$obsAAjouter['annotation'] = isset($obs['notes']) && trim($obs['notes']) !== "" ? $obs['notes'] : null;
116
                        $obsAAjouter['annotation'] = isset($obs['notes']) && trim($obs['notes']) !== "" ? $obs['notes'] : null;
113
 
117
 
114
						// Pays est pour le moment sur un varchar(2) dans la base
118
                        // Pays est pour le moment sur un varchar(2) dans la base
115
						// alors qu'il est envoyé complet par le script WidgetSaisie
119
                        // alors qu'il est envoyé complet par le script WidgetSaisie
116
						$obsAAjouter['osm_country'] = (isset($obs['pays'])) ? $obs['pays'] : null;
120
                        $obsAAjouter['osm_country'] = (isset($obs['pays'])) ? $obs['pays'] : null;
117
						$obsAAjouter['locality'] = $obs['commune_nom'];
121
                        $obsAAjouter['locality'] = $obs['commune_nom'];
118
						$obsAAjouter['locality_insee_code'] = isset($obs['commune_code_insee']) ? $obs['commune_code_insee'] : '';
122
                        $obsAAjouter['locality_insee_code'] = isset($obs['commune_code_insee']) ? $obs['commune_code_insee'] : '';
119
						$obsAAjouter['sublocality'] = isset($obs['lieudit']) && trim($obs['lieudit']) !== "" ? $obs['lieudit'] : null;
123
                        $obsAAjouter['sublocality'] = isset($obs['lieudit']) && trim($obs['lieudit']) !== "" ? $obs['lieudit'] : null;
120
						$obsAAjouter['station'] = isset($obs['station']) && trim($obs['station']) !== "" ? $obs['station'] : null;
124
                        $obsAAjouter['station'] = isset($obs['station']) && trim($obs['station']) !== "" ? $obs['station'] : null;
121
						$obsAAjouter['environment'] = isset($obs['milieu']) && trim($obs['milieu']) !== "" ? $obs['milieu'] : null;
125
                        $obsAAjouter['environment'] = isset($obs['milieu']) && trim($obs['milieu']) !== "" ? $obs['milieu'] : null;
122
						$obsAAjouter['elevation'] = (! empty($obs['altitude'])) ? $obs['altitude'] : null;
126
                        $obsAAjouter['elevation'] = (! empty($obs['altitude'])) ? $obs['altitude'] : null;
123
						$obsAAjouter['geometry'] = $obs['geometry'] ?? json_encode([
127
                        $obsAAjouter['geometry'] = $obs['geometry'] ?? json_encode([
124
							'type' => 'Point',
128
                                'type' => 'Point',
125
							'coordinates' => [ (float)$obs['longitude'], (float)$obs['latitude'] ]
129
                                'coordinates' => [ (float)$obs['longitude'], (float)$obs['latitude'] ]
126
						]); // CONCAT('{\"type\":\"Point\",\"coordinates\":[', longitude, ',', latitude,']}'),
130
                            ]); // CONCAT('{\"type\":\"Point\",\"coordinates\":[', longitude, ',', latitude,']}'),
127
						$obsAAjouter['geodatum'] = 'WGS84';
131
                        $obsAAjouter['geodatum'] = 'WGS84';
128
 
132
 
129
						$obsAAjouter['phenology'] = isset($obs['phenologie']) ? $obs['phenologie'] : null;
133
                        $obsAAjouter['phenology'] = isset($obs['phenologie']) ? $obs['phenologie'] : null;
130
						$obsAAjouter['coef'] = isset($obs['abondance']) ? $obs['abondance'] : null;
134
                        $obsAAjouter['coef'] = isset($obs['abondance']) ? $obs['abondance'] : null;
131
 
135
 
132
						$obsAAjouter['is_public'] = '1';
136
                        $obsAAjouter['is_public'] = '1';
133
						$obsAAjouter['date_created'] = date('Y-m-d H:i:s');
137
                        $obsAAjouter['date_created'] = date('Y-m-d H:i:s');
134
						$obsAAjouter['date_updated'] = $obsAAjouter['date_created'];
138
                        $obsAAjouter['date_updated'] = $obsAAjouter['date_created'];
135
						$obsAAjouter['date_published'] = $obsAAjouter['date_created'];
139
                        $obsAAjouter['date_published'] = $obsAAjouter['date_created'];
136
 
140
 
137
						$obsAAjouter['image_nom'] = $obs['image_nom'] ?? null;
141
                        $obsAAjouter['image_nom'] = $obs['image_nom'] ?? null;
138
						$obsAAjouter['image_b64'] = $obs['image_b64'] ?? null;
142
                        $obsAAjouter['image_b64'] = $obs['image_b64'] ?? null;
139
 
143
 
140
						$obsAAjouter['certainty'] = '';
144
                        $obsAAjouter['certainty'] = '';
141
						if (isset($obs['certitude'])) {
145
                        if (isset($obs['certitude'])) {
142
							switch ($obs['certitude']) {
146
                            switch ($obs['certitude']) {
143
								case 'certaine':
147
                                case 'certaine':
144
									$obsAAjouter['certainty'] = 'certain';
148
                                    $obsAAjouter['certainty'] = 'certain';
145
									break;
149
                                    break;
-
 
150
                                case 'douteuse':
-
 
151
                                    $obsAAjouter['certainty'] = 'douteux';
146
								case 'douteuse':
152
                                    break;
-
 
153
                                default:
-
 
154
                                    $obsAAjouter['certainty'] = $obs['certitude'];
-
 
155
                                    break;
-
 
156
                            }
-
 
157
                        }
-
 
158
                        $obsAAjouter['input_source'] = 'widget';
147
									$obsAAjouter['certainty'] = 'douteux';
159
                        $obsAAjouter['project_id'] = $this->projetId;
-
 
160
                        $obsAAjouter['project'] = $this->projet;
-
 
161
                        if ($this->isFromPlantNet) {
-
 
162
                            $obsAAjouter['input_source'] = 'PlantNet';
148
									break;
163
                            $obsAAjouter['plantnet_id'] = $obs['obs_id'];
149
								default:
164
                        }
150
									$obsAAjouter['certainty'] = $obs['certitude'];
165
                        if ($this->isSauvages) {
151
									break;
166
                            $obsAAjouter['input_source'] = 'autre';
152
							}
-
 
153
						}
-
 
154
						$obsAAjouter['input_source'] = 'widget';
167
                            $obsAAjouter['project'] = 'sauvages';
155
						$obsAAjouter['project_id'] = $this->projetId;
-
 
156
						$obsAAjouter['project'] = $this->projet;
168
                        }
157
						if ($this->isFromPlantNet) {
169
						$obsAAjouter['input_source'] = 'widget';
158
							$obsAAjouter['input_source'] = 'PlantNet';
170
						$obsAAjouter['project_id'] = $this->projetId;
159
							$obsAAjouter['plantnet_id'] = $obs['obs_id'];
171
						$obsAAjouter['project'] = $this->projet;
Line 488... Line 498...
488
 
498
 
Line 489... Line 499...
489
						$champs_etendus_obs[] = $champEtendu;
499
                        $champs_etendus_obs[] = $champEtendu;
490
					}
-
 
491
				}
-
 
492
			}
-
 
493
		}
-
 
494
 
-
 
495
        if(! $champs_etendus_obs) return TRUE;
-
 
496
 
-
 
497
		return $gestionChampsEtendus->ajouterParLots($champs_etendus_obs, $this->projet);
-
 
498
	}
-
 
499
 
-
 
500
	private function traiterImagesALierAObs($idObs, $obs) {
-
 
501
		$imgAAjouter = array();
-
 
502
		if (is_array($obs['image_nom'])) {
-
 
503
			foreach ($obs['image_nom'] as $index => $nom_image) {
-
 
504
				$image = array();
-
 
505
				$image['id_utilisateur'] = $this->userId;
-
 
506
				$image['id_obs'] = $idObs;
-
 
507
				$image['nom'] = $nom_image;
-
 
508
				// on suppose que les b64 des images sont envoyés dans le même ordre que leurs noms
-
 
509
				// TODO: indexer le tableau avec le nom des images
-
 
510
				$image['b64'] = (is_array($obs['image_b64']) && isset($obs['image_b64'][$index])) ? $obs['image_b64'][$index] : null;
-
 
511
				$this->debug[] = 'Contient B64 : '.(isset($obs['image_b64']) ? 'oui' : 'non');
-
 
512
				$imgAAjouter[] = $image;
-
 
513
			}
-
 
514
		} else {
-
 
515
			$image = array();
-
 
516
			$image['id_utilisateur'] = $this->userId;
-
 
517
			$image['id_obs'] = $idObs;
-
 
518
			$image['nom'] = $obs['image_nom'];
-
 
519
			$image['b64'] = $obs['image_b64'] ?? null;
-
 
520
			$this->debug[] = 'Contient B64 : '.(isset($obs['image_b64']) ? 'oui' : 'non');
-
 
521
			$imgAAjouter[] = $image;
-
 
522
		}
-
 
523
 
-
 
524
		return $imgAAjouter;
-
 
525
	}
-
 
526
 
-
 
527
	protected function stockerImagesEtLierAObs($id_obs, $img) {
-
 
528
		$img_a_taguer_ids_noms = array();
500
                    }
Line 802... Line 814...
802
		$id_utilisateur = Cel::db()->proteger($this->userId);
814
        $email_utilisateur = Cel::db()->proteger($this->userEmail);
Line 803... Line 815...
803
		$email_utilisateur = Cel::db()->proteger($this->userEmail);
815
        $original_name = Cel::db()->proteger($original_name);
804
		$original_name = Cel::db()->proteger($original_name);
816
 
805
 
817
        $requete = 'SELECT id '.
806
		$requete = 'SELECT id '.
818
            'FROM photo '.
807
			'FROM photo '.
819
            "WHERE (user_id = $id_utilisateur OR user_email = $email_utilisateur)".
808
			"WHERE (user_id = $id_utilisateur OR user_email = $email_utilisateur)".
820
            "	AND original_name = $original_name ";
809
			"	AND original_name = $original_name ";
821
        $resultat = Cel::db()->requeter($requete);
810
		$resultat = Cel::db()->requeter($requete);
822
        $id_image = $resultat[0]['id'] ?? false;
811
		$id_image = $resultat[0]['id'] ?? false;
823
		$id_image = $resultat[0]['id'] ?? false;
812
 
824
 
813
		if ($id_image) {
825
        if ($id_image) {
814
			$full_id_image = str_pad($id_image, 9, '0', STR_PAD_LEFT) . 'O';
826
            $full_id_image = str_pad($id_image, 9, '0', STR_PAD_LEFT) . 'O';
815
			$image_url = sprintf($this->config['settings']['celImgUrlTpl'], $full_id_image);
827
            $image_url = sprintf($this->config['settings']['celImgUrlTpl'], $full_id_image);
816
			$requete = 'UPDATE photo'
828
            $requete = 'UPDATE photo'
817
				. ' SET url = ' . Cel::db()->proteger($image_url)
829
                . ' SET url = ' . Cel::db()->proteger($image_url)
818
				. ' WHERE id = ' . Cel::db()->proteger($id_image);
830
                . ' WHERE id = ' . Cel::db()->proteger($id_image);
819
			$resultat = Cel::db()->requeter($requete);
831
            $resultat = Cel::db()->requeter($requete);
820
		}
832
        }
821
 
833
 
822
		return $id_image;
834
        return $id_image;
823
 
835
 
824
	}
836
    }
825
 
837
 
826
	private function construireRequeteInsertionImage($informations) {
838
    private function construireRequeteInsertionImage($informations) {
827
		$champs = array();
839
        $champs = array();
828
		$valeurs = array();
840
        $valeurs = array();
829
		foreach ($informations as $champ => $valeur) {
841
        foreach ($informations as $champ => $valeur) {
830
			$champs[] = $champ;
842
            $champs[] = $champ;
831
			if (is_null($valeur)) {
843
            if (is_null($valeur)) {
832
				$valeurs[$champ] = 'NULL';
844
                $valeurs[$champ] = 'NULL';
833
			} else if ($valeur === 'NOW()') {
845
            } else if ($valeur === 'NOW()') {
834
				$valeurs[$champ] = $valeur;
846
                $valeurs[$champ] = $valeur;
835
			} else {
847
            } else {
836
				$valeurs[$champ] = Cel::db()->proteger($valeur);
848
                $valeurs[$champ] = Cel::db()->proteger($valeur);