Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1803 Rev 1805
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
 
27
 
27
	public function __construct(Conteneur $conteneur) {
28
	public function __construct(Conteneur $conteneur) {
28
		$this->conteneur = $conteneur;
29
		$this->conteneur = $conteneur;
29
		$this->navigation =  $this->conteneur->getNavigation();
30
		$this->navigation =  $this->conteneur->getNavigation();
30
		$this->bdd = $this->conteneur->getBdd();
31
		$this->bdd = $this->conteneur->getBdd();
31
 
32
 
32
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
33
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
33
	}
34
	}
34
 
35
 
35
	public function ajouter($parametres) {
36
	public function ajouter($parametres) {
36
		$this->parametres = $parametres;
37
		$this->parametres = $parametres;
37
		$this->verifierParametres();
38
		$this->verifierParametres();
38
 
39
 
39
		$this->completerParametresUtilisateur();
40
		$this->completerParametresUtilisateur();
40
		$this->gererPropositionInitiale();
41
		$this->gererPropositionInitiale();
41
		$idCommentaireAjoute = $this->insererCommentaire();
42
		$idCommentaireAjoute = $this->insererCommentaire();
42
 
43
 
43
		// Mettre en forme le résultat et l'envoyer pour affichage
44
		// Mettre en forme le résultat et l'envoyer pour affichage
44
		$resultat = new ResultatService();
45
		$resultat = new ResultatService();
45
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
46
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
46
 
47
 
47
		return $resultat;
48
		return $resultat;
48
	}
49
	}
49
 
50
 
50
	private function verifierParametres() {
51
	private function verifierParametres() {
51
		$erreurs = array();
-
 
52
 
-
 
53
		if (!isset($this->parametres['observation'])) {
52
		if (!isset($this->parametres['observation'])) {
54
			$erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
53
			$this->erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
55
		}
54
		}
56
 
55
 
57
		if (!isset($this->parametres['auteur.id'])) {
56
		if (!isset($this->parametres['auteur.id'])) {
58
			$paramsAuteur = array('auteur.nom', 'auteur.prenom', 'auteur.courriel');
-
 
59
			$paramsAuteurManquant = array();
-
 
60
			foreach ($paramsAuteur as $param) {
-
 
61
				if (!isset($this->parametres[$param])) {
-
 
62
					$paramsAuteurManquant[] = $param;
-
 
63
				}
-
 
64
			}
-
 
65
			if (!empty($paramsAuteurManquant)) {
57
			$this->verifierParamsAuteurAnonyme();
66
				$msgAuteurTpl = "Si le parametre 'auteur.id' n'est pas utilisé, il est nécessaire d'indiquer les ".
-
 
67
				"nom (paramètre 'auteur.nom'), prénom (paramètre 'auteur.prenom') et courriel ".
-
 
68
				"(paramètre 'auteur.courriel') de l'auteur.\nLes paramètres suivant sont abscents : %s\n";
-
 
69
				$erreurs[] = sprintf($msgAuteurTpl, implode(', ', $paramsAuteurManquant));
-
 
70
			}
-
 
71
		}
58
		}
-
 
59
 
-
 
60
		$this->verifierParamsNonVide();
72
 
61
 
73
		if (isset($this->parametres['nom_sel']) && trim($this->parametres['nom_sel']) == '' ) {
62
		if (isset($this->parametres['nom_sel_nn']) && !isset($this->parametres['nom_referentiel'])) {
74
			$erreurs[] = "S'il est présent le paramètre «nom_sel» ne peut pas être vide.";
63
			$this->erreurs[] = "Si le paramètre «nom_sel_nn» est présent, le paramètre «nom_referentiel» doit l'être aussi.";
75
		}
-
 
76
 
64
		}
77
		//TODO : Gérer le cas d'une proposition
65
 
78
		if (!empty($erreurs)) {
66
		if (!empty($this->erreurs)) {
79
			$msg = "Erreur de configuration :\n".implode("\n\n", $erreurs);
67
			$msg = "Erreur de configuration :\n".implode("\n\n", $this->erreurs);
-
 
68
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
-
 
69
		}
-
 
70
	}
-
 
71
 
-
 
72
	private function verifierParamsAuteurAnonyme() {
-
 
73
		$paramsAuteur = array('auteur.nom', 'auteur.prenom', 'auteur.courriel');
-
 
74
		$paramsAuteurManquant = array();
-
 
75
		foreach ($paramsAuteur as $param) {
-
 
76
			if (!isset($this->parametres[$param])) {
-
 
77
				$paramsAuteurManquant[] = $param;
-
 
78
			}
-
 
79
		}
-
 
80
 
-
 
81
		if (!empty($paramsAuteurManquant)) {
-
 
82
			$msgAuteurTpl = "Si le parametre 'auteur.id' n'est pas utilisé, il est nécessaire d'indiquer les ".
-
 
83
			"nom (paramètre 'auteur.nom'), prénom (paramètre 'auteur.prenom') et courriel ".
-
 
84
			"(paramètre 'auteur.courriel') de l'auteur.\nLes paramètres suivant sont abscents : %s\n";
-
 
85
			$this->erreurs[] = sprintf($msgAuteurTpl, implode(', ', $paramsAuteurManquant));
-
 
86
		}
-
 
87
	}
-
 
88
 
-
 
89
	private function verifierParamsNonVide() {
-
 
90
		$paramsNonVide = array('nom_sel', 'nom_referentiel', 'nom_sel_nn');
-
 
91
		foreach ($paramsNonVide as $param) {
-
 
92
			if (isset($this->parametres[$param]) && trim($this->parametres[$param]) == '' ) {
-
 
93
				$this->erreurs[] = "S'il est présent le paramètre «$param» ne peut pas être vide.";
80
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
94
			}
81
		}
95
		}
82
	}
96
	}
