Subversion Repositories eFlore/Applications.cel

Rev

Rev 3634 | Rev 3776 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3634 Rev 3743
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM.
4
 * Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM.
5
 
5
 
6
 *
6
 *
7
 * @internal   Mininum PHP version : 5.2
7
 * @internal   Mininum PHP version : 5.2
8
 * @category   CEL
8
 * @category   CEL
9
 * @package    Services
9
 * @package    Services
10
 * @subpackage Syndication
10
 * @subpackage Syndication
11
 * @version    0.1
11
 * @version    0.1
12
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
12
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
13
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
14
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
15
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
16
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
17
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
17
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
18
 */
18
 */
19
class CelSyndicationImage extends Cel {
19
class CelSyndicationImage extends Cel {
20
 
20
    
21
	private $parametres_origines = null;
21
    private $parametres_origines = null;
22
	private $format = null;
22
    private $format = null;
23
	private $service = null;
23
    private $service = null;
24
	private $squelette = null;
24
    private $squelette = null;
25
	private $squelette_dossier = null;
25
    private $squelette_dossier = null;
26
	private $auteurs = array();
26
    private $auteurs = array();
27
	private $flux = array();
27
    private $flux = array();
28
 
28
    
29
	private $format_image = 'XL';
29
    private $format_image = 'XL';
30
 
30
    
31
	private $criteres = array(
31
    private $criteres = array(
32
		'utilisateur' => 'b.courriel_utilisateur',
32
        'utilisateur' => 'b.courriel_utilisateur',
33
		'commune' => 'b.zone_geo',
33
        'commune' => 'b.zone_geo',
34
		'dept' => 'b.dept',
34
        'dept' => 'b.dept',
35
		'taxon' => 'b.nom_ret',
35
        'taxon' => 'b.nom_ret',
36
		'num_taxon' => 'b.nt',
36
        'num_taxon' => 'b.nt',
37
		'num_nom' => 'b.nom_sel_nn',
37
        'num_nom' => 'b.nom_sel_nn',
38
		'commentaire' => 'c.commentaire',
38
        'commentaire' => 'c.commentaire',
39
		'date' => 'c.date_prise_de_vue',
39
        'date' => 'c.date_prise_de_vue',
40
		'tag' => 'tag',
40
        'tag' => 'tag',
41
		'motcle' => 'tag',
41
        'motcle' => 'tag',
42
		'projet' => 'projet',
42
        'projet' => 'projet',
43
		'referentiel' => 'referentiel',
43
        'referentiel' => 'referentiel',
44
		'groupe_zones_geo' => 'groupe_zones_geo',
44
        'groupe_zones_geo' => 'groupe_zones_geo'
45
	    'standard' => 'donnees_standard'
-
 
46
	);
45
    );
47
 
46
    
48
	/**
47
    /**
49
	 * Méthode appelée avec une requête de type GET.
48
     * Méthode appelée avec une requête de type GET.
50
	 */
49
     */
51
	public function getElement($params = array()) {
50
    public function getElement($params = array()) {
52
		// Initialisation des variables
51
        // Initialisation des variables
53
		$this->parametres_origines = $params;
52
        $this->parametres_origines = $params;
54
		$info = array();
53
        $info = array();
55
		$contenu = '';
54
        $contenu = '';
56
 
55
        
57
		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
56
        if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
58
			// Pré traitement des paramêtres
57
            // Pré traitement des paramêtres
59
			$pour_bdd = false;
58
            $pour_bdd = false;
60
			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
59
            $p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
61
			extract($p);
60
            extract($p);
62
			$this->parametres = $params;
61
            $this->parametres = $params;
63
			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
62
            $this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
64
 
63
            
65
			// Récupération de la liste des flux
64
            // Récupération de la liste des flux
66
			$this->chargerListeDesFlux();
65
            $this->chargerListeDesFlux();
67
 
66
            
68
			// Chargement du bon type de service demandé
67
            // Chargement du bon type de service demandé
69
			if (isset($service)) {
68
            if (isset($service)) {
70
				$this->service = $this->traiterNomService($service);
69
                $this->service = $this->traiterNomService($service);
71
				$methode = $this->getNomMethodeService();
70
                $methode = $this->getNomMethodeService();
72
				if (method_exists($this, $methode)) {
71
                if (method_exists($this, $methode)) {
73
					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
72
                    if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
74
						// Mise en minuscule de l'indication du format
73
                        // Mise en minuscule de l'indication du format
75
						$this->format = strtolower($format);
74
                        $this->format = strtolower($format);
76
						// Définition du fichier squelette demandé
75
                        // Définition du fichier squelette demandé
77
						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
76
                        $this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
78
					} else if (isset($this->flux[$this->service])) {
77
                    } else if (isset($this->flux[$this->service])) {
79
						$this->format = '';
78
                        $this->format = '';
80
						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
79
                        $this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
81
					}
80
                    }
82
 
81
                    
83
					if (!isset($this->flux[$this->service]) || isset($this->format)) {
82
                    if (!isset($this->flux[$this->service]) || isset($this->format)) {
84
						// Suppression des deux premiers paramètres (service et format)  pour le reste des méthodes
83
                        // Suppression des deux premiers paramètres (service et format)  pour le reste des méthodes
85
						array_shift($this->parametres);
84
                        array_shift($this->parametres);
86
						array_shift($this->parametres);
85
                        array_shift($this->parametres);
87
 
86
                        
88
						// Récupération du contenu à renvoyer
87
                        // Récupération du contenu à renvoyer
89
						$contenu = $this->$methode();
88
                        $contenu = $this->$methode();
90
					}
89
                    }
91
				} else {
90
                } else {
92
					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
91
                    $this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
93
				}
92
                }
94
			} else {
93
            } else {
95
				$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé.";
94
                $this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé.";
96
			}
95
            }
97
		}
96
        }
