Subversion Repositories eFlore/Applications.del

Rev

Rev 1949 | Rev 2157 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1949 Rev 1977
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Permet d'ajouter un commentaire.
4
 * Permet d'ajouter un commentaire.
5
 *
5
 *
6
 * @category   DEL
6
 * @category   DEL
7
 * @package    Services
7
 * @package    Services
8
 * @subpackage Commentaires
8
 * @subpackage Commentaires
9
 * @version    0.1
9
 * @version    0.1
10
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
10
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
 */
16
 */
17
 
17
 
18
class AjouterCommentaire {
18
class AjouterCommentaire {
19
 
19
 
20
	private $conteneur;
20
	private $conteneur;
21
	private $navigation;
21
	private $navigation;
22
	private $bdd;
22
	private $bdd;
23
	private $parametres = array();
23
	private $parametres = array();
24
 
24
 
25
	private $mapping = array();
25
	private $mapping = array();
26
	private $erreurs = array();
26
	private $erreurs = array();
27
 
27
 
28
	public function __construct(Conteneur $conteneur) {
28
	public function __construct(Conteneur $conteneur) {
29
		$this->conteneur = $conteneur;
29
		$this->conteneur = $conteneur;
30
		$this->navigation =  $this->conteneur->getNavigation();
30
		$this->navigation =  $this->conteneur->getNavigation();
31
		$this->bdd = $this->conteneur->getBdd();
31
		$this->bdd = $this->conteneur->getBdd();
32
 
32
 
33
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
33
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
34
	}
34
	}
35
 
35
 
36
	public function ajouter($parametres) {
36
	public function ajouter($parametres) {
37
		$this->parametres = $parametres;
37
		$this->parametres = $parametres;
38
		$this->verifierParametres();
38
		$this->verifierParametres();
39
 
39
 
40
		$this->completerParametresUtilisateur();
40
		$this->completerParametresUtilisateur();
41
		$this->gererPropositionInitiale();
41
		$this->gererPropositionInitiale();
42
		// Dernière chance de rattachement au référentiel d'un nom 
42
		// Dernière chance de rattachement au référentiel d'un nom 
43
		// sans nn (cas du copier-coller ou bien de l'appli tierce
43
		// sans nn (cas du copier-coller ou bien de l'appli tierce
44
		// qui envoie des infos incomplètes)
44
		// qui envoie des infos incomplètes)
45
		$this->tenterEnrichissementTaxonomique();
45
		$this->tenterEnrichissementTaxonomique();
46
		$idCommentaireAjoute = $this->insererCommentaire();
46
		$idCommentaireAjoute = $this->insererCommentaire();
47
 
47
 
48
		// Mettre en forme le résultat et l'envoyer pour affichage
48
		// Mettre en forme le résultat et l'envoyer pour affichage
49
		$resultat = new ResultatService();
49
		$resultat = new ResultatService();
50
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
50
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
51
 
51
 
52
		return $resultat;
52
		return $resultat;
53
	}
53
	}
54
 
54
 
55
	private function verifierParametres() {
55
	private function verifierParametres() {
56
		if (!isset($this->parametres['observation'])) {
56
		if (!isset($this->parametres['observation'])) {
57
			$this->erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
57
			$this->erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
58
		}
58
		}
59
 
59
 
60
		if (!isset($this->parametres['auteur.id'])) {
60
		if (!isset($this->parametres['auteur.id'])) {
61
			$this->verifierParamsAuteurAnonyme();
61
			$this->verifierParamsAuteurAnonyme();
62
		}
62
		}
63
 
63
 
64
		$this->verifierParamsNonVide();
64
		$this->verifierParamsNonVide();
65
 
65
 
66
		if (isset($this->parametres['nom_sel_nn']) && !isset($this->parametres['nom_referentiel'])) {
66
		if (isset($this->parametres['nom_sel_nn']) && !isset($this->parametres['nom_referentiel'])) {
67
			$this->erreurs[] = "Si le paramètre «nom_sel_nn» est présent, le paramètre «nom_referentiel» doit l'être aussi.";
67
			$this->erreurs[] = "Si le paramètre «nom_sel_nn» est présent, le paramètre «nom_referentiel» doit l'être aussi.";
68
		}
68
		}
69
 
69
 
70
		if (!empty($this->erreurs)) {
70
		if (!empty($this->erreurs)) {
71
			$msg = "Erreur de configuration :\n".implode("\n\n", $this->erreurs);
71
			$msg = "Erreur de configuration :\n".implode("\n\n", $this->erreurs);
72
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
72
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
73
		}
73
		}
74
	}
74
	}
75
 
75
 
76
	private function verifierParamsAuteurAnonyme() {
76
	private function verifierParamsAuteurAnonyme() {
77
		$paramsAuteur = array('auteur.nom', 'auteur.prenom', 'auteur.courriel');
77
		$paramsAuteur = array('auteur.nom', 'auteur.prenom', 'auteur.courriel');
78
		$paramsAuteurManquant = array();
78
		$paramsAuteurManquant = array();
79
		foreach ($paramsAuteur as $param) {
79
		foreach ($paramsAuteur as $param) {
80
			if (!isset($this->parametres[$param])) {
80
			if (!isset($this->parametres[$param])) {
81
				$paramsAuteurManquant[] = $param;
81
				$paramsAuteurManquant[] = $param;
82
			}
82
			}
83
		}
83
		}
84
 
84
 
85
		if (!empty($paramsAuteurManquant)) {
85
		if (!empty($paramsAuteurManquant)) {
86
			$msgAuteurTpl = "Si le parametre 'auteur.id' n'est pas utilisé, il est nécessaire d'indiquer les ".
86
			$msgAuteurTpl = "Si le parametre 'auteur.id' n'est pas utilisé, il est nécessaire d'indiquer les ".
87
			"nom (paramètre 'auteur.nom'), prénom (paramètre 'auteur.prenom') et courriel ".
87
			"nom (paramètre 'auteur.nom'), prénom (paramètre 'auteur.prenom') et courriel ".
88
			"(paramètre 'auteur.courriel') de l'auteur.\nLes paramètres suivant sont abscents : %s\n";
88
			"(paramètre 'auteur.courriel') de l'auteur.\nLes paramètres suivant sont abscents : %s\n";
89
			$this->erreurs[] = sprintf($msgAuteurTpl, implode(', ', $paramsAuteurManquant));
89
			$this->erreurs[] = sprintf($msgAuteurTpl, implode(', ', $paramsAuteurManquant));
90
		}
90
		}
91
	}
91
	}
92
 
92
 
93
	private function verifierParamsNonVide() {
93
	private function verifierParamsNonVide() {
94
		$paramsNonVide = array('nom_sel', 'nom_referentiel', 'nom_sel_nn');
94
		$paramsNonVide = array('nom_sel', 'nom_referentiel', 'nom_sel_nn');
95
		foreach ($paramsNonVide as $param) {
95
		foreach ($paramsNonVide as $param) {
96
			if (isset($this->parametres[$param]) && trim($this->parametres[$param]) == '' ) {
96
			if (isset($this->parametres[$param]) && trim($this->parametres[$param]) == '' ) {
97
				$this->erreurs[] = "S'il est présent le paramètre «$param» ne peut pas être vide.";
97
				$this->erreurs[] = "S'il est présent le paramètre «$param» ne peut pas être vide.";
98
			}
98
			}
99
		}
99
		}
100
	}
100
	}
101
 
101
 
102
	private function completerParametresUtilisateur() {
102
	private function completerParametresUtilisateur() {
103
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
103
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
104
		if ($utilisateur !== false) {
104
		if ($utilisateur !== false) {
105
			foreach ($utilisateur as $param => $valeur) {
105
			foreach ($utilisateur as $param => $valeur) {
106
				$this->parametres[$param] = $valeur;
106
				$this->parametres[$param] = $valeur;
107
			}
107
			}
108
		}
108
		}
109
	}
109
	}
110
 
110
 
111
	private function obtenirUtilisateurAvecId() {
111
	private function obtenirUtilisateurAvecId() {
112
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
112
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
113
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
113
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
114
			'FROM del_utilisateur '.
114
			'FROM del_utilisateur '.
115
			"WHERE id_utilisateur = $auteurIdP ".
115
			"WHERE id_utilisateur = $auteurIdP ".
116
			' -- '.__FILE__.' : '.__LINE__;
116
			' -- '.__FILE__.' : '.__LINE__;
117
		$utilisateur = $this->bdd->recuperer($requete);
117
		$utilisateur = $this->bdd->recuperer($requete);
118
		return $utilisateur;
118
		return $utilisateur;
119
	}
119
	}
120
 
120
 
121
	private function obtenirUtilisateurSansId() {
121
	private function obtenirUtilisateurSansId() {
122
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
122
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
123
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
123
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
124
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
124
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
125
 
125
 
126
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
126
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
127
			"courriel AS 'auteur.courriel' ".
127
			"courriel AS 'auteur.courriel' ".
128
			'FROM del_utilisateur '.
128
			'FROM del_utilisateur '.
129
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
129
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
130
			' -- '.__FILE__.' : '.__LINE__;
130
			' -- '.__FILE__.' : '.__LINE__;
131
		$utilisateur = $this->bdd->recuperer($requete);
131
		$utilisateur = $this->bdd->recuperer($requete);
132
		return $utilisateur;
132
		return $utilisateur;
133
	}
133
	}
134
 
134
 
135
	private function gererPropositionInitiale() {
135
	private function gererPropositionInitiale() {
136
		if ($this->verifierExistencePropositionInitiale() === false) {
136
		if ($this->verifierExistencePropositionInitiale() === false) {
137
			$this->creerPropositionInitiale();
137
			$this->creerPropositionInitiale();
138
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
138
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
139
		}
139
		}
140
	}
140
	}
141
 
141
 
142
	private function verifierExistencePropositionInitiale() {
142
	private function verifierExistencePropositionInitiale() {
143
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
143
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
144
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
144
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
145
			'FROM del_commentaire '.
145
			'FROM del_commentaire '.
146
			"WHERE ce_observation = $idObsP ".
146
			"WHERE ce_observation = $idObsP ".
147
			'	AND proposition_initiale = 1 '.
147
			'	AND proposition_initiale = 1 '.
148
			' -- '.__FILE__.' : '.__LINE__;
148
			' -- '.__FILE__.' : '.__LINE__;
149
		$resultat = $this->bdd->recuperer($requete);
149
		$resultat = $this->bdd->recuperer($requete);
150
		return $resultat['existe'] == 1;
150
		return $resultat['existe'] == 1;
151
	}
151
	}
152
 
152
 
153
	private function creerPropositionInitiale() {
153
	private function creerPropositionInitiale() {
154
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
154
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
155
		$requete = 'INSERT IGNORE INTO del_commentaire '.
155
		$requete = 'INSERT IGNORE INTO del_commentaire '.
156
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
156
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
157
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
157
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
158
			'SELECT id_observation, ce_utilisateur, prenom, nom, courriel, nom_sel, '.
158
			'SELECT id_observation, ce_utilisateur, prenom, nom, courriel, nom_sel, '.
159
			"IF(nom_sel_nn = 0, NULL, nom_sel_nn), IF(nom_ret = '', NULL, nom_ret), IF(nom_ret_nn = 0, NULL, nom_ret_nn), ".
159
			"IF(nom_sel_nn = 0, NULL, nom_sel_nn), IF(nom_ret = '', NULL, nom_ret), IF(nom_ret_nn = 0, NULL, nom_ret_nn), ".
160
			"IF(nt = 0, NULL, nt), IF(famille = '', NULL, famille), IF(nom_sel_nn = 0, NULL, nom_referentiel), NOW(), '1' ".
160
			"IF(nt = 0, NULL, nt), IF(famille = '', NULL, famille), IF(nom_sel_nn = 0, NULL, nom_referentiel), NOW(), '1' ".
161
			'FROM del_observation AS do '.
161
			'FROM del_observation AS do '.
162
			'	LEFT JOIN del_utilisateur AS du '.
162
			'	LEFT JOIN del_utilisateur AS du '.
163
			'		ON do.ce_utilisateur = du.id_utilisateur '.
163
			'		ON do.ce_utilisateur = du.id_utilisateur '.
164
			"WHERE id_observation = $idObsP ".
164
			"WHERE id_observation = $idObsP ".
165
			' -- '.__FILE__.' : '.__LINE__;
165
			' -- '.__FILE__.' : '.__LINE__;
166
		$resultat = $this->bdd->executer($requete);
166
		$resultat = $this->bdd->executer($requete);
167
		return $resultat;
167
		return $resultat;
168
	}
168
	}
169
 
169
 
170
	private function insererCommentaire() {
170
	private function insererCommentaire() {
171
		$champs = $this->creerEnteteChamps();
171
		$champs = $this->creerEnteteChamps();
172
		$values = $this->creerClauseValues();
172
		$values = $this->creerClauseValues();
173
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
173
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
174
			' -- '.__FILE__.' : '.__LINE__;
174
			' -- '.__FILE__.' : '.__LINE__;
175
 
175
 
176
		$retour = $this->bdd->executer($requete);
176
		$retour = $this->bdd->executer($requete);
177
		if ($retour == null) {
177
		if ($retour == null) {
178
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
178
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
179
			$msg = sprintf($msgTpl, $this->parametres['observation']);
179
			$msg = sprintf($msgTpl, $this->parametres['observation']);
180
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
180
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
181
		}
181
		}
182
 
182
 
183
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
183
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
184
		return $idCommentaire;
184
		return $idCommentaire;
185
	}
185
	}
186
 
186
 
187
	private function creerEnteteChamps() {
187
	private function creerEnteteChamps() {
188
		return $this->creerSuiteChampsOuValeurs('champs');
188
		return $this->creerSuiteChampsOuValeurs('champs');
189
	}
189
	}
190
 
190
 
191
	private function creerClauseValues() {
191
	private function creerClauseValues() {
192
		return $this->creerSuiteChampsOuValeurs('valeurs');
192
		return $this->creerSuiteChampsOuValeurs('valeurs');
193
	}
193
	}
194
 
194
 
195
	private function creerSuiteChampsOuValeurs($mode) {
195
	private function creerSuiteChampsOuValeurs($mode) {
196
		$suite = array();
196
		$suite = array();
197
		foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
197
		foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
198
			if (isset($this->parametres[$nomAttributSortie]) && $this->parametres[$nomAttributSortie] != null) {
198
			if (isset($this->parametres[$nomAttributSortie]) && $this->parametres[$nomAttributSortie] != null) {
199
				if ($mode == 'valeurs') {
199
				if ($mode == 'valeurs') {
200
					$suite[] = $this->bdd->proteger($this->parametres[$nomAttributSortie]);
200
					$suite[] = $this->bdd->proteger($this->parametres[$nomAttributSortie]);
201
				} else if ($mode == 'champs') {
201
				} else if ($mode == 'champs') {
202
					$suite[] = $nomChampBdd;
202
					$suite[] = $nomChampBdd;
203
				} else {
203
				} else {
204
					$msg = "Erreur interne : mauvais paramètre passé à la méthode 'creerSuiteChampsOuValeurs'";
204
					$msg = "Erreur interne : mauvais paramètre passé à la méthode 'creerSuiteChampsOuValeurs'";
205
					throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
205
					throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
206
				}
206
				}
207
			}
207
			}
208
		}
208
		}
209
		return implode(', ', $suite);
209
		return implode(', ', $suite);
210
	}
210
	}