83
 
97
 
84
	private function completerParametresUtilisateur() {
98
	private function completerParametresUtilisateur() {
85
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
99
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
86
		if ($utilisateur !== false) {
100
		if ($utilisateur !== false) {
87
			foreach ($utilisateur as $param => $valeur) {
101
			foreach ($utilisateur as $param => $valeur) {
88
				$this->parametres[$param] = $valeur;
102
				$this->parametres[$param] = $valeur;
89
			}
103
			}
90
		}
104
		}
91
	}
105
	}
92
 
106
 
93
	private function obtenirUtilisateurAvecId() {
107
	private function obtenirUtilisateurAvecId() {
94
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
108
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
95
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
109
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
96
			'FROM del_utilisateur '.
110
			'FROM del_utilisateur '.
97
			"WHERE id_utilisateur = $auteurIdP ".
111
			"WHERE id_utilisateur = $auteurIdP ".
98
			' -- '.__FILE__.' : '.__LINE__;
112
			' -- '.__FILE__.' : '.__LINE__;
99
		$utilisateur = $this->bdd->recuperer($requete);
113
		$utilisateur = $this->bdd->recuperer($requete);
100
		return $utilisateur;
114
		return $utilisateur;
101
	}
115
	}
102
 
116
 
103
	private function obtenirUtilisateurSansId() {
117
	private function obtenirUtilisateurSansId() {
104
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
118
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
105
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
119
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
106
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
120
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
107
 
121
 
108
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
122
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
109
			"courriel AS 'auteur.courriel' ".
123
			"courriel AS 'auteur.courriel' ".
110
			'FROM del_utilisateur '.
124
			'FROM del_utilisateur '.
111
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
125
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
112
			' -- '.__FILE__.' : '.__LINE__;
126
			' -- '.__FILE__.' : '.__LINE__;
113
		$utilisateur = $this->bdd->recuperer($requete);
127
		$utilisateur = $this->bdd->recuperer($requete);
114
		return $utilisateur;
128
		return $utilisateur;
115
	}
129
	}
116
 
130
 
117
	private function gererPropositionInitiale() {
131
	private function gererPropositionInitiale() {
118
		if ($this->verifierExistencePropositionInitiale() === false) {
132
		if ($this->verifierExistencePropositionInitiale() === false) {
119
			$this->creerPropositionInitiale();
133
			$this->creerPropositionInitiale();
120
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
134
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
121
		}
135
		}
122
	}
136
	}
123
 
137
 
124
	private function verifierExistencePropositionInitiale() {
138
	private function verifierExistencePropositionInitiale() {
125
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
139
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
126
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
140
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
127
			'FROM del_commentaire '.
141
			'FROM del_commentaire '.
128
			"WHERE ce_observation = $idObsP ".
142
			"WHERE ce_observation = $idObsP ".
129
			'	AND proposition_initiale = 1 '.
143
			'	AND proposition_initiale = 1 '.
130
			' -- '.__FILE__.' : '.__LINE__;
144
			' -- '.__FILE__.' : '.__LINE__;
131
		$resultat = $this->bdd->recuperer($requete);
145
		$resultat = $this->bdd->recuperer($requete);
132
		return $resultat['existe'] == 1;
146
		return $resultat['existe'] == 1;
133
	}
147
	}
134
 
148
 
