Subversion Repositories eFlore/Applications.del

Rev

Rev 1820 | Rev 1922 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1820 Rev 1821
Line 12... Line 12...
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
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>
14
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
 */
16
 */
17
class SyndicationCommentaires {
17
class Commentaires {
Line 18... Line 18...
18
 
18
 
19
	private $mappingFiltre = array();
19
	private $categorie = 'Commentaires';
-
 
20
	private $conteneur;
20
	private $conteneur = null;
21
	private $contexte;
21
	private $bdd = null;
22
	private $bdd;
-
 
23
	private $navigation;
-
 
24
	private $mapping = array();
Line 22... Line 25...
22
	private $navigation = null;
25
	private $syndication;
23
 
26
 
24
	public function __construct(Conteneur $conteneur = null) {
-
 
25
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
27
	public function __construct(Conteneur $conteneur = null) {
26
		$this->conteneur->chargerConfiguration('config_syndication_commentaires.ini');
28
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
27
		$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque');
29
		$this->contexte = $this->conteneur->getContexte();
-
 
30
		$this->bdd = $this->conteneur->getBdd();
-
 
31
		$this->navigation = $this->conteneur->getNavigation();
28
		$this->bdd = $this->conteneur->getBdd();
32
		$this->syndication = $this->conteneur->getSyndicationOutils();
Line 29... Line 33...
29
		$this->navigation = $this->conteneur->getNavigation();
33
		$this->mapping = $this->conteneur->getParametreTableau('syndication.mapping');
30
	}
-
 
31
 
-
 
32
	public function consulter($params = array()) {
34
	}
33
		$this->verifierConfiguration();
35
 
34
 
36
	public function consulter() {
Line 35... Line 37...
35
		if ($this->fluxAdminDemande()) {
37
		if ($this->syndication->fluxAdminDemande()) {
36
			$this->demanderAutorisationAdmin();
38
			$this->syndication->demanderAutorisationAdmin();
37
		}
39
		}
38
 
40
 
Line 39... Line -...
39
		$donnees_brutes = $this->getDerniersCommentaires();
-
 
40
		$commentaires_formates = $this->formaterPourRss($donnees_brutes) ;
-
 
41
		return $commentaires_formates;
-
 
42
	}
-
 
43
 
-
 
44
	/**
-
 
45
	* Vérifier que le service est bien configuré
-
 
46
	* */
-
 
47
	public function verifierConfiguration() {
-
 
48
		$erreurs = array();
-
 
49
 
-
 
50
		if (empty($this->mappingFiltre)) {
-
 
51
			$erreurs[] = 'Le fichier de configuration ne contient pas le tableau [mapping_masque] ou celui-ci est vide.';
-
 
52
		}
-
 
53
 
-
 
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
	}
-
 
60
 
-
 
61
	/**
-
 
62
	 * Verifier si le flux admin est demande
-
 
63
	 */
-
 
64
	private function fluxAdminDemande() {
-
 
65
		return $this->conteneur->getParametre('admin') != null && $this->conteneur->getParametre('admin') == 1;
-
 
66
	}
-
 
67
 
-
 
68
	private function demanderAutorisationAdmin() {
41
		$donnees_brutes = $this->getDerniersCommentaires();
69
		$verification = $this->conteneur->getControleAcces();
-
 
70
		$verification->demanderAuthentificationAdmin();
42
		$commentaires_formates = $this->formaterPourRss($donnees_brutes) ;
71
	}
43
		return $commentaires_formates;
72
 
-
 
73
	private function formaterPourRss($elements) {
44
	}
74
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
45
 
75
		foreach ($elements as $element) {
46
	private function formaterPourRss($elements) {
76
			$identifiants[$element['id_commentaire']] = $element['id_commentaire'];
47
		$derniere_info_en_date = reset($elements);
77
		}
48
		$donnees = $this->syndication->construireDonneesCommunesAuFlux('commentaire', $derniere_info_en_date['date']);
Line 78... Line -...
78
		foreach ($elements as $element) {
-
 
79
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
-
 
80
		}
-
 
81
		return $donnees;
-
 
82
	}
-
 
83
 
-
 
84
	private function construireDonneesCommunesAuFlux($infos) {
-
 
85
		$donnees = array();
-
 
86
		$donnees['guid'] = htmlspecialchars($this->creerUrlService());
-
 
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';
-
 
89
		$donnees['lien_service'] = htmlspecialchars($this->creerUrlService());
-
 
90
		$donnees['lien_del'] = $this->conteneur->getParametre('obsAppliLien');
-
 
91
		$donnees['editeur'] = $this->conteneur->getParametre('editeur');
-
 
92
		$derniere_info_en_date = reset($infos);
-
 
93
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($derniere_info_en_date['date']);
-
 
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';
-
 
100
		return $donnees;
-
 
101
	}
-
 
102
 
49
		foreach ($elements as $element) {
103
	private function creerUrlService() {
50
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
104
		$url_service = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
51
		}
105
		return $url_service;
52
		return $donnees;
106
	}
53
	}
107
 
54
 
108
	private function construireDonneesCommunesAuxItems($info) {
55
	private function construireDonneesCommunesAuxItems($info) {
109
		$item = array();
56
		$item = array();
110
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date']);
57
		$date_modification_timestamp = $this->syndication->convertirDateHeureMysqlEnTimestamp($info['date']);
111
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
58
		$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);
59
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
113
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
60
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
114
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
61
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
115
		$item['titre'] = $this->creerTitre($info);
62
		$item['titre'] = $this->creerTitre($info);
116
		$item['guid'] = $this->creerGuidItem($info);
63
		$item['guid'] = $this->creerGuidItem($info);
117
		$item['lien'] = $this->creerLienItem($info);
64
		$item['lien'] = $this->creerLienItem($info);
Line 118... Line -...
118
		$item['categorie'] = $this->creerCategorie($item);
-
 
119
		$item['description'] = $this->creerDescription($info, $item);
-
 
120
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
-
 
121
		$item['modifier_par'] = $this->creerAuteur($info);
-
 
122
		return $item;
-
 
123
	}
-
 
124
 
-
 
125
	protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){
-
 
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;
-
 
129
		if ($date_heure_mysql != '0000-00-00 00:00:00') {
-
 
130
			$val = explode(' ', $date_heure_mysql);
-
 
131
			$date = explode('-', $val[0]);
65
		$item['categorie'] = htmlentities($this->categorie);
132
			$heure = explode(':', $val[1]);
66
		$item['description'] = $this->creerDescription($info, $item);
133
			$timestamp = mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
67
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
134
		}
68
		$item['modifier_par'] = $this->creerAuteur($info);
135
		return $timestamp;
69
		return $item;
Line 154... Line 88...
154
		}
88
		}