98
 
97
        
99
		// Envoie sur la sortie standard
98
        // Envoie sur la sortie standard
100
		$encodage = 'utf-8';
99
        $encodage = 'utf-8';
101
		$mime = $this->getTypeMime();
100
        $mime = $this->getTypeMime();
102
		$formatage_json = $this->getFormatageJson();
101
        $formatage_json = $this->getFormatageJson();
103
		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
102
        $this->envoyer($contenu, $mime, $encodage, $formatage_json);
104
	}
103
    }
105
 
104
    
106
	private function chargerListeDesFlux() {
105
    private function chargerListeDesFlux() {
107
		$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL',
106
        $this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL',
108
			"Ce flux fournit l'url des nouvelles images du CEL liées à une observation.");
107
            "Ce flux fournit l'url des nouvelles images du CEL liées à une observation.");
109
		$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)',
108
        $this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)',
110
			"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation.");
109
            "Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation.");
111
		$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
110
        $this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
112
			"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
111
            "Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
113
		$this->setFlux('par-commune','Flux de syndication obsolète',
112
        $this->setFlux('par-commune','Flux de syndication obsolète',
114
			"Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
113
            "Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
115
		$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '.
114
        $this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '.
116
			'filtrées par un ou plusieurs critères',
115
            'filtrées par un ou plusieurs critères',
117
			"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ".
116
            "Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ".
118
			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ".
117
            "auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ".
119
			"et/ou date.");
118
            "et/ou date.");
120
	}
119
    }
121
 
120
    
122
	private function setFlux($nom, $titre, $description) {
121
    private function setFlux($nom, $titre, $description) {
123
		$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/';
122
        $url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/';
124
		$formats = array('atom', 'rss2', 'rss1');
123
        $formats = array('atom', 'rss2', 'rss1');
125
		$flux = array();
124
        $flux = array();
126
		foreach ($formats as $format) {
125
        foreach ($formats as $format) {
127
			$url = $url_base.$nom.'/'.$format;
126
            $url = $url_base.$nom.'/'.$format;
128
			$flux[$format] = $url;
127
            $flux[$format] = $url;
129
		}
128
        }
130
		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
129
        $this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
131
	}
130
    }
132
 
131
    
133
	private function getFlux($nom) {
132
    private function getFlux($nom) {
134
		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
133
        return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
135
	}
134
    }
136
 
135
    
137
	private function traiterNomService($nom) {
136
    private function traiterNomService($nom) {
138
		$nom = strtolower($nom);
137
        $nom = strtolower($nom);
139
		return $nom;
138
        return $nom;
140
	}
139
    }
141
 
140
    
142
	private function getNomMethodeService() {
141
    private function getNomMethodeService() {
143
		$methode = '';
142
        $methode = '';
144
		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
143
        $service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
145
		$methode = 'getService'.$service_formate;
144
        $methode = 'getService'.$service_formate;
146
		return $methode;
145
        return $methode;
147
	}
146
    }
148
 
147
    
149
	private function getUrlBase() {
148
    private function getUrlBase() {
150
		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
149
        $url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
151
		return $url_base;
150
        return $url_base;
152
	}
151
    }
153
 
152
    
154
	private function getUrlServiceBase() {
153
    private function getUrlServiceBase() {
155
		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
154
        $url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
156
		return $url_service;
155
        return $url_service;
157
	}
156
    }
158
 
157
    
159
	private function getTypeMime() {
158
    private function getTypeMime() {
160
		$mime = '';
159
        $mime = '';
161
		switch ($this->format) {
160
        switch ($this->format) {
162
			case 'atom' :
161
            case 'atom' :
163
				$mime = 'application/atom+xml';
162
                $mime = 'application/atom+xml';
164
				break;
163
                break;
165
			case 'rss1' :
164
            case 'rss1' :
166
			case 'rss2' :
165
            case 'rss2' :
167
				$mime = 'application/rss+xml';
166
                $mime = 'application/rss+xml';
168
				break;
167
                break;
169
			case 'opml' :
168
            case 'opml' :
170
				$mime = 'text/x-opml';
169
                $mime = 'text/x-opml';
171
				break;
170
                break;
172
			default:
171
            default:
173
				$mime = 'text/html';
172
                $mime = 'text/html';
174
		}
173
        }
175
		return $mime;
174
        return $mime;
176
	}
175
    }
177
 
176
    
178
	private function getFormatageJson() {
177
    private function getFormatageJson() {
179
		$json = false;
178
        $json = false;
180
		switch ($this->service) {
179
        switch ($this->service) {
181
			case 'liste-des-flux' :
180
            case 'liste-des-flux' :
182
				$json = true;
181
                $json = true;
183
				break;
182
                break;
184
			default:
183
            default:
185
				$json = false;
184
                $json = false;
186
		}
185
        }
187
		return $json;
186
        return $json;
188
	}
187
    }
189
 
188
    
190
	private function creerCategorie($element) {
189
    private function creerCategorie($element) {
191
		$categorie = '';
190
        $categorie = '';
192
		$categorie = 'Image';
191
        $categorie = 'Image';
193
		$categorie = $this->nettoyerTexte($categorie);
192
        $categorie = $this->nettoyerTexte($categorie);
194
		return $categorie;
193
        return $categorie;
195
	}
194
    }
196
 
195
    
197
	private function etreFluxAdmin() {
196
    private function etreFluxAdmin() {
198
		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
197
        return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
199
	}
198
    }
200
 
199
    