135
	private function creerPropositionInitiale() {
149
	private function creerPropositionInitiale() {
136
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
150
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
137
		$requete = 'INSERT IGNORE INTO del_commentaire '.
151
		$requete = 'INSERT IGNORE INTO del_commentaire '.
138
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
152
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
139
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
153
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
140
			'SELECT id_observation, ce_utilisateur, prenom, nom, courriel, nom_sel, '.
154
			'SELECT id_observation, ce_utilisateur, prenom, nom, courriel, nom_sel, '.
141
			"IF(nom_sel_nn = 0, NULL, nom_sel_nn), IF(nom_ret = '', NULL, nom_ret), IF(nom_ret_nn = 0, NULL, nom_ret_nn), ".
155
			"IF(nom_sel_nn = 0, NULL, nom_sel_nn), IF(nom_ret = '', NULL, nom_ret), IF(nom_ret_nn = 0, NULL, nom_ret_nn), ".
142
			"IF(nt = 0, NULL, nt), IF(famille = '', NULL, famille), IF(nom_sel_nn = 0, NULL, nom_referentiel), NOW(), '1' ".
156
			"IF(nt = 0, NULL, nt), IF(famille = '', NULL, famille), IF(nom_sel_nn = 0, NULL, nom_referentiel), NOW(), '1' ".
143
			'FROM del_observation AS do '.
157
			'FROM del_observation AS do '.
144
			'	LEFT JOIN del_utilisateur AS du '.
158
			'	LEFT JOIN del_utilisateur AS du '.
145
			'		ON do.ce_utilisateur = du.id_utilisateur '.
159
			'		ON do.ce_utilisateur = du.id_utilisateur '.
146
			"WHERE id_observation = $idObsP ".
160
			"WHERE id_observation = $idObsP ".
147
			' -- '.__FILE__.' : '.__LINE__;
161
			' -- '.__FILE__.' : '.__LINE__;
148
		$resultat = $this->bdd->executer($requete);
162
		$resultat = $this->bdd->executer($requete);
149
		return $resultat;
163
		return $resultat;
150
	}
164
	}
151
 
165
 
152
	private function insererCommentaire() {
166
	private function insererCommentaire() {
153
		$champs = $this->creerEnteteChamps();
167
		$champs = $this->creerEnteteChamps();
154
		$values = $this->creerClauseValues();
168
		$values = $this->creerClauseValues();
155
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
169
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
156
			' -- '.__FILE__.' : '.__LINE__;
170
			' -- '.__FILE__.' : '.__LINE__;
157
 
171
 
158
		$retour = $this->bdd->executer($requete);
172
		$retour = $this->bdd->executer($requete);
159
		if ($retour == null) {
173
		if ($retour == null) {
160
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
174
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
161
			$msg = sprintf($msgTpl, $this->parametres['observation']);
175
			$msg = sprintf($msgTpl, $this->parametres['observation']);
162
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
176
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
163
		}
177
		}
164
 
178
 
165
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
179
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
166
		return $idCommentaire;
180
		return $idCommentaire;
167
	}
181
	}
168
 
182
 
169
	private function creerEnteteChamps() {
183
	private function creerEnteteChamps() {
170
		return $this->creerSuiteChampsOuValeurs('champs');
184
		return $this->creerSuiteChampsOuValeurs('champs');
171
	}
185
	}
172
 
186
 
173
	private function creerClauseValues() {
187
	private function creerClauseValues() {
174
		return $this->creerSuiteChampsOuValeurs('valeurs');
188
		return $this->creerSuiteChampsOuValeurs('valeurs');
175
	}
189
	}
176
 
190
 
177
	private function creerSuiteChampsOuValeurs($mode) {
191
	private function creerSuiteChampsOuValeurs($mode) {
178
		$suite = array();
192
		$suite = array();
179
		foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
193
		foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
180
			if (isset($this->parametres[$nomAttributSortie]) && $this->parametres[$nomAttributSortie] != null) {
194
			if (isset($this->parametres[$nomAttributSortie]) && $this->parametres[$nomAttributSortie] != null) {
181
				if ($mode == 'valeurs') {
195
				if ($mode == 'valeurs') {
182
					$suite[] = $this->bdd->proteger($this->parametres[$nomAttributSortie]);
196
					$suite[] = $this->bdd->proteger($this->parametres[$nomAttributSortie]);
183
				} else if ($mode == 'champs') {
197
				} else if ($mode == 'champs') {
184
					$suite[] = $nomChampBdd;
198
					$suite[] = $nomChampBdd;
185
				} else {
199
				} else {
186
					$msg = "Erreur interne : mauvais paramètre passé à la méthode 'creerSuiteChampsOuValeurs'";
200
					$msg = "Erreur interne : mauvais paramètre passé à la méthode 'creerSuiteChampsOuValeurs'";
187
					throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
201
					throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
188
				}
202
				}
189
			}
203
			}
190
		}
204
		}
191
		return implode(', ', $suite);
205
		return implode(', ', $suite);
192
	}
206
	}
193
}
207
}