155
		return $auteur;
89
		return $auteur;
156
	}
90
	}
Line 157... Line 91...
157
 
91
 
158
	private function creerGuidItem($element) {
92
	private function creerGuidItem($element) {
159
		$guid = sprintf($this->conteneur->getParametre('commentaireGuidTpl'), $element['id_commentaire']);
93
		$guid = sprintf($this->conteneur->getParametre('syndication.commentaire_guid_tpl'), $element['id_commentaire']);
160
		return $guid;
94
		return $guid;
Line 161... Line 95...
161
	}
95
	}
162
 
96
 
163
	private function creerLienItem($element) {
97
	private function creerLienItem($element) {
164
		$lien = sprintf($this->conteneur->getParametre('obsFicheTpl'), $element['dob_id_observation']);
98
		$lien = sprintf($this->conteneur->getParametre('obs_fiche_tpl'), $element['dob_id_observation']);
Line 165... Line -...
165
		return $lien;
-
 
166
	}
-
 
167
 
-
 
168
	private function creerCategorie($element) {
-
 
169
		$categorie = 'Commentaires';
-
 
170
		$categorie = htmlentities($categorie);
-
 
171
		return $categorie;
99
		return $lien;
172
	}
100
	}
173
 
101
 
174
	private function creerDescription($donnees, $item) {
102
	private function creerDescription($donnees, $item) {
175
		$idCommentaire = $donnees['id_commentaire'];
103
		$idCommentaire = $donnees['id_commentaire'];
176
		$idObs = $donnees['dob_id_observation'];
104
		$idObs = $donnees['dob_id_observation'];
177
		$nomPropose = ($donnees['nom_sel'] != '') ? htmlspecialchars($donnees['nom_sel']) : '';
105
		$nomPropose = ($donnees['nom_sel'] != '') ? htmlspecialchars($donnees['nom_sel']) : '';
178
		$dateCommentaire = htmlspecialchars(strftime('%A %d %B %Y à %H:%M', $this->convertirDateHeureMysqlEnTimestamp($donnees['date'])));
106
		$dateCommentaire = htmlspecialchars(strftime('%A %d %B %Y à %H:%M', $this->syndication->convertirDateHeureMysqlEnTimestamp($donnees['date'])));
179
		$nomSelActuel = htmlspecialchars($donnees['dob_nom_sel']);
107
		$nomSelActuel = htmlspecialchars($donnees['dob_nom_sel']);
180
		$etreProposition = ($nomPropose != '') ? true : false;
108
		$etreProposition = ($nomPropose != '') ? true : false;
181
		$intitule = ($etreProposition) ? 'Proposition' : 'Commentaire';
109
		$intitule = ($etreProposition) ? 'Proposition' : 'Commentaire';
182
		$txt = ($donnees['texte'] != '') ? htmlspecialchars($donnees['texte']) : '';
110
		$txt = ($donnees['texte'] != '') ? htmlspecialchars($donnees['texte']) : '';
183
		$auteur = htmlspecialchars($this->creerAuteur($donnees)).
111
		$auteur = htmlspecialchars($this->creerAuteur($donnees)).
184
			($this->fluxAdminDemande() ? ' ('.$donnees['utilisateur_courriel'].')' : '');
112
			($this->syndication->fluxAdminDemande() ? ' ('.$donnees['utilisateur_courriel'].')' : '');
Line 185... Line 113...
185
		$lieuObs = htmlspecialchars((($donnees['dob_zone_geo'] != '') ? $donnees['dob_zone_geo'] : '?'));
113
		$lieuObs = htmlspecialchars((($donnees['dob_zone_geo'] != '') ? $donnees['dob_zone_geo'] : '?'));
Line 225... Line 153...
225
		}
153
		}
