Subversion Repositories eFlore/Applications.del

Rev

Rev 1805 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
858 gduche 1
<?php
2
// declare(encoding='UTF-8');
3
/**
1793 jpm 4
 * Permet d'ajouter un commentaire.
858 gduche 5
 *
1795 jpm 6
 * @category   DEL
7
 * @package    Services
1793 jpm 8
 * @subpackage Commentaires
1795 jpm 9
 * @version    0.1
10
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
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>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
858 gduche 16
 */
17
 
18
class AjouterCommentaire {
1299 jpm 19
 
858 gduche 20
	private $conteneur;
21
	private $navigation;
22
	private $bdd;
23
	private $parametres = array();
1299 jpm 24
 
1795 jpm 25
	private $mapping = array();
1805 jpm 26
	private $erreurs = array();
858 gduche 27
 
1793 jpm 28
	public function __construct(Conteneur $conteneur) {
29
		$this->conteneur = $conteneur;
1795 jpm 30
		$this->navigation =  $this->conteneur->getNavigation();
1793 jpm 31
		$this->bdd = $this->conteneur->getBdd();
1795 jpm 32
 
33
		$this->mapping = $this->conteneur->getParametreTableau('commentaires.mapping');
858 gduche 34
	}
1299 jpm 35
 
1795 jpm 36
	public function ajouter($parametres) {
37
		$this->parametres = $parametres;
38
		$this->verifierParametres();
1299 jpm 39
 
1795 jpm 40
		$this->completerParametresUtilisateur();
41
		$this->gererPropositionInitiale();
42
		$idCommentaireAjoute = $this->insererCommentaire();
1299 jpm 43
 
883 aurelien 44
		// Mettre en forme le résultat et l'envoyer pour affichage
858 gduche 45
		$resultat = new ResultatService();
1795 jpm 46
		$resultat->corps = array('id_commentaire' => $idCommentaireAjoute);
1299 jpm 47
 
858 gduche 48
		return $resultat;
49
	}
1299 jpm 50
 
1795 jpm 51
	private function verifierParametres() {
858 gduche 52
		if (!isset($this->parametres['observation'])) {
1805 jpm 53
			$this->erreurs[] = "Impossible d'ajouter un commentaire sans identifiant d'observation (paramètre 'observation').";
1299 jpm 54
		}
55
 
874 gduche 56
		if (!isset($this->parametres['auteur.id'])) {
1805 jpm 57
			$this->verifierParamsAuteurAnonyme();
1299 jpm 58
		}
59
 
1805 jpm 60
		$this->verifierParamsNonVide();
61
 
62
		if (isset($this->parametres['nom_sel_nn']) && !isset($this->parametres['nom_referentiel'])) {
63
			$this->erreurs[] = "Si le paramètre «nom_sel_nn» est présent, le paramètre «nom_referentiel» doit l'être aussi.";
883 aurelien 64
		}
1299 jpm 65
 
1805 jpm 66
		if (!empty($this->erreurs)) {
67
			$msg = "Erreur de configuration :\n".implode("\n\n", $this->erreurs);
1795 jpm 68
			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
858 gduche 69
		}
70
	}
1299 jpm 71
 
1805 jpm 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.";
94
			}
95
		}
96
	}
97
 
1795 jpm 98
	private function completerParametresUtilisateur() {
99
		$utilisateur =  (isset($this->parametres['auteur.id'])) ? $this->obtenirUtilisateurAvecId() : $this->obtenirUtilisateurSansId();
100
		if ($utilisateur !== false) {
101
			foreach ($utilisateur as $param => $valeur) {
102
				$this->parametres[$param] = $valeur;
1299 jpm 103
			}
858 gduche 104
		}
1795 jpm 105
	}
1299 jpm 106
 
1795 jpm 107
	private function obtenirUtilisateurAvecId() {
108
		$auteurIdP = $this->bdd->proteger($this->parametres['auteur.id']);
109
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', courriel AS 'auteur.courriel' ".
110
			'FROM del_utilisateur '.
111
			"WHERE id_utilisateur = $auteurIdP ".
112
			' -- '.__FILE__.' : '.__LINE__;
113
		$utilisateur = $this->bdd->recuperer($requete);
858 gduche 114
		return $utilisateur;
115
	}
1299 jpm 116
 