201
	private function creerUrlService() {
200
    private function creerUrlService() {
202
		$url_service = $this->getUrlServiceBase();
201
        $url_service = $this->getUrlServiceBase();
203
		if (count($_GET) > 0) {
202
        if (count($_GET) > 0) {
204
			$parametres_get = array();
203
            $parametres_get = array();
205
			foreach ($_GET as $cle => $valeur) {
204
            foreach ($_GET as $cle => $valeur) {
206
				$parametres_get[] = $cle.'='.$valeur;
205
                $parametres_get[] = $cle.'='.$valeur;
207
			}
206
            }
208
			$url_service .= '?'.implode('&amp;', $parametres_get);
207
            $url_service .= '?'.implode('&amp;', $parametres_get);
209
		}
208
        }
210
		return $url_service;
209
        return $url_service;
211
	}
210
    }
212
 
211
    
213
	protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
212
    protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) {
214
		$infos = null;
213
        $infos = null;
215
		try {
214
        try {
216
			$infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC);
215
            $infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC);
217
			if ($infos === false) {
216
            if ($infos === false) {
218
				$this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete";
217
                $this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete";
219
			}
218
            }
220
		} catch (PDOException $e) {
219
        } catch (PDOException $e) {
221
			$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
220
            $msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s';
222
			$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
221
            $this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage());
223
		}
222
        }
224
		return $infos;
223
        return $infos;
225
	}
224
    }
226
 
225
    
227
	private function executerService($elements) {
226
    private function executerService($elements) {
228
		// Prétraitement des données
227
        // Prétraitement des données
229
		$donnees = $this->construireDonneesCommunesAuFlux($elements);
228
        $donnees = $this->construireDonneesCommunesAuFlux($elements);
230
		foreach ($elements as $element) {
229
        foreach ($elements as $element) {
231
			$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
230
            $identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur'];
232
		}
231
        }
233
		$this->auteurs = $this->creerAuteurs($identifiants);
232
        $this->auteurs = $this->creerAuteurs($identifiants);
234
 
233
        
235
		foreach ($elements as $element) {
234
        foreach ($elements as $element) {
236
			$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
235
            $donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
237
		}
236
        }
238
 
237
        
239
		// Création du contenu à partir d'un template PHP
238
        // Création du contenu à partir d'un template PHP
240
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
239
        $contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
241
 
240
        
242
		return $contenu;
241
        return $contenu;
243
	}
242
    }
244
 
243
    
245
	private function construireDonneesCommunesAuFlux($infos) {
244
    private function construireDonneesCommunesAuFlux($infos) {
246
		$donnees = $this->getFlux($this->service);
245
        $donnees = $this->getFlux($this->service);
247
		$donnees['guid'] = $this->getUrlServiceBase();
246
        $donnees['guid'] = $this->getUrlServiceBase();
248
		$donnees['lien_service'] = $this->creerUrlService();
247
        $donnees['lien_service'] = $this->creerUrlService();
249
		$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
248
        $donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ?
250
			$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
249
        $this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : '';
251
		$donnees['editeur'] = $this->config['settings']['editeur'];
250
        $donnees['editeur'] = $this->config['settings']['editeur'];
252
		$derniere_info_en_date = reset($infos);
251
        $derniere_info_en_date = reset($infos);
253
		$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
252
        $date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']);
254
		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
253
        $donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
255
		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
254
        $donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
256
		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
255
        $donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
257
		$donnees['annee_courante'] = date('Y');
256
        $donnees['annee_courante'] = date('Y');
258
		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
257
        $donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage';
259
		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
258
        $donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
260
		return $donnees;
259
        return $donnees;
261
	}
260
    }
262
 
261
    
263
	private function construireDonneesCommunesAuxItems($info) {
262
    private function construireDonneesCommunesAuxItems($info) {
264
		$item = array();
263
        $item = array();
265
		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
264
        $date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']);
266
		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
265
        $item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
267
		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
266
        $item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
268
		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
267
        $item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
269
		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
268
        $item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
270
		$item['titre'] = $this->creerTitre($info);
269
        $item['titre'] = $this->creerTitre($info);
271
		$item['guid'] = $this->creerGuidItem($info);
270
        $item['guid'] = $this->creerGuidItem($info);
272
		$item['lien'] = $this->creerLienItem($info);
271
        $item['lien'] = $this->creerLienItem($info);
273
		$item['categorie'] = $this->creerCategorie($item);
272
        $item['categorie'] = $this->creerCategorie($item);
274
		$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
273
        $item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item);
275
		$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
274
        $item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item));
276
		$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
275
        $item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur']));
277
		return $item;
276
        return $item;
278
	}
277
    }
279
 
278
    
280
	private function creerGuidItem($element) {
279
    private function creerGuidItem($element) {
281
		$guid = $this->getUrlImage($element['id_image']);
280
        $guid = $this->getUrlImage($element['id_image']);
282
		return $guid;
281
        return $guid;
283
	}
282
    }
284
 
283
    
285
	private function creerTitre($element) {
284
    private function creerTitre($element) {
286
		$methode = 'creerTitre'.$this->service;
285
        $methode = 'creerTitre'.$this->service;
287
		$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
286
        $methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple';
288
		$titre = $this->$methode($element);
287
        $titre = $this->$methode($element);
289
		$titre = $this->nettoyerTexte($titre);
288
        $titre = $this->nettoyerTexte($titre);
290
		return $titre;
289
        return $titre;
291
	}
290
    }
292
 
291
    
293
	private function creerDescription($donnees, $item) {
292
    private function creerDescription($donnees, $item) {
294
		$methode = 'creerDescription'.$this->service;
293
        $methode = 'creerDescription'.$this->service;
295
		$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
294
        $methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet';
296
		$description = $this->$methode($donnees, $item);
295
        $description = $this->$methode($donnees, $item);
297
		$description = $this->nettoyerTexte($description);
296
        $description = $this->nettoyerTexte($description);
298
		return $description;
297
        return $description;
299
	}
298
    }
