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
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){
130
		$timestamp = 1;
131
		if ($date_heure_mysql != '0000-00-00 00:00:00') {
132
			$val = explode(' ', $date_heure_mysql);
133
			$date = explode('-', $val[0]);
134
			$heure = explode(':', $val[1]);
135
			$timestamp = mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
136
		}
137
		return $timestamp;
138
	}
139
 
1047 aurelien 140
	private function creerTitre($element) {
1290 jpm 141
		$nomPropose = htmlspecialchars($element['nom_sel']);
142
		$intitule = ($element['nom_sel'] != '') ? "Proposition $nomPropose" : 'Commentaire';
143
		$auteur = htmlspecialchars($this->creerAuteur($element));
144
		$nomSelActuel = htmlspecialchars($element['dob_nom_sel']);
1286 jpm 145
		$zoneGeo = htmlspecialchars((($element['dob_zone_geo'] != '') ? $element['dob_zone_geo'] : '?'));
146
		$dateObs = htmlspecialchars(strftime('%d %B %Y', strtotime($element['dob_date_observation'])));
147
 
1290 jpm 148
		$titre = "$intitule par $auteur pour $nomSelActuel à $zoneGeo le $dateObs";
1047 aurelien 149
		return $titre;
150
	}
1284 jpm 151
 
1292 jpm 152
	private function creerAuteur($info) {
1294 jpm 153
		$auteur = 'Anonyme';
154
		if ($info['utilisateur_prenom'] != '' && $info['utilisateur_nom'] != '') {
155
			$auteur = $info['utilisateur_prenom'].' '.$info['utilisateur_nom'];
156
		}
157
		return $auteur;
1292 jpm 158
	}
159
 
160
	private function creerGuidItem($element) {
161
		$guid = sprintf($this->conteneur->getParametre('guidObsTpl'), $element['id_commentaire']);
162
		return $guid;
163
	}
164
 
165
	private function creerLienItem($element) {
166
		$lien = sprintf($this->conteneur->getParametre('delFicheObsTpl'), $element['dob_id_observation']);
167
		return $lien;
168
	}
169
 
170
	private function creerCategorie($element) {
171
		$categorie = 'Commentaires';
172
		$categorie = htmlentities($categorie);
173
		return $categorie;
174
	}
175
 
1047 aurelien 176
	private function creerDescription($donnees, $item) {
1286 jpm 177
		$idCommentaire = $donnees['id_commentaire'];
1290 jpm 178
		$idObs = $donnees['dob_id_observation'];
179
		$nomPropose = ($donnees['nom_sel'] != '') ? htmlspecialchars($donnees['nom_sel']) : '';
1304 jpm 180
		$dateCommentaire = htmlspecialchars(strftime('%A %d %B %Y à %H:%M', $this->convertirDateHeureMysqlEnTimestamp($donnees['date'])));
1290 jpm 181
		$nomSelActuel = htmlspecialchars($donnees['dob_nom_sel']);
182
		$etreProposition = ($nomPropose != '') ? true : false;
1292 jpm 183
		$intitule = ($etreProposition) ? 'Proposition' : 'Commentaire';
1284 jpm 184
		$txt = ($donnees['texte'] != '') ? htmlspecialchars($donnees['texte']) : '';
185
		$auteur = htmlspecialchars($this->creerAuteur($donnees)).
186
			($this->fluxAdminDemande() ? ' ('.$donnees['utilisateur_courriel'].')' : '');
1292 jpm 187
		$lieuObs = htmlspecialchars((($donnees['dob_zone_geo'] != '') ? $donnees['dob_zone_geo'] : '?'));
188
		$dateObs = htmlspecialchars(str_replace(' 00:00:00', '', $donnees['dob_date_observation']));
189
		$observateur = htmlspecialchars($this->creerObservateur($donnees));
1284 jpm 190
 
1292 jpm 191
		$contenuCommentaire = '';
1285 jpm 192
		if ($etreProposition) {
1292 jpm 193
			$contenuCommentaire =
194
				'<li><span class="champ">'."Nom proposé :</span> <em>$nomPropose</em></li>".
195
				((!empty($txt)) ? '<li><span class="champ">'."Argumentaire :</span> $txt</li>" : '').
196
				'<li><span class="champ">'."Auteur de la proposition :</span> $auteur</li>".
197
				'<li><span class="champ">'."Proposé le :</span> $dateCommentaire</li>";
1285 jpm 198
		} else {
1292 jpm 199
			$contenuCommentaire =
200
				'<li><span class="champ">'."Commentaire #$idCommentaire :</span> <pre>$txt</pre></li>".
201
				'<li><span class="champ">'."Auteur du commentaire :</span> $auteur</li>".
202
				'<li><span class="champ">'."Commenté le :</span> $dateCommentaire</li>";
1285 jpm 203
		}
1292 jpm 204
 
205
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
206
			'<h2>'."$intitule identiPlante #$idCommentaire pour l'observation #$idObs".'</h2>'.
207
			'<div class="gauche">'.
208
			"	<h3>Observation #$idObs</h3>".
209
			'	<ul>'.
210
			'		<li><span class="champ">'."Nom saisi actuel :</span> <em>$nomSelActuel</em></li>".
211
			'		<li><span class="champ">'."Lieu :</span> $lieuObs</li>".
212
			'		<li><span class="champ">'."Date :</span> $dateObs</li>".
213
			'		<li><span class="champ">'."Auteur :</span> $observateur</li>".
214
			'	</ul>'.
215
			'</div>'.
216
			'<div class="gauche">'.
217
			"	<h3>$intitule #$idCommentaire</h3>".
218
			"	<ul>$contenuCommentaire</ul>".
219
			'</div>';
1047 aurelien 220
		return $description;
221
	}
