Subversion Repositories eFlore/Applications.del

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1047 aurelien 1
<?php
1820 jpm 2
// declare(encoding='UTF-8');
1047 aurelien 3
/**
4
 * Service fournissant des informations concernant les commentaire de DEL au format RSS1, RSS2 ou ATOM.
1284 jpm 5
 *
1820 jpm 6
 * @category   DEL
7
 * @package    Services
8
 * @subpackage Syndication
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>
1047 aurelien 16
 */
17
class SyndicationCommentaires {
1284 jpm 18
 
1049 aurelien 19
	private $mappingFiltre = array();
1047 aurelien 20
	private $conteneur = null;
1793 jpm 21
	private $bdd = null;
1055 aurelien 22
	private $navigation = null;
1284 jpm 23
 
1047 aurelien 24
	public function __construct(Conteneur $conteneur = null) {
25
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
1049 aurelien 26
		$this->conteneur->chargerConfiguration('config_syndication_commentaires.ini');
27
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
1806 jpm 28
		$this->bdd = $this->conteneur->getBdd();
29
		$this->navigation = $this->conteneur->getNavigation();
1047 aurelien 30
	}
1284 jpm 31
 
32
	public function consulter($params = array()) {
33
		$this->verifierConfiguration();
34
 
1055 aurelien 35
		if ($this->fluxAdminDemande()) {
36
			$this->demanderAutorisationAdmin();
1284 jpm 37
		}
38
 
1047 aurelien 39
		$donnees_brutes = $this->getDerniersCommentaires();
1284 jpm 40
		$commentaires_formates = $this->formaterPourRss($donnees_brutes) ;
1047 aurelien 41
		return $commentaires_formates;
42
	}
1284 jpm 43
 
1049 aurelien 44
	/**
45
	* Vérifier que le service est bien configuré
46
	* */
47
	public function verifierConfiguration() {
48
		$erreurs = array();
1284 jpm 49
 
1049 aurelien 50
		if (empty($this->mappingFiltre)) {
1307 jpm 51
			$erreurs[] = 'Le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide.';
1049 aurelien 52
		}
1284 jpm 53
 
1049 aurelien 54
		if (!empty($erreurs)) {
55
			$e = 'Erreur lors de la configuration : '."\n";
56
			$e .= implode("\n", $erreurs);
57
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
58
		}
59
	}
1284 jpm 60
 
1055 aurelien 61
	/**
62
	 * Verifier si le flux admin est demande
63
	 */
64
	private function fluxAdminDemande() {
1284 jpm 65
		return $this->conteneur->getParametre('admin') != null && $this->conteneur->getParametre('admin') == 1;
1055 aurelien 66
	}
1284 jpm 67
 
1055 aurelien 68
	private function demanderAutorisationAdmin() {
1602 jpm 69
		$verification = $this->conteneur->getControleAcces();
1055 aurelien 70
		$verification->demanderAuthentificationAdmin();
71
	}
1284 jpm 72
 
1047 aurelien 73
	private function formaterPourRss($elements) {
74
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
75
		foreach ($elements as $element) {
76
			$identifiants[$element['id_commentaire']] = $element['id_commentaire'];
77
		}
78
		foreach ($elements as $element) {
79
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
80
		}
81
		return $donnees;
82
	}
1284 jpm 83
 
1047 aurelien 84
	private function construireDonneesCommunesAuFlux($infos) {
85
		$donnees = array();
1307 jpm 86
		$donnees['guid'] = htmlspecialchars($this->creerUrlService());
1284 jpm 87
		$donnees['titre'] = 'identiPlante : commentaires et propositions';
88
		$donnees['description'] = 'Ce flux regroupe les dernières déterminations et commentaires rédigés dans l\'application identiPlante';
1307 jpm 89
		$donnees['lien_service'] = htmlspecialchars($this->creerUrlService());
1661 jpm 90
		$donnees['lien_del'] = $this->conteneur->getParametre('obsAppliLien');
1047 aurelien 91
		$donnees['editeur'] = $this->conteneur->getParametre('editeur');
92
		$derniere_info_en_date = reset($infos);
1304 jpm 93
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($derniere_info_en_date['date']);
1047 aurelien 94
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
95
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
96
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
97
		$donnees['annee_courante'] = date('Y');
98
		$donnees['generateur'] = 'DEL - SyndicationCommentaire';
99
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
1284 jpm 100
		return $donnees;
1047 aurelien 101
	}
1284 jpm 102
 
1292 jpm 103
	private function creerUrlService() {
104
		$url_service = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
105
		return $url_service;
106
	}
107
 
1047 aurelien 108
	private function construireDonneesCommunesAuxItems($info) {
109
		$item = array();
1304 jpm 110
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date']);
1047 aurelien 111
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
112
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
113
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
114
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
115
		$item['titre'] = $this->creerTitre($info);
116
		$item['guid'] = $this->creerGuidItem($info);
117
		$item['lien'] = $this->creerLienItem($info);
118
		$item['categorie'] = $this->creerCategorie($item);
119
		$item['description'] = $this->creerDescription($info, $item);
120
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
1294 jpm 121
		$item['modifier_par'] = $this->creerAuteur($info);
1047 aurelien 122
		return $item;
123
	}
1284 jpm 124
 
1304 jpm 125
	protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){
1318 jpm 126
		$timestamp = 0;
127
		// Le date de 1970-01-01 pose problème dans certains lecteur de Flux, on met donc la date de création de Tela
128
		$date_heure_mysql = ($date_heure_mysql == '0000-00-00 00:00:00') ? '1999-12-14 00:00:00' : $date_heure_mysql;
1304 jpm 129
		if ($date_heure_mysql != '0000-00-00 00:00:00') {
130
			$val = explode(' ', $date_heure_mysql);
131
			$date = explode('-', $val[0]);
132
			$heure = explode(':', $val[1]);
133
			$timestamp = mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
134
		}
135
		return $timestamp;
136
	}