300
 
299
    
301
	private function creerLienItem($element) {
300
    private function creerLienItem($element) {
302
 
301
        
303
		if ($this->etreNull($element['id_observation'])) {
302
        if ($this->etreNull($element['id_observation'])) {
304
			// Lien vers image grand format
303
            // Lien vers image grand format
305
			$lien = $this->getUrlImage($element['id_image'], $this->format_image);
304
            $lien = $this->getUrlImage($element['id_image'], $this->format_image);
306
		} else {
305
        } else {
307
			// Lien vers fiche eFlore onglet Illustration
306
            // Lien vers fiche eFlore onglet Illustration
308
			$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
307
            $lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
309
		}
308
        }
310
		return $lien;
309
        return $lien;
311
	}
310
    }
312
 
311
    
313
	private function getServiceListeDesFlux() {
312
    private function getServiceListeDesFlux() {
314
		return $this->flux;
313
        return $this->flux;
315
	}
314
    }
316
 
315
    
317
	private function getServiceOpml() {
316
    private function getServiceOpml() {
318
		$donnees = array();
317
        $donnees = array();
319
		$id = 1;
318
        $id = 1;
320
		foreach ($this->flux as $flux_nom => $flux){
319
        foreach ($this->flux as $flux_nom => $flux){
321
			$info = array();
320
            $info = array();
322
			$info['type'] = 'atom';
321
            $info['type'] = 'atom';
323
			$info['titre'] = $flux['titre'];
322
            $info['titre'] = $flux['titre'];
324
			$info['texte'] = "CEL - Images - $flux_nom";
323
            $info['texte'] = "CEL - Images - $flux_nom";
325
			$info['description'] = $flux['description'];
324
            $info['description'] = $flux['description'];
326
			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
325
            $info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
327
			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
326
            $info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
328
			$donnees['liste_flux'][] = $info;
327
            $donnees['liste_flux'][] = $info;
329
		}
328
        }
330
 
329
        
331
		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
330
        $this->squelette = $this->squelette_dossier.'opml.tpl.xml';
332
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
331
        $contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
333
		return $contenu;
332
        return $contenu;
334
	}
333
    }
335
 
334
    
336
	private function getServiceSimple() {
335
    private function getServiceSimple() {
337
		if (isset($this->parametres[0])) {
336
        if (isset($this->parametres[0])) {
338
			$this->format_image = $this->parametres[0];
337
            $this->format_image = $this->parametres[0];
339
		}
338
        }
340
 
339
        
341
		// Construction de la requête
340
        // Construction de la requête
342
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
341
        $requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
343
			' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
342
            ' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
344
			' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '.
343
            ' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '.
345
			'FROM cel_export_total AS co LEFT JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '.
344
            'FROM cel_export_total AS co JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '.
346
			'WHERE co.transmission = 1 '.
345
            'WHERE co.transmission = 1 '.
347
			'	AND co.ce_utilisateur = ci.ce_utilisateur '.
346
            '	AND co.ce_utilisateur = ci.ce_utilisateur '.
348
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
347
            'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
349
			"LIMIT $this->start, $this->limit ";
348
            "LIMIT $this->start, $this->limit ";
350
 
349
        
351
		$elements = $this->executerRequete($requete);
350
        $elements = $this->executerRequete($requete);
352
 
351
        
353
		// Création du contenu
352
        // Création du contenu
354
		$contenu = $this->executerService($elements);
353
        $contenu = $this->executerService($elements);
355
		return $contenu;
354
        return $contenu;
356
	}
355
    }
357
 
356
    
358
	private function creerTitreSimple($element) {
357
    private function creerTitreSimple($element) {
359
		$date = $element['date_observation'];
358
        $date = $element['date_observation'];
360
		$date = date("d/m/Y", strtotime($date));
359
        $date = date("d/m/Y", strtotime($date));
361
		if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) {
360
        if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) {
362
			$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
361
            $titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
363
		} else {
362
        } else {
364
			$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
363
            $titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date;
365
		}
364
        }
366
		$zoneGeo = $element['zone_geo'];
365
        $zoneGeo = $element['zone_geo'];
367
		if ($zoneGeo) {
366
        if ($zoneGeo) {
368
			$titre .= " - $zoneGeo";
367
            $titre .= " - $zoneGeo";
369
		}
368
        }
370
		return $titre;
369
        return $titre;
371
	}
370
    }
372
 
371
    
373
	private function creerDescriptionSimple($donnees, $item) {
372
    private function creerDescriptionSimple($donnees, $item) {
374
		$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
373
        $description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration');
375
		return $description;
374
        return $description;
376
	}
375
    }
377
 
376
    