1795 jpm 117
	private function obtenirUtilisateurSansId() {
118
		$nomP = $this->bdd->proteger($this->parametres['auteur.nom']);
119
		$prenomP = $this->bdd->proteger($this->parametres['auteur.prenom']);
120
		$courrielP = $this->bdd->proteger($this->parametres['auteur.courriel']);
1299 jpm 121
 
122
		$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
1795 jpm 123
			"courriel AS 'auteur.courriel' ".
1299 jpm 124
			'FROM del_utilisateur '.
1795 jpm 125
			"WHERE courriel = $courrielP AND nom = $nomP AND prenom = $prenomP ".
126
			' -- '.__FILE__.' : '.__LINE__;
127
		$utilisateur = $this->bdd->recuperer($requete);
128
		return $utilisateur;
858 gduche 129
	}
1299 jpm 130
 
1795 jpm 131
	private function gererPropositionInitiale() {
1803 jpm 132
		if ($this->verifierExistencePropositionInitiale() === false) {
1795 jpm 133
			$this->creerPropositionInitiale();
134
			// TODO : en cas d'échec de la création de la proposition ajouter un log...
858 gduche 135
		}
136
	}
1299 jpm 137
 
1795 jpm 138
	private function verifierExistencePropositionInitiale() {
139
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
1299 jpm 140
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
141
			'FROM del_commentaire '.
1795 jpm 142
			"WHERE ce_observation = $idObsP ".
143
			'	AND proposition_initiale = 1 '.
144
			' -- '.__FILE__.' : '.__LINE__;
1251 aurelien 145
		$resultat = $this->bdd->recuperer($requete);
146
		return $resultat['existe'] == 1;
147
	}
1299 jpm 148
 
1795 jpm 149
	private function creerPropositionInitiale() {
150
		$idObsP =  $this->bdd->proteger($this->parametres['observation']);
151
		$requete = 'INSERT IGNORE INTO del_commentaire '.
1299 jpm 152
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
1301 jpm 153
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
1802 jpm 154
			'SELECT id_observation, ce_utilisateur, prenom, nom, courriel, nom_sel, '.
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), ".
156
			"IF(nt = 0, NULL, nt), IF(famille = '', NULL, famille), IF(nom_sel_nn = 0, NULL, nom_referentiel), NOW(), '1' ".
1299 jpm 157
			'FROM del_observation AS do '.
158
			'	LEFT JOIN del_utilisateur AS du '.
159
			'		ON do.ce_utilisateur = du.id_utilisateur '.
1795 jpm 160
			"WHERE id_observation = $idObsP ".
161
			' -- '.__FILE__.' : '.__LINE__;
162
		$resultat = $this->bdd->executer($requete);
1251 aurelien 163
		return $resultat;
164
	}
1299 jpm 165
 
1795 jpm 166
	private function insererCommentaire() {
167
		$champs = $this->creerEnteteChamps();
168
		$values = $this->creerClauseValues();
169
		$requete = "INSERT INTO del_commentaire (date, $champs) VALUES (NOW(), $values) ".
170
			' -- '.__FILE__.' : '.__LINE__;
1299 jpm 171
 
1795 jpm 172
		$retour = $this->bdd->executer($requete);
173
		if ($retour == null) {
174
			$msgTpl = "Erreur inopinée lors de l'insertion du commentaire lié à l'observation «%s».";
175
			$msg = sprintf($msgTpl, $this->parametres['observation']);
176
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
858 gduche 177
		}
1299 jpm 178
 
1795 jpm 179
		$idCommentaire = $this->bdd->recupererIdDernierAjout();
180
		return $idCommentaire;
858 gduche 181
	}
1299 jpm 182
 
1795 jpm 183
	private function creerEnteteChamps() {
184
		return $this->creerSuiteChampsOuValeurs('champs');
185
	}
186
 
187
	private function creerClauseValues() {
188
		return $this->creerSuiteChampsOuValeurs('valeurs');
189
	}
190
 
191
	private function creerSuiteChampsOuValeurs($mode) {
192
		$suite = array();
193
		foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
194
			if (isset($this->parametres[$nomAttributSortie]) && $this->parametres[$nomAttributSortie] != null) {
195
				if ($mode == 'valeurs') {
196
					$suite[] = $this->bdd->proteger($this->parametres[$nomAttributSortie]);
197
				} else if ($mode == 'champs') {
198
					$suite[] = $nomChampBdd;
199
				} else {
200
					$msg = "Erreur interne : mauvais paramètre passé à la méthode 'creerSuiteChampsOuValeurs'";
201
					throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
202
				}
858 gduche 203
			}
204
		}
1795 jpm 205
		return implode(', ', $suite);
858 gduche 206
	}
1793 jpm 207
}