1284 jpm 222
 
1292 jpm 223
	private function creerObservateur($info) {
224
		$observateur = 'Anonyme';
225
		if ($info['observateur_prenom'] != '' && $info['observateur_nom'] != '') {
226
			$observateur = $info['observateur_prenom'].' '.$info['observateur_nom'];
227
		}
228
		return $observateur;
1047 aurelien 229
	}
1284 jpm 230
 
231
	private function getDerniersCommentaires() {
232
		$requete = 'SELECT DISTINCT dc.*, '.
233
			'	dob.id_observation AS dob_id_observation, dob.ce_zone_geo AS dob_ce_zone_geo, '.
1292 jpm 234
			'	dob.zone_geo AS dob_zone_geo, dob.date_observation AS dob_date_observation, dob.nom_sel AS dob_nom_sel, '.
235
			'	duo.prenom AS observateur_prenom, duo.nom AS observateur_nom, duo.courriel AS observateur_courriel '.
1284 jpm 236
			'FROM del_commentaire AS dc '.
237
			'	INNER JOIN del_observation AS dob '.
238
			'		ON dob.id_observation = dc.ce_observation '.
1292 jpm 239
			'	LEFT JOIN del_utilisateur AS duo '.
240
			'		ON dob.ce_utilisateur = duo.id_utilisateur '.
1309 jpm 241
			'WHERE proposition_initiale != 1 '.
1284 jpm 242
			$this->chargerClauseWhere().' '.
243
			'ORDER BY dc.date DESC '.
244
			'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' ';
245
 
1047 aurelien 246
		$elements = $this->gestionBdd->getBdd()->recupererTous($requete);
247
		return $elements;
248
	}
1284 jpm 249
 
1049 aurelien 250
	/**
251
	* Charger la clause WHERE en fonction des paramètres de masque
252
	* */
253
	private function chargerClauseWhere() {
254
		$where = array();
1307 jpm 255
 
1049 aurelien 256
		$tableauMasque = $this->masque->getMasque();
257
		if (!empty($tableauMasque)) {
1307 jpm 258
			foreach ($tableauMasque as $idMasque => $valeurMasque) {
1049 aurelien 259
				$idMasque = str_replace('masque.', '', $idMasque);
1307 jpm 260
				$champ = $this->mappingFiltre[$idMasque];
261
				$valeurMasquePattern = $this->gestionBdd->getBdd()->proteger($valeurMasque.'%');
262
				$valeurMasqueProtegee = $this->gestionBdd->getBdd()->proteger($valeurMasque);
263
 
1049 aurelien 264
				switch ($idMasque) {
265
					case 'espece':
1307 jpm 266
						$where[] = " dob.$champ LIKE $valeurMasquePattern OR dc.$champ LIKE $valeurMasquePattern ";
1284 jpm 267
						break;
1049 aurelien 268
					case 'auteur':
1307 jpm 269
						$where[] = $this->creerFiltreAuteur($valeurMasque);
1284 jpm 270
						break;
1049 aurelien 271
					default:
1307 jpm 272
						$where[] = " $champ = $valeurMasqueProtegee ";
1049 aurelien 273
				}
1284 jpm 274
			}
1049 aurelien 275
		}
1307 jpm 276
 
277
		$whereSql = '';
1049 aurelien 278
		if (!empty($where)) {
1307 jpm 279
			$whereSql = ' AND '.implode('AND', $where);
1049 aurelien 280
		}
1307 jpm 281
		return $whereSql;
1049 aurelien 282
	}
1284 jpm 283
 
284
	private function creerFiltreAuteur($auteurId) {
1307 jpm 285
		$whereAuteur = '';
1049 aurelien 286
		if (is_numeric($auteurId)) {
1307 jpm 287
			$whereAuteur = " dc.ce_utilisateur = $auteurId ";
1049 aurelien 288
		} else {
1284 jpm 289
			$auteurIdMotif = $this->gestionBdd->getBdd()->proteger($auteurId.'%');
290
 
1049 aurelien 291
			if (strpos($auteurId, '@') === false) {
1284 jpm 292
				$tableauNomPrenom = explode(' ', $auteurId, 2);
293
				if (count($tableauNomPrenom) == 2) {
1049 aurelien 294
					// on teste potentiellement un nom prenom ou bien un prénom nom
1284 jpm 295
					$nomMotif = $this->gestionBdd->getBdd()->proteger($tableauNomPrenom[0].'%');
296
					$prenomMotif = $this->gestionBdd->getBdd()->proteger($tableauNomPrenom[1].'%');
297
 
1307 jpm 298
					$whereAuteur = ' ('.
1284 jpm 299
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
300
						'OR '.
301
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
1307 jpm 302
					') ';
1049 aurelien 303
				} else {
1307 jpm 304
					$whereAuteur = "(dc.utilisateur_nom LIKE $auteurIdMotif OR dc.utilisateur_prenom LIKE $auteurIdMotif) ";
1049 aurelien 305
				}
306
			} else {
1307 jpm 307
				$whereAuteur = " dob.utilisateur_courriel LIKE $auteurIdMotif ";
1049 aurelien 308
			}
309
		}
1307 jpm 310
		return $whereAuteur;
1049 aurelien 311
	}
1284 jpm 312
}
313
?>