137
 
1047 aurelien 138
	private function creerTitre($element) {
1290 jpm 139
		$nomPropose = htmlspecialchars($element['nom_sel']);
140
		$intitule = ($element['nom_sel'] != '') ? "Proposition $nomPropose" : 'Commentaire';
141
		$auteur = htmlspecialchars($this->creerAuteur($element));
142
		$nomSelActuel = htmlspecialchars($element['dob_nom_sel']);
1286 jpm 143
		$zoneGeo = htmlspecialchars((($element['dob_zone_geo'] != '') ? $element['dob_zone_geo'] : '?'));
144
		$dateObs = htmlspecialchars(strftime('%d %B %Y', strtotime($element['dob_date_observation'])));
145
 
1290 jpm 146
		$titre = "$intitule par $auteur pour $nomSelActuel à $zoneGeo le $dateObs";
1047 aurelien 147
		return $titre;
148
	}
1284 jpm 149
 
1292 jpm 150
	private function creerAuteur($info) {
1294 jpm 151
		$auteur = 'Anonyme';
152
		if ($info['utilisateur_prenom'] != '' && $info['utilisateur_nom'] != '') {
153
			$auteur = $info['utilisateur_prenom'].' '.$info['utilisateur_nom'];
154
		}
155
		return $auteur;
1292 jpm 156
	}
157
 
158
	private function creerGuidItem($element) {
1661 jpm 159
		$guid = sprintf($this->conteneur->getParametre('commentaireGuidTpl'), $element['id_commentaire']);
1292 jpm 160
		return $guid;
161
	}
162
 
163
	private function creerLienItem($element) {
1661 jpm 164
		$lien = sprintf($this->conteneur->getParametre('obsFicheTpl'), $element['dob_id_observation']);
1292 jpm 165
		return $lien;
166
	}
167
 
168
	private function creerCategorie($element) {
169
		$categorie = 'Commentaires';
170
		$categorie = htmlentities($categorie);
171
		return $categorie;
172
	}
173
 