378
	private function getServiceComplet() {
377
    private function getServiceComplet() {
379
 
378
        
380
		// Construction de la requête
379
        // Construction de la requête
381
		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
380
        $requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '.
382
			'	ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
381
            '	ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '.
383
			'	co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '.
382
            '	co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '.
384
			'	co.commentaire AS commentaire_obs '.
383
            '	co.commentaire AS commentaire_obs '.
385
			'FROM cel_images_export AS ci '.
384
            'FROM cel_images_export AS ci '.
386
			'	LEFT JOIN cel_export_total AS co '.
385
            '	JOIN cel_export AS co '.
387
			'		ON (ci.ce_observation = co.id_observation) '.
386
            '		ON (ci.ce_observation = co.id_observation) '.
388
			(($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 ').
387
            (($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 ').
389
			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
388
            'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'ci.date_creation DESC').' '.
390
			"LIMIT $this->start, $this->limit ";
389
            "LIMIT $this->start, $this->limit ";
391
		//echo $requete;
390
            //echo $requete;
392
		$elements = $this->executerRequete($requete);
391
            $elements = $this->executerRequete($requete);
393
 
392
            
394
		// Création du contenu
393
            // Création du contenu
395
		if ($elements != false && count($elements) > 0) {
394
            if ($elements != false && count($elements) > 0) {
396
			$contenu = $this->executerService($elements);
395
                $contenu = $this->executerService($elements);
397
		} else {
396
            } else {
398
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
397
                // ne pas faire ça, car ça déclenche une erreur 500 à tort !
399
			//$this->messages[] = "Aucune image disponible.";
398
                //$this->messages[] = "Aucune image disponible.";
400
			$contenu = array();
399
                $contenu = array();
401
		}
400
            }
402
 
401
            
403
		return $contenu;
402
            return $contenu;
404
	}
403
    }
405
 
404
    
406
	private function getServiceMultiCriteres() {
405
    private function getServiceMultiCriteres() {
407
		$contenu = '';
406
        $contenu = '';
408
		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
407
        if (isset($_GET['debut'])) $this->start = $_GET['debut'];
409
		if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
408
        if (isset($_GET['limite'])) $this->limit = $_GET['limite'];
410
 
409
        
411
		$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
410
        $this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus !
412
 
411
        
413
		if ($this->parametresSontDemandes()) {
412
        if ($this->parametresSontDemandes()) {
414
			$requete = $this->creerRequeteAvecParametres();
413
            $requete = $this->creerRequeteAvecParametres();
415
		} else {
414
        } else {
416
			$requete = $this->creerRequeteSansParametres();
415
            $requete = $this->creerRequeteSansParametres();
417
		}
416
        }
418
		$elements = $this->executerRequete($requete);
417
        $elements = $this->executerRequete($requete);
419
 
418
        
420
		// Création du contenu
419
        // Création du contenu
421
		if ($elements != false && count($elements) > 0) {
420
        if ($elements != false && count($elements) > 0) {
422
			$contenu = $this->executerService($elements);
421
            $contenu = $this->executerService($elements);
423
		} else {
422
        } else {
424
			// ne pas faire ça, car ça déclenche une erreur 500 à tort !
423
            // ne pas faire ça, car ça déclenche une erreur 500 à tort !
425
			//$this->messages[] = "Aucune image disponible.";
424
            //$this->messages[] = "Aucune image disponible.";
426
		}
425
        }
427
 
426
        
428
        return $contenu;
427
        return $contenu;
429
	}
428
    }
430
 
429
    
431
	private function parametresSontDemandes() {
430
    private function parametresSontDemandes() {
432
		$criteres = $this->traiterCriteresMultiples($_GET) ;
431
        $criteres = $this->traiterCriteresMultiples($_GET) ;
433
		return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
432
        return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres);
434
	}
433
    }
435
 
434
    
436
	private function creerRequeteSansParametres() {
435
    private function creerRequeteSansParametres() {
437
		// Construction de la requête
436
        // Construction de la requête
438
		$requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '.
437
        $requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '.
439
			' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '.
438
            ' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '.
440
			'FROM cel_images_export c '.
439
            'FROM cel_images_export c '.
441
			'	left JOIN cel_export AS b '.
440
            '	JOIN cel_export AS b '.
442
			'		ON (c.ce_observation = b.id_observation) ';
441
            '		ON (c.ce_observation = b.id_observation) ';
443
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
442
        $requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'c.date_creation DESC').' '.
444
				"LIMIT $this->start,$this->limit ";
443
            "LIMIT $this->start,$this->limit ";
445
		//echo $requete;
444
        //echo $requete;
446
		return $requete;
445
        return $requete;
447
	}
446
    }
448
 
447
    
449
	private function creerRequeteAvecParametres() {
448
    private function creerRequeteAvecParametres() {
450
		// Construction de la requête
449
        // Construction de la requête
451
		$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
450
        $requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '.
452
		    ' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '.
451
            ' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '.
453
			'FROM cel_images_export AS c '.
452
            'FROM cel_images_export AS c '.
454
			'	INNER JOIN cel_export_total AS b '.
453
            '	JOIN cel_export_total AS b '.
455
			'		ON (c.ce_observation = b.id_observation) '.
454
            '		ON (c.ce_observation = b.id_observation) '.
456
			'WHERE donnees_standard = 1'.
455
            'WHERE '.
457
			(($this->etreFluxAdmin()) ? '' : ' AND b.transmission = 1 ').
456
            (($this->etreFluxAdmin()) ? '' : ' b.transmission = 1 ').
458
			'	AND ';
457
            '	AND ';
459
 
458
            
460
		if ($this->estUneRechercheGenerale()) {
459
            if ($this->estUneRechercheGenerale()) {
461
			$chaine_requete = $_GET['recherche'];
460
                $chaine_requete = $_GET['recherche'];
462
			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
461
                $requete .= "donnees_standard =  1 AND ".$this->creerSousRequeteRechercheGenerale($chaine_requete);
463
		} else {
462
            } else {
464
			$criteres = $this->traiterCriteresMultiples($_GET) ;
463
                $criteres = $this->traiterCriteresMultiples($_GET) ;
-
 
464
                if (!isset($_GET["standard"])) {
-
 
465
                    $requete .= "donnees_standard =  1 AND ";
-
 
466
                } elseif ($_GET["standard"] = 1) {
-
 
467
                    $requete .= "donnees_standard =  1 AND ";
-
 
468
                }
465
			if (!empty($criteres)) {
469
                if (!empty($criteres)) {
466
				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
470
                    $requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
467
			}
471
                }
468
		}
472
            }
469
		$requete = str_replace(' AND ) ',' ', $requete);
473
            $requete = str_replace(' AND ) ',' ', $requete);
470
		$requete = rtrim($requete, 'AND ');
474
            $requete = rtrim($requete, 'AND ');
471
		$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
475
            $requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
472
			'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
476
                'c.date_creation DESC').' '."LIMIT $this->start,$this->limit ";
473
		return $requete;
477
            return $requete;
474
	}
478
    }
475
 
479
    
476
	private function creerSousRequeteRechercheParCriteres($criteres) {
480
    private function creerSousRequeteRechercheParCriteres($criteres) {
477
		$requete = '';
481
        $requete = '';
478
		foreach ($criteres as $pair) {
482
        foreach ($criteres as $pair) {
479
			$nom_valeur = explode("=",$pair);
483
            $nom_valeur = explode("=",$pair);
480
			if (sizeof($nom_valeur) != 0) {
484
            if (sizeof($nom_valeur) != 0) {
481
				switch ($nom_valeur[0]) {
485
                switch ($nom_valeur[0]) {
482
					case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
486
                    case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break;
483
					case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
487
                    case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break;
484
					case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
488
                    case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
485
						foreach($mots_comment_liste as $mot_comment) {
489
                    foreach($mots_comment_liste as $mot_comment) {
486
							$mot_comment = trim($mot_comment) ;
490
                        $mot_comment = trim($mot_comment) ;
487
							$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
491
                        $requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND ';
488
						}
492
                    }
489
						break;
493
                    break;
490
					case "c.date_prise_de_vue" :
494
                    case "c.date_prise_de_vue" :
491
						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
495
                        $nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
492
						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
496
                        if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
493
							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
497
                            $nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
494
						}
498
                        }
495
						$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
499
                        $requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break;
496
					case "b.ce_zone_geo" :
500
                    case "b.ce_zone_geo" :
497
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break;
501
                        $requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break;
498
					case "b.nom_ret" :
502
                    case "b.nom_ret" :
499
						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
503
                        if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
500
						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
504
                        $requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'.
501
							$nom_valeur[1].'%") AND '; break;
505
                            $nom_valeur[1].'%") AND '; break;
502
					case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
506
                    case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break;
503
					case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
507
                    case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break;
504
					case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break;
508
                    case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break;
505
					case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
509
                    case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break;
506
					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
510
                    default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
507
				}
511
                }
508
			}
512
            }
509
		}
513
        }
510
		$requete = rtrim($requete,' AND ');
514
        $requete = rtrim($requete,' AND ');
511
		return $requete;
515
        return $requete;
512
	}
