Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1794 Rev 1795
Line 1... Line 1...
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
 */
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
class AjouterCommentaire {
18
class AjouterCommentaire {
19
 
19
 
20
	private $conteneur;
20
	private $conteneur;
21
	private $navigation;
21
	private $navigation;
22
	private $bdd;
-
 
Line 23... Line 22...
23
	private $parametres = array();
22
	private $bdd;
Line 24... Line 23...
24
	private $ressources = array();
23
	private $parametres = array();
25
 
24
 
26
	private $commentaire;
-
 
27
 
-
 
28
	public function __construct(Conteneur $conteneur) {
25
	private $mapping = array();
29
		$this->conteneur = $conteneur;
26
 
-
 
27
	public function __construct(Conteneur $conteneur) {
-
 
28
		$this->conteneur = $conteneur;
30
		$this->conteneur->chargerConfiguration('config_commentaires.ini');
29
		$this->navigation =  $this->conteneur->getNavigation();
Line 31... Line -...
31
		$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
-
 
32
		$this->navigation = $conteneur->getNavigation();
-
 
33
		$this->bdd = $this->conteneur->getBdd();
30
		$this->bdd = $this->conteneur->getBdd();
34
	}
-
 
35
 
-
 
36
	/**
-
 
37
	 * Ajoute un commentaire/determination si les objets fournis en paramètres sont valides
31
 
38
	 * pour l'afficher.
32
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
39
	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
33
	}
40
	 * @param array $parametres les paramètres situés après le ? dans l'url
-
 
41
	 * */
34
 
42
	public function ajouter($ressources, $parametres) {
35
	public function ajouter($parametres) {
43
		$this->initialiserRessourcesEtParametres($ressources, $parametres);
-
 
44
 
-
 
45
		// Gestion des configuration du script
36
		$this->parametres = $parametres;
Line 46... Line 37...
46
		$this->configurer();
37
		$this->verifierParametres();
47
		$this->verifierConfiguration();
38
 
48
		$utilisateur = $this->chercherUtilisateur();
39
		$this->completerParametresUtilisateur();
Line 49... Line 40...
49
		$proposition_initiale = $this->verifierEtCreerPropositionDeterminationInitiale();
40
		$this->gererPropositionInitiale();
50
		$insertion = $this->insererCommentaire($utilisateur);
41
		$idCommentaireAjoute = $this->insererCommentaire();
Line 51... Line -...
51
 
-
 
52
		// Mettre en forme le résultat et l'envoyer pour affichage
-
 
53
		$resultat = new ResultatService();
-
 
54
		$resultat->corps = array('id_commentaire' => $insertion);
-
 
55
 
-
 
56
		return $resultat;
-
 
57
	}
-
 
58
 
-
 
59
	//ce_observation=728176&texte=ABC&auteur.id=11623&auteur.prenom=grégoire&auteur.nom=duché&auteur.courriel=gregoire@tela-botanica.org
-
 
60
	private function initialiserRessourcesEtParametres($ressources, $parametres) {
-
 
61
		$this->ressources = $ressources;
-
 
62
		$this->parametres = $parametres;
-
 
63
	}
-
 
64
 
-
 
65
	/*-------------------------------------------------------------------------------
-
 
66
	 							CONFIGURATION DU SERVICE
-
 
67
	 --------------------------------------------------------------------------------*/
-
 
68
	/**
-
 
69
	 * Initialiser les attributs de la classe avec les parametres
-
 
70
	 * */
-
 
71
	public function configurer() {
42
 
72
		$this->mappingCommentaire = $this->conteneur->getParametre('mapping_commentaire');
43
		// Mettre en forme le résultat et l'envoyer pour affichage
Line 73... Line -...
73
		//TODO : Gérer le cas d'une proposition
-
 
74
	}
-
 
75
 
-
 
76
	/**
-
 
77
	 * Vérifier que le service est bien configuré
-
 
78
	 * */
-
 
79
	public function verifierConfiguration() {
-
 
80
		$erreurs = array();
-
 
81
 
-
 
82
		if (empty($this->mappingCommentaire)) {
-
 
83
			$erreurs[] = "Le fichier de configuration ne contient pas le tableau [mapping_commentaire] ou celui-ci est vide.";
-
 
84
		}
44
		$resultat = new ResultatService();
85
 
45
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
86
		$parametresPossibles = array_values($this->mappingCommentaire);
46
 
Line 87... Line 47...
87
		foreach ($this->parametres as $nomParam => $valeur) {
47
		return $resultat;
88
			if (!in_array($nomParam, $parametresPossibles)) {
48
	}
89
				$erreurs[] = "Paramètre « {$nomParam} » non autorisé.";
49
 
90
			}
50
	private function verifierParametres() {
91
		}
-
 
92
 
51
		$erreurs = array();
93
		if (!isset($this->parametres['observation'])) {
52
 
-
 
53
		if (!isset($this->parametres['observation'])) {
94
			$erreurs[] = "Impossible d'ajouter un commentaire sans observation.";
54
			$erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
95
		}
-
 
96
 
55
		}
-
 
56
 
-
 
57
		if (!isset($this->parametres['auteur.id'])) {
-
 
58
			$paramsAuteur = array('auteur.nom', 'auteur.prenom', 'auteur.courriel');
97
		if (!isset($this->parametres['auteur.id'])) {
59
			$paramsAuteurManquant = array();
98
			if (!isset($this->parametres['auteur.nom'])) {
60
			foreach ($paramsAuteur as $param) {
99
				$erreurs[] = "Pas de nom d'utilisateur donné.";
61
				if (!isset($this->parametres[$param])) {
Line 100... Line 62...
100
			}
62
					$paramsAuteurManquant[] = $param;
101
 
63
				}
102
			if (!isset($this->parametres['auteur.prenom'])) {
64
			}
Line 103... Line 65...
103
				$erreurs[] = "Pas de prenom d'utilisateur donné.";
65
			if (!empty($paramsAuteurManquant)) {
104
			}
-
 
105
 
66
				$msgAuteurTpl = "Si le parametre 'auteur.id' n'est pas utilisé, il est nécessaire d'indiquer les ".
106
			if (!isset($this->parametres['auteur.courriel'])) {
-
 
107
				$erreurs[] = "Pas de courriel d'utilisateur donné.";
67
				"nom (paramètre 'auteur.nom'), prénom (paramètre 'auteur.prenom') et courriel ".
108
			}
-
 
109
		}
68
				"(paramètre 'auteur.courriel') de l'auteur.\nLes paramètres suivant sont abscents : %s\n";
110
 
69
				$erreurs[] = sprintf($msgAuteurTpl, implode(', ', $paramsAuteurManquant));
111
		if (isset($this->parametres['nom_sel']) &&trim($this->parametres['nom_sel']) == '') {
70
			}
Line 112... Line -...
112
			$erreurs[] = "S'il est présent le paramètre «nom_sel» ne peut pas être vide.";
-
 
113
		}
-
 
114
 
-
 
115
		//TODO : Gérer le cas d'une proposition
-
 
116
 
-
 
117
		if (!empty($erreurs)) {
-
 
118
			$e = implode("\n", $erreurs);
-
 
119
			$msg = "Erreur de configuration :\n $e";
71
		}
120
			echo $msg;
-
 
121
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
-
 
122
		}
-
 
123
	}
-
 
124
 
-
 
125
	/*-------------------------------------------------------------------------------
-
 
126
							   INSERTION DES COMMENTAIRES
-
 
127
	--------------------------------------------------------------------------------*/
-
 
128
	/**
-
 
129
	 * Trouver l'utilisateur en fonction des paramètres ou de la base de données si le nom, prénom et courriel ne sont pas donnés
-
 
130
	 * @return le tableau utilisateur
72
 
131
	 * */
-
 
132
	private function chercherUtilisateur() {
-
 
133
		$utilisateur = array();
-
 
134
 
73
		if (isset($this->parametres['nom_sel']) && trim($this->parametres['nom_sel']) == '' ) {
135
		// Si l'id est fournit, on récupère les informations de l'utilisateur dans la base de données
-
 
136
		// Sinon, on récupère les informations depuis le tableau Commentaire et on vérifie leur cohérence
74
			$erreurs[] = "S'il est présent le paramètre «nom_sel» ne peut pas être vide.";
137
		if (isset($this->parametres['auteur.id'])) {
75
		}
138
			$requete = "SELECT id_utilisateur as 'auteur.id', nom as 'auteur.nom', prenom as 'auteur.prenom', courriel as 'auteur.courriel' ".
-
 
139
				'FROM del_utilisateur '.
-
 
140
				'WHERE id_utilisateur = '.$this->bdd->proteger($this->parametres['auteur.id']);
-
 
141
			$utilisateur = $this->bdd->recuperer($requete);
76
 
142
		} else {
77
		//TODO : Gérer le cas d'une proposition
-
 
78
		if (!empty($erreurs)) {
Line -... Line 79...
-
 
79
			$msg = "Erreur de configuration :\n".implode("\n\n", $erreurs);
-
 
80
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
81
		}
-
 
82
	}
-
 
83
 
-
 
84
	private function completerParametresUtilisateur() {
-
 
85
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
143
			if (isset($this->parametres['auteur.nom']) && isset($this->parametres['auteur.prenom']) && isset($this->parametres['auteur.courriel'])) {
86
		if ($utilisateur !== false) {
144
				$utilisateur['auteur.nom'] = $this->parametres['auteur.nom'];
87
			foreach ($utilisateur as $param => $valeur) {
Line 145... Line -...
145
				$utilisateur['auteur.prenom'] = $this->parametres['auteur.prenom'];
-
 
146
				$utilisateur['auteur.courriel'] = $this->parametres['auteur.courriel'];
-
 
147
				if ($utilisateur_recherche = $this->estValideDansBdd($utilisateur)) {
-
 
148
					// si l'utilisateur est trouvé, on affecte son id au lieu du numéro temporaire
-
 
149
					$utilisateur = $utilisateur_recherche;
88
				$this->parametres[$param] = $valeur;
150
					$this->parametres['auteur.id'] = $utilisateur_recherche['auteur.id'];
89
			}
151
				}
90
		}
152
				// sinon pas d'erreur, on considere simplement que l'utilisateur
91
	}
Line 153... Line 92...
153
				// est un homonyme ou bien qu'il a décidé d'utiliser un autre mail
92
 
154
			}
93
	private function obtenirUtilisateurAvecId() {
155
		}
94
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
156
 
95
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
157
		return $utilisateur;
-
 
158
	}
96
			'FROM del_utilisateur '.
159
 
97
			"WHERE id_utilisateur = $auteurIdP ".
160
	/**
98
			' -- '.__FILE__.' : '.__LINE__;
161
	 * Vérifier que les informations saisies pour un utilisateur sont valides pour la bdd
-
 
162
	 * @param $utilisateur array le tableau de l'utilisateur
-
 
163
	 * */
-
 
164
	private function estValideDansBdd($utilisateur) {
-
 
165
		$nom = $this->bdd->proteger($utilisateur['auteur.nom']);
-
 
166
		$prenom = $this->bdd->proteger($utilisateur['auteur.prenom']);
-
 
167
		$courriel = $this->bdd->proteger($utilisateur['auteur.courriel']);
-
 
168
 
-
 
169
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
-
 
170
			"	courriel AS 'auteur.courriel' ".
-
 
171
			'FROM del_utilisateur '.
-
 
172
			"WHERE courriel = $courriel ".
-
 
173
			"	AND nom = $nom ".
-
 
174
			"	AND prenom = $prenom ";
-
 
175
		$utilisateurBdd = $this->bdd->recuperer($requete);
-
 
176
		return $utilisateurBdd;
-
 
177
	}
-
 
178
 
-
 
179
	/**
-
 
180
	 * Insère un commentaire dans la table
-
 
181
	 * @param $utilisateur array la liste des paramètres utilisateur
99
		$utilisateur = $this->bdd->recuperer($requete);
Line 182... Line 100...
182
	 * */
100
		return $utilisateur;
183
	private function insererCommentaire($utilisateur) {
-
 
184
		$requete = 'INSERT INTO del_commentaire '.
101
	}
185
			'('.$this->genererEntete($utilisateur).') '.
102
 
186
			'VALUES ('.$this->genererValues().')';
103
	private function obtenirUtilisateurSansId() {
187
 
104
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
188
		$retour = $this->bdd->requeter($requete);
105
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
Line 189... Line 106...
189
		if ($retour == null) {
106
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
-
 
107
 
190
			$e = "Erreur inopinée lors de l'insertion";
108
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
191
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
109
			"courriel AS 'auteur.courriel' ".
192
		}
110
			'FROM del_utilisateur '.
193
 
111
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
-
 
112
			' -- '.__FILE__.' : '.__LINE__;
194
		$retour = $this->bdd->recupererIdDernierAjout();
113
		$utilisateur = $this->bdd->recuperer($requete);
195
 
114
		return $utilisateur;
196
		return $retour;
115
	}
Line 197... Line 116...
197
	}
116
 
198
 
117
	private function gererPropositionInitiale() {
199
	private function verifierEtCreerPropositionDeterminationInitiale() {
118
		if ($this->verifierExistencePropositionInitiale() === false) {
200
		$id_observation = $this->parametres['observation'];
119
			$this->creerPropositionInitiale();
201
		$proposition_existe = $this->propositionInitialeExiste($id_observation);
120
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
202
		if (!$proposition_existe) {
121
		}
203
			$this->creerPropositionAPartirObservation($id_observation);
122
	}
204
		}
123
 
205
	}
124
	private function verifierExistencePropositionInitiale() {
206
 
125
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
207
	private function propositionInitialeExiste($id_observation) {
126
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
208
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
127
			'FROM del_commentaire '.
209
			'FROM del_commentaire '.
-
 
-
 
128
			"WHERE ce_observation = $idObsP ".
210
			"WHERE ce_observation = $id_observation ".
129
			'	AND proposition_initiale = 1 '.
211
			'	AND proposition_initiale = 1';
130
			' -- '.__FILE__.' : '.__LINE__;
212
		$resultat = $this->bdd->recuperer($requete);
131
		$resultat = $this->bdd->recuperer($requete);
Line 213... Line 132...
213
		return $resultat['existe'] == 1;
132
		return $resultat['existe'] == 1;
214
	}
133
	}
-
 
134
 
-
 
135
	private function creerPropositionInitiale() {
-
 
136
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
Line -... Line 137...
-
 
137
		$requete = 'INSERT IGNORE INTO del_commentaire '.
215
 
138
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
216
	private function creerPropositionAPartirObservation($id_observation) {
139
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
217
		$idObs =  $this->bdd->proteger($id_observation);
140
			'SELECT id_observation, ce_utilisateur, prenom, nom, '.
218
		$insertion = 'INSERT IGNORE INTO del_commentaire '.
141
			'		courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
219
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
-
 
220
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
142
			"		nt, famille, nom_referentiel, NOW(), '1' ".
Line -... Line 143...
-
 
143
			'FROM del_observation AS do '.
221
			'SELECT id_observation, ce_utilisateur, prenom, nom, '.
144
			'	LEFT JOIN del_utilisateur AS du '.
-
 
145
			'		ON do.ce_utilisateur = du.id_utilisateur '.
-
 
146
			"WHERE id_observation = $idObsP ".
-
 
147
			' -- '.__FILE__.' : '.__LINE__;
-
 
148
		$resultat = $this->bdd->executer($requete);
222
			'		courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
149
		return $resultat;
Line 223... Line 150...
223
			"		nt, famille, nom_referentiel, NOW(), '1' ".
150
	}
-
 
151
 
-
 
152
	private function insererCommentaire() {
-
 
153
		$champs = $this->creerEnteteChamps();
-
 
154
		$values = $this->creerClauseValues();
224
			'FROM del_observation AS do '.
155
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
225
			'	LEFT JOIN del_utilisateur AS du '.
156
			' -- '.__FILE__.' : '.__LINE__;
226
			'		ON do.ce_utilisateur = du.id_utilisateur '.
157
 
-
 
158
		$retour = $this->bdd->executer($requete);
227
			"WHERE id_observation = $idObs ";
159
		if ($retour == null) {
-
 
160
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
-
 
161
			$msg = sprintf($msgTpl, $this->parametres['observation']);
-
 
162
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
-
 
163
		}
-
 
164
 
-
 
165
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
228
 
166
		return $idCommentaire;
229
		$resultat = $this->bdd->requeter($insertion);
167
	}
230
		return $resultat;
-
 
231
	}
168
 
232
 
169
	private function creerEnteteChamps() {
233
	private function genererEntete($utilisateur) {
170
		return $this->creerSuiteChampsOuValeurs('champs');
234
		$this->parametres = array_merge($this->parametres, $utilisateur);
171
	}