1047 aurelien 174
	private function creerDescription($donnees, $item) {
1286 jpm 175
		$idCommentaire = $donnees['id_commentaire'];
1290 jpm 176
		$idObs = $donnees['dob_id_observation'];
177
		$nomPropose = ($donnees['nom_sel'] != '') ? htmlspecialchars($donnees['nom_sel']) : '';
1304 jpm 178
		$dateCommentaire = htmlspecialchars(strftime('%A %d %B %Y à %H:%M', $this->convertirDateHeureMysqlEnTimestamp($donnees['date'])));
1290 jpm 179
		$nomSelActuel = htmlspecialchars($donnees['dob_nom_sel']);
180
		$etreProposition = ($nomPropose != '') ? true : false;
1292 jpm 181
		$intitule = ($etreProposition) ? 'Proposition' : 'Commentaire';
1284 jpm 182
		$txt = ($donnees['texte'] != '') ? htmlspecialchars($donnees['texte']) : '';
183
		$auteur = htmlspecialchars($this->creerAuteur($donnees)).
184
			($this->fluxAdminDemande() ? ' ('.$donnees['utilisateur_courriel'].')' : '');
1292 jpm 185
		$lieuObs = htmlspecialchars((($donnees['dob_zone_geo'] != '') ? $donnees['dob_zone_geo'] : '?'));
186
		$dateObs = htmlspecialchars(str_replace(' 00:00:00', '', $donnees['dob_date_observation']));
187
		$observateur = htmlspecialchars($this->creerObservateur($donnees));
1284 jpm 188
 
1292 jpm 189
		$contenuCommentaire = '';
1285 jpm 190
		if ($etreProposition) {
1292 jpm 191
			$contenuCommentaire =
192
				'<li><span class="champ">'."Nom proposé :</span> <em>$nomPropose</em></li>".
193
				((!empty($txt)) ? '<li><span class="champ">'."Argumentaire :</span> $txt</li>" : '').
194
				'<li><span class="champ">'."Auteur de la proposition :</span> $auteur</li>".
195
				'<li><span class="champ">'."Proposé le :</span> $dateCommentaire</li>";
1285 jpm 196
		} else {
1292 jpm 197
			$contenuCommentaire =
198
				'<li><span class="champ">'."Commentaire #$idCommentaire :</span> <pre>$txt</pre></li>".
199
				'<li><span class="champ">'."Auteur du commentaire :</span> $auteur</li>".
200
				'<li><span class="champ">'."Commenté le :</span> $dateCommentaire</li>";
1285 jpm 201
		}
1292 jpm 202
 
203
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
204
			'<h2>'."$intitule identiPlante #$idCommentaire pour l'observation #$idObs".'</h2>'.
205
			'<div class="gauche">'.
206
			"	<h3>Observation #$idObs</h3>".
207
			'	<ul>'.
208
			'		<li><span class="champ">'."Nom saisi actuel :</span> <em>$nomSelActuel</em></li>".
209
			'		<li><span class="champ">'."Lieu :</span> $lieuObs</li>".
210
			'		<li><span class="champ">'."Date :</span> $dateObs</li>".
211
			'		<li><span class="champ">'."Auteur :</span> $observateur</li>".
212
			'	</ul>'.
213
			'</div>'.
214
			'<div class="gauche">'.
215
			"	<h3>$intitule #$idCommentaire</h3>".
216
			"	<ul>$contenuCommentaire</ul>".
217
			'</div>';
1047 aurelien 218
		return $description;
219
	}
1284 jpm 220
 
1292 jpm 221
	private function creerObservateur($info) {
222
		$observateur = 'Anonyme';
223
		if ($info['observateur_prenom'] != '' && $info['observateur_nom'] != '') {
224
			$observateur = $info['observateur_prenom'].' '.$info['observateur_nom'];
225
		}
226
		return $observateur;
1047 aurelien 227
	}
1284 jpm 228
 
229
	private function getDerniersCommentaires() {
230
		$requete = 'SELECT DISTINCT dc.*, '.
231
			'	dob.id_observation AS dob_id_observation, dob.ce_zone_geo AS dob_ce_zone_geo, '.
1292 jpm 232
			'	dob.zone_geo AS dob_zone_geo, dob.date_observation AS dob_date_observation, dob.nom_sel AS dob_nom_sel, '.
233
			'	duo.prenom AS observateur_prenom, duo.nom AS observateur_nom, duo.courriel AS observateur_courriel '.
1284 jpm 234
			'FROM del_commentaire AS dc '.
235
			'	INNER JOIN del_observation AS dob '.
236
			'		ON dob.id_observation = dc.ce_observation '.
1292 jpm 237
			'	LEFT JOIN del_utilisateur AS duo '.
238
			'		ON dob.ce_utilisateur = duo.id_utilisateur '.
1309 jpm 239
			'WHERE proposition_initiale != 1 '.
1284 jpm 240
			$this->chargerClauseWhere().' '.
241
			'ORDER BY dc.date DESC '.
242
			'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' ';
243
 
1793 jpm 244
		$elements = $this->bdd->recupererTous($requete);
1047 aurelien 245
		return $elements;
246
	}