226
		return $observateur;
154
		return $observateur;
227
	}
155
	}
Line 228... Line 156...
228
 
156
 
-
 
157
	private function getDerniersCommentaires() {
229
	private function getDerniersCommentaires() {
158
		$clauseWhere = $this->chargerClauseWhere();
230
		$requete = 'SELECT DISTINCT dc.*, '.
159
		$requete = 'SELECT DISTINCT dc.*, '.
231
			'	dob.id_observation AS dob_id_observation, dob.ce_zone_geo AS dob_ce_zone_geo, '.
160
			'	dob.id_observation AS dob_id_observation, dob.ce_zone_geo AS dob_ce_zone_geo, '.
232
			'	dob.zone_geo AS dob_zone_geo, dob.date_observation AS dob_date_observation, dob.nom_sel AS dob_nom_sel, '.
161
			'	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 '.
162
			'	duo.prenom AS observateur_prenom, duo.nom AS observateur_nom, duo.courriel AS observateur_courriel '.
234
			'FROM del_commentaire AS dc '.
163
			'FROM del_commentaire AS dc '.
235
			'	INNER JOIN del_observation AS dob '.
164
			'	INNER JOIN del_observation AS dob '.
236
			'		ON dob.id_observation = dc.ce_observation '.
165
			'		ON dob.id_observation = dc.ce_observation '.
237
			'	LEFT JOIN del_utilisateur AS duo '.
166
			'	LEFT JOIN del_utilisateur AS duo '.
238
			'		ON dob.ce_utilisateur = duo.id_utilisateur '.
167
			'		ON dob.ce_utilisateur = duo.id_utilisateur '.
239
			'WHERE proposition_initiale != 1 '.
168
			'WHERE proposition_initiale != 1 '.
240
			$this->chargerClauseWhere().' '.
169
			($clauseWhere != '' ? "AND $clauseWhere " : '').
241
			'ORDER BY dc.date DESC '.
170
			'ORDER BY dc.date DESC '.
-
 
171
			'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' '.
Line 242... Line 172...
242
			'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' ';
172
			' -- '.__FILE__.' : '.__LINE__;
243
 
173
 
244
		$elements = $this->bdd->recupererTous($requete);
174
		$elements = $this->bdd->recupererTous($requete);
Line 245... Line 175...
245
		return $elements;
175
		return $elements;
246
	}
176
	}
247
 
177
 
248
	/**
178
	/**
249
	* Charger la clause WHERE en fonction des paramètres de masque
179
	* Charger la clause WHERE en fonction des paramètres de masque
250
	* */
-
 