516
    }
513
	
517
    
514
	private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
518
    private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) {
515
		$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
519
        $req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo);
516
		$res = Cel::db()->requeter($req);
520
        $res = Cel::db()->requeter($req);
517
		$zones = array();
521
        $zones = array();
518
		foreach($res as &$r) {
522
        foreach($res as &$r) {
519
			$zones[] = Cel::db()->proteger($r['valeur']);
523
            $zones[] = Cel::db()->proteger($r['valeur']);
520
		}
524
        }
521
		$sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) ';
525
        $sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) ';
522
	
526
        
523
		return $sql;
527
        return $sql;
524
	}
528
    }
525
 
529
    
526
	private function creerSousRequeteMotsCles($mot_cle) {
530
    private function creerSousRequeteMotsCles($mot_cle) {
527
	$requete = '';
531
        $requete = '';
528
		if (preg_match('/.*OU.*/', $mot_cle)) {
532
        if (preg_match('/.*OU.*/', $mot_cle)) {
529
			$mots_cles_tab = explode('OU',$mot_cle);
533
            $mots_cles_tab = explode('OU',$mot_cle);
530
			foreach($mots_cles_tab as $mot_cle_item) {
534
            foreach($mots_cles_tab as $mot_cle_item) {
531
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
535
                $requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
532
			}
536
            }
533
			$requete = '('.rtrim($requete,'OR ').')';
537
            $requete = '('.rtrim($requete,'OR ').')';
534
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
538
        } else if (preg_match('/.*ET.*/', $mot_cle)) {
535
			$mots_cles_tab = explode('ET',$mot_cle);
539
            $mots_cles_tab = explode('ET',$mot_cle);
536
			foreach($mots_cles_tab as $mot_cle_item) {
540
            foreach($mots_cles_tab as $mot_cle_item) {
537
				$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
541
                $requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
538
			}
542
            }
539
			$requete = '('.rtrim($requete, 'AND ').') ';
543
            $requete = '('.rtrim($requete, 'AND ').') ';
540
		} else {
544
        } else {
541
			$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
545
            $requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
542
		}
546
        }
543
		return $requete;
547
        return $requete;
544
	}
548
    }
545
 
549
    
546
	private function creerSousRequeteProjet($mot_cle) {
550
    private function creerSousRequeteProjet($mot_cle) {
547
		$requete = '';
551
        $requete = '';
548
		if (preg_match('/.*OU.*/', $mot_cle)) {
552
        if (preg_match('/.*OU.*/', $mot_cle)) {
549
			$mots_cles_tab = explode('OU',$mot_cle);
553
            $mots_cles_tab = explode('OU',$mot_cle);
550
			foreach($mots_cles_tab as $mot_cle_item) {
554
            foreach($mots_cles_tab as $mot_cle_item) {
551
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
555
                $requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR ';
552
			}
556
            }
553
			$requete = '('.rtrim($requete,'OR ').')';
557
            $requete = '('.rtrim($requete,'OR ').')';
554
		} else if (preg_match('/.*ET.*/', $mot_cle)) {
558
        } else if (preg_match('/.*ET.*/', $mot_cle)) {
555
			$mots_cles_tab = explode('ET',$mot_cle);
559
            $mots_cles_tab = explode('ET',$mot_cle);
556
			foreach($mots_cles_tab as $mot_cle_item) {
560
            foreach($mots_cles_tab as $mot_cle_item) {
557
				$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
561
                $requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND ';
558
			}
562
            }
559
			$requete = '('.rtrim($requete, 'AND ').') ';
563
            $requete = '('.rtrim($requete, 'AND ').') ';
560
		} else {
564
        } else {
561
			$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
565
            $requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') ';
562
		}
566
        }
563
		return $requete;
567
        return $requete;
564
	}
568
    }