1284 jpm 247
 
1049 aurelien 248
	/**
249
	* Charger la clause WHERE en fonction des paramètres de masque
250
	* */
251
	private function chargerClauseWhere() {
252
		$where = array();
1307 jpm 253
 
1806 jpm 254
		$tableauMasque = $this->navigation->getFiltre();
1049 aurelien 255
		if (!empty($tableauMasque)) {
1307 jpm 256
			foreach ($tableauMasque as $idMasque => $valeurMasque) {
1049 aurelien 257
				$idMasque = str_replace('masque.', '', $idMasque);
1307 jpm 258
				$champ = $this->mappingFiltre[$idMasque];
1793 jpm 259
				$valeurMasquePattern = $this->bdd->proteger($valeurMasque.'%');
260
				$valeurMasqueProtegee = $this->bdd->proteger($valeurMasque);
1307 jpm 261
 
1049 aurelien 262
				switch ($idMasque) {
263
					case 'espece':
1307 jpm 264
						$where[] = " dob.$champ LIKE $valeurMasquePattern OR dc.$champ LIKE $valeurMasquePattern ";
1284 jpm 265
						break;
1049 aurelien 266
					case 'auteur':
1307 jpm 267
						$where[] = $this->creerFiltreAuteur($valeurMasque);
1284 jpm 268
						break;
1049 aurelien 269
					default:
1307 jpm 270
						$where[] = " $champ = $valeurMasqueProtegee ";
1049 aurelien 271
				}
1284 jpm 272
			}
1049 aurelien 273
		}
1307 jpm 274
 
275
		$whereSql = '';
1049 aurelien 276
		if (!empty($where)) {
1307 jpm 277
			$whereSql = ' AND '.implode('AND', $where);
1049 aurelien 278
		}
1307 jpm 279
		return $whereSql;
1049 aurelien 280
	}
1284 jpm 281
 
282
	private function creerFiltreAuteur($auteurId) {
1307 jpm 283
		$whereAuteur = '';
1049 aurelien 284
		if (is_numeric($auteurId)) {
1307 jpm 285
			$whereAuteur = " dc.ce_utilisateur = $auteurId ";
1049 aurelien 286
		} else {
1793 jpm 287
			$auteurIdMotif = $this->bdd->proteger($auteurId.'%');
1284 jpm 288
 
1049 aurelien 289
			if (strpos($auteurId, '@') === false) {
1284 jpm 290
				$tableauNomPrenom = explode(' ', $auteurId, 2);
291
				if (count($tableauNomPrenom) == 2) {
1049 aurelien 292
					// on teste potentiellement un nom prenom ou bien un prénom nom
1793 jpm 293
					$nomMotif = $this->bdd->proteger($tableauNomPrenom[0].'%');
294
					$prenomMotif = $this->bdd->proteger($tableauNomPrenom[1].'%');
1284 jpm 295
 
1307 jpm 296
					$whereAuteur = ' ('.
1284 jpm 297
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
298
						'OR '.
299
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
1307 jpm 300
					') ';
1049 aurelien 301
				} else {
1307 jpm 302
					$whereAuteur = "(dc.utilisateur_nom LIKE $auteurIdMotif OR dc.utilisateur_prenom LIKE $auteurIdMotif) ";
1049 aurelien 303
				}
304
			} else {
1307 jpm 305
				$whereAuteur = " dob.utilisateur_courriel LIKE $auteurIdMotif ";
1049 aurelien 306
			}
307
		}
1307 jpm 308
		return $whereAuteur;
1049 aurelien 309
	}
1284 jpm 310
}
311
?>