Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

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