211
	
211
	
212
	private function tenterEnrichissementTaxonomique() {
212
	private function tenterEnrichissementTaxonomique() {
213
		if($this->commentaireEstPropositionSansNn()) {
213
		if($this->commentaireEstPropositionSansNn()) {
-
 
214
			// TODO: utiliser le référentiel de l'obs si celui-ci 
-
 
215
			// n'est pas fourni dans le commentaire et prendre le résultat
-
 
216
			// si celui-ci est unique
214
			$referentiel = $this->parametres['nom_referentiel'];
217
			$referentiel = $this->parametres['nom_referentiel'];
215
			$requete = urlencode($this->parametres['nom_sel']);
218
			$requete = urlencode($this->parametres['nom_sel']);
216
			
219
			
217
			$url = sprintf($this->conteneur->getParametre('nomstaxons.url_autocompletion_tpl'), $referentiel, $requete);
220
			$url = sprintf($this->conteneur->getParametre('nomstaxons.url_autocompletion_tpl'), $referentiel, $requete);
218
			$restClient = $this->conteneur->getRestClient();
221
			$restClient = $this->conteneur->getRestClient();
219
			// Un retour vide est possible (un cas normal où il n'y a pas de résultat)
222
			// Un retour vide est possible (un cas normal où il n'y a pas de résultat)
220
			// mais il fait planter le retour du service si on active l'affichage des erreurs
223
			// mais il fait planter le retour du service si on active l'affichage des erreurs
221
			// donc on passe sciemment les erreurs sous silence (car cette erreur n'en est pas une)
224
			// donc on passe sciemment les erreurs sous silence (car cette erreur n'en est pas une)
222
			$resultatJson = @$restClient->consulter($url);
225
			$resultatJson = @$restClient->consulter($url);
223
			$resultats = json_decode($resultatJson, true);
226
			$resultats = json_decode($resultatJson, true);
224
 
227
 
225
			// On ne fait l'affectation que si l'on est sur (donc si un seul résultat)
228
			// On ne fait l'affectation que si l'on est sur (donc si un seul résultat)
226
			if (isset($resultats['resultat']) && count($resultats['resultat']) == 1) {
229
			if (isset($resultats['resultat']) && count($resultats['resultat']) == 1) {
227
				$info = array_pop($resultats['resultat']);
230
				$info = array_pop($resultats['resultat']);
228
				$this->parametres['nom_sel_nn'] = $info['num_nom'];
231
				$this->parametres['nom_sel_nn'] = $info['num_nom'];
229
			}
232
			}
230
		}
233
		}
231
	}
234
	}
232
	
235
	
233
	private function commentaireEstPropositionSansNn() {
236
	private function commentaireEstPropositionSansNn() {
234
		// Pas besoin de tester si c'est vide, normalement verifierParametres 
237
		// Pas besoin de tester si c'est vide, normalement verifierParametres 
235
		// l'a déjà fait au-dessus
238
		// l'a déjà fait au-dessus
236
		return isset($this->parametres['nom_sel']) 
239
		return isset($this->parametres['nom_sel']) 
237
				&& isset($this->parametres['nom_referentiel']) 
240
				&& isset($this->parametres['nom_referentiel']) 
238
						&& !isset($this->parametres['nom_sel_nn']);
241
						&& !isset($this->parametres['nom_sel_nn']);
239
	}
242
	}
240
}
243
}