565
 
569
    
566
	private function creerSousRequeteReferentiel($referentiel) {
570
    private function creerSousRequeteReferentiel($referentiel) {
567
		$requete = "b.nom_referentiel LIKE '$referentiel%'";
571
        $requete = "b.nom_referentiel LIKE '$referentiel%'";
568
		return $requete;
572
        return $requete;
569
	}
573
    }
570
 
574
    
571
	private function creerSousRequeteRechercheGenerale($chaine_requete) {
575
    private function creerSousRequeteRechercheGenerale($chaine_requete) {
572
		$requete = '';
576
        $requete = '';
573
		if (trim($chaine_requete) != '') {
577
        if (trim($chaine_requete) != '') {
574
			$chaine_requete = strtolower($chaine_requete);
578
            $chaine_requete = strtolower($chaine_requete);
575
			$chaine_requete = str_replace(' ', '_', $chaine_requete);
579
            $chaine_requete = str_replace(' ', '_', $chaine_requete);
576
			$requete = ' ('.
580
            $requete = ' ('.
577
				'b.nom_ret LIKE "'.$chaine_requete.'%"'.
581
                'b.nom_ret LIKE "'.$chaine_requete.'%"'.
578
				' OR '.
582
                ' OR '.
579
				'b.nom_sel LIKE "'.$chaine_requete.'%"'.
583
                'b.nom_sel LIKE "'.$chaine_requete.'%"'.
580
				' OR '.
584
                ' OR '.
581
				'b.zone_geo LIKE "'.$chaine_requete.'%" '.
585
                'b.zone_geo LIKE "'.$chaine_requete.'%" '.
582
				' OR '.
586
                ' OR '.
583
				'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
587
                'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '.
584
				' OR '.
588
                ' OR '.
585
				'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
589
                'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '.
586
				' OR '.
590
                ' OR '.
587
				'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
591
                'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '.
588
				' OR '.
592
                ' OR '.
589
				'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
593
                'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '.
590
				' OR '.
594
                ' OR '.
591
				'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
595
                'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '.
592
				') ';
596
                ') ';
593
		}
597
        }
594
		return $requete;
598
        return $requete;
595
	}
599
    }
596
 
600
    
597
	private function estUneRechercheGenerale() {
601
    private function estUneRechercheGenerale() {
598
		return isset($_GET['recherche']);
602
        return isset($_GET['recherche']);
599
	}
603
    }
600
 
604
    
601
	private function traiterCriteresMultiples($tableau_criteres) {
605
    private function traiterCriteresMultiples($tableau_criteres) {
602
		$tableau_criteres_pour_bdd = array();
606
        $tableau_criteres_pour_bdd = array();
603
 
607
        
604
		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
608
        foreach($tableau_criteres as $nom_critere => $valeur_critere) {
605
			if (isset($this->criteres[$nom_critere])) {
609
            if (isset($this->criteres[$nom_critere])) {
606
				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
610
                $tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
607
			}
611
            }
608
		}
612
        }
609
		return $tableau_criteres_pour_bdd;
613
        return $tableau_criteres_pour_bdd;
610
	}
614
    }
611
 
615
    
