Subversion Repositories eFlore/Applications.del

Rev

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