251
	private function chargerClauseWhere() {
180
	* */
252
		$where = array();
181
	private function chargerClauseWhere() {
253
 
182
		$where = array();
254
		$tableauMasque = $this->navigation->getFiltre();
183
		$filtres = $this->navigation->getFiltre();
255
		if (!empty($tableauMasque)) {
184
		if (!empty($filtres)) {
256
			foreach ($tableauMasque as $idMasque => $valeurMasque) {
185
			$filtrePossibles = $this->conteneur->getParametreTableau('syndication.commentaire_filtres');
257
				$idMasque = str_replace('masque.', '', $idMasque);
186
			foreach ($filtres as $cleFiltre => $valeur) {
258
				$champ = $this->mappingFiltre[$idMasque];
187
				if (in_array($cleFiltre, $filtrePossibles)) {
259
				$valeurMasquePattern = $this->bdd->proteger($valeurMasque.'%');
188
					if (isset($this->mapping[$cleFiltre])) {
260
				$valeurMasqueProtegee = $this->bdd->proteger($valeurMasque);
189
						$champ = $this->mapping[$cleFiltre];
-
 
190
					}
261
 
191
					switch ($cleFiltre) {
262
				switch ($idMasque) {
192
						case 'espece':
263
					case 'espece':
193
							$valeurP = $this->bdd->proteger($valeur.'%');
264
						$where[] = " dob.$champ LIKE $valeurMasquePattern OR dc.$champ LIKE $valeurMasquePattern ";
194
							$where[] = " dob.$champ LIKE $valeurP OR dc.$champ LIKE $valeurP ";
265
						break;
195
							break;
266
					case 'auteur':
196
						case 'auteur':
-
 
197
							$where[] = $this->creerFiltreAuteur($valeur);
267
						$where[] = $this->creerFiltreAuteur($valeurMasque);
198
							break;
-
 
199
						default:
268
						break;
200
							$valeurP = $this->bdd->proteger($valeur);
269
					default:
201
							$where[] = " $champ = $valeurP ";
270
						$where[] = " $champ = $valeurMasqueProtegee ";
202
					}
271
				}
-
 
272
			}
-
 
273
		}
-
 
274
 
203
				}
275
		$whereSql = '';
-
 
276
		if (!empty($where)) {
-
 
277
			$whereSql = ' AND '.implode('AND', $where);
204
			}
Line 278... Line 205...
278
		}
205
		}
279
		return $whereSql;
206
		return (!empty($where)) ? implode('AND', $where) : '';
280
	}
207
	}
281
 
208
 
282
	private function creerFiltreAuteur($auteurId) {
209
	private function creerFiltreAuteur($auteurId) {
283
		$whereAuteur = '';
210
		$whereAuteur = '';
Line 284... Line 211...
284
		if (is_numeric($auteurId)) {
211
		if (is_numeric($auteurId)) {
-
 
212
			$whereAuteur = " dc.ce_utilisateur = $auteurId ";
-
 
213
		} else {
285
			$whereAuteur = " dc.ce_utilisateur = $auteurId ";
214
			$auteurIdMotif = $this->bdd->proteger($auteurId.'%');
286
		} else {
215
 
-
 
216
			if (strpos($auteurId, '@') !== false) {
-
 
217
				$whereAuteur = " dc.utilisateur_courriel LIKE $auteurIdMotif ";
287
			$auteurIdMotif = $this->bdd->proteger($auteurId.'%');
218
			} else {
288
 
219
				$tableauNomPrenom = explode(' ', $auteurId, 2);
289
			if (strpos($auteurId, '@') === false) {
220
				if (count($tableauNomPrenom) != 2) {
Line 290... Line 221...
290
				$tableauNomPrenom = explode(' ', $auteurId, 2);
221
					$whereAuteur = "(dc.utilisateur_nom LIKE $auteurIdMotif OR dc.utilisateur_prenom LIKE $auteurIdMotif) ";
291
				if (count($tableauNomPrenom) == 2) {
222
				} else {
292
					// on teste potentiellement un nom prenom ou bien un prénom nom
223
					// on teste potentiellement un nom prenom ou bien un prénom nom
293
					$nomMotif = $this->bdd->proteger($tableauNomPrenom[0].'%');
224
					$nomMotif = $this->bdd->proteger($tableauNomPrenom[0].'%');
294
					$prenomMotif = $this->bdd->proteger($tableauNomPrenom[1].'%');
225
					$prenomMotif = $this->bdd->proteger($tableauNomPrenom[1].'%');
295
 
-
 
296
					$whereAuteur = ' ('.
-
 
297
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
226
 
298
						'OR '.
-
 
299
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
-
 
300
					') ';
227
					$whereAuteur = ' ('.
301
				} else {
228
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
302
					$whereAuteur = "(dc.utilisateur_nom LIKE $auteurIdMotif OR dc.utilisateur_prenom LIKE $auteurIdMotif) ";
229
						'OR '.
303
				}
230
						"(dc.utilisateur_nom LIKE $nomMotif AND dc.utilisateur_prenom LIKE $prenomMotif) ".
304
			} else {
-
 
305
				$whereAuteur = " dob.utilisateur_courriel LIKE $auteurIdMotif ";
-
 
306
			}
231
					') ';
-
 
232
				}
307
		}
233
			}