612
	private function creerDescriptionComplet($donnees, $item) {
616
    private function creerDescriptionComplet($donnees, $item) {
613
		$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
617
        $auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']);
614
		$auteur_mail = $donnees['courriel_utilisateur'];
618
        $auteur_mail = $donnees['courriel_utilisateur'];
615
 
619
        
616
		$id_img = $donnees['id_image'];
620
        $id_img = $donnees['id_image'];
617
		$nom_fichier = $donnees['nom_original'];
621
        $nom_fichier = $donnees['nom_original'];
618
		$url_img = $this->getUrlImage($donnees['id_image'], 'CS');
622
        $url_img = $this->getUrlImage($donnees['id_image'], 'CS');
619
		$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
623
        $url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL');
620
		//
624
        //
621
		$mots_cles_image = $donnees['mots_cles_texte_images'];
625
        $mots_cles_image = $donnees['mots_cles_texte_images'];
622
		$note = ($donnees['note_qualite'] +1).'/5';
626
        $note = ($donnees['note_qualite'] +1).'/5';
623
		$commentaire_img = $donnees['commentaire_img'];
627
        $commentaire_img = $donnees['commentaire_img'];
624
 
628
        
625
		$id_obs = $donnees['id_observation'];
629
        $id_obs = $donnees['id_observation'];
626
		$famille = $donnees['famille'];
630
        $famille = $donnees['famille'];
627
		$nom_saisi = $donnees['nom_sel'];
631
        $nom_saisi = $donnees['nom_sel'];
628
		$nom_retenu = $donnees['nom_ret'];
632
        $nom_retenu = $donnees['nom_ret'];
629
		//
633
        //
630
		$mots_cles_obs = $donnees['mots_cles_texte_obs'];
634
        $mots_cles_obs = $donnees['mots_cles_texte_obs'];
631
		
635
        
632
		$lieu =  $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station'];
636
        $lieu =  $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station'];
633
		$milieu = $donnees['milieu'];
637
        $milieu = $donnees['milieu'];
634
		$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
638
        $coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude'];
635
		$commentaire_obs = $donnees['commentaire_obs'];
639
        $commentaire_obs = $donnees['commentaire_obs'];
636
		$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
640
        $date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y');
637
		$date_transmission = $this->formaterDate($donnees['date_transmission']);
641
        $date_transmission = $this->formaterDate($donnees['date_transmission']);
638
		$date_modification = $this->formaterDate($donnees['date_modification']);
642
        $date_modification = $this->formaterDate($donnees['date_modification']);
639
		$date_creation = $this->formaterDate($donnees['date_creation']);
643
        $date_creation = $this->formaterDate($donnees['date_creation']);
640
		$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
644
        $transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
641
 
645
        
642
		$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
646
        $description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'.
643
			'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
647
            '<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'.
644
			'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
648
            '<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'.
645
			'<div class="gauche">'.
649
            '<div class="gauche">'.
646
			'<h3>'.'Image'.'</h3>'.
650
            '<h3>'.'Image'.'</h3>'.
647
			'<ul>'.
651
            '<ul>'.
648
			'<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'.jpg" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
652
            '<li>'.'<span class="champ">URL :</span> <a href="'.$url_img_normale.'.jpg" onclick="javascript:window.open(this.href);return false;">'.$url_img_normale.'</a></li>'.
649
			'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
653
            '<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'.
650
			'<li>'.'<span class="champ">Par :</span> '.
654
            '<li>'.'<span class="champ">Par :</span> '.
651
				(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
655
            (($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur).
652
			'</li>'.
656
            '</li>'.
653
			'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
657
            '<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'.
654
			'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
658
            '<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'.
655
			'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
659
            '<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'.
656
			'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
660
            '<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'.
657
			'</ul>'.
661
            '</ul>'.
658
			'</div>';
662
            '</div>';
659
			// TODO : ajouter le champ commentaire EXIF.
663
            // TODO : ajouter le champ commentaire EXIF.
660
		if (! $this->etreNull($id_obs)) {
664
            if (! $this->etreNull($id_obs)) {
661
			$description .=
665
                $description .=
662
				'<div class="gauche">'.
666
                '<div class="gauche">'.
663
				'<h3>'.'Observation'.'</h3>'.
667
                '<h3>'.'Observation'.'</h3>'.
664
				'<ul>'.
668
                '<ul>'.
665
				'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
669
                '<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'.
666
				'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
670
                '<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'.
667
				'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
671
                '<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'.
668
				'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
672
                '<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'.
669
				'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
673
                '<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'.
670
				'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
674
                '<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'.
671
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
675
                (($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : '').
672
				'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
676
                '<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'.
673
				'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
677
                '<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'.
674
				(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
678
                (($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : '').
675
				'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
679
                '<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'.
676
				'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
680
                '<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'.
677
				'</ul>'.
681
                '</ul>'.
678
				'</div>';
682
                '</div>';
679
		}
683
            }
680
		$description = $this->nettoyerTexte($description);
684
            $description = $this->nettoyerTexte($description);
681
		return $description;
685
            return $description;
682
	}
686
    }
683
 
687
    
684
	private function getServiceParMotsCles() {
688
    private function getServiceParMotsCles() {
685
		$infos=array();
689
        $infos=array();
686
		$infos[0]['nom_sel_nn'] = '';
690
        $infos[0]['nom_sel_nn'] = '';
687
		$infos[0]['date_creation'] = '2011-06-28';
691
        $infos[0]['date_creation'] = '2011-06-28';
688
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
692
        $donnees = $this->construireDonneesCommunesAuFlux($infos);
689
		$donnees['items'][0]['guid'] = 0;
693
        $donnees['items'][0]['guid'] = 0;
690
		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
694
        $donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
691
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
695
            '<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag=';
692
		if (isset($this->parametres[0])) {
696
        if (isset($this->parametres[0])) {
693
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
697
            $donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
694
		} else {
698
        } else {
695
			$donnees['items'][0]['description'] .= '</b>';
699
            $donnees['items'][0]['description'] .= '</b>';
696
		}
700
        }
697
		$donnees['items'][0]['titre'] = '';
701
        $donnees['items'][0]['titre'] = '';
698
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
702
        $contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
699
		return $contenu;
703
        return $contenu;
700
	}
704
    }
701
 
705
    
702
	private function getServiceParCommune() {
706
    private function getServiceParCommune() {
703
		$infos=array();
707
        $infos=array();
704
		$infos[0]['nom_sel_nn'] = '';
708
        $infos[0]['nom_sel_nn'] = '';
705
		$infos[0]['date_creation'] = '2011-06-28';
709
        $infos[0]['date_creation'] = '2011-06-28';
706
		$donnees = $this->construireDonneesCommunesAuFlux($infos);
710
        $donnees = $this->construireDonneesCommunesAuFlux($infos);
707
		$donnees['items'][0]['guid'] = 0;
711
        $donnees['items'][0]['guid'] = 0;
708
		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
712
        $donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
709
			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
713
            '<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune=';
710
		if (isset($this->parametres[0])) {
714
        if (isset($this->parametres[0])) {
711
			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
715
            $donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
712
		} else {
716
        } else {
713
			$donnees['items'][0]['description'] .= '</b>';
717
            $donnees['items'][0]['description'] .= '</b>';
714
		}
718
        }
715
		$donnees['items'][0]['titre'] = '';
719
        $donnees['items'][0]['titre'] = '';
716
		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
720
        $contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
717
		return $contenu;
721
        return $contenu;
718
	}
722
    }
719
 
723
    
720
	private function getIntituleAuteur($courriel) {
724
    private function getIntituleAuteur($courriel) {
721
		$courriel = strtolower($courriel);
725
        $courriel = strtolower($courriel);
722
		$intitule = $this->auteurs[$courriel];
726
        $intitule = $this->auteurs[$courriel];
723
		return $intitule;
727
        return $intitule;
724
	}
728
    }
725
}
729
}