| 416 | aurelien | 1 | <?php
 | 
        
           |  |  | 2 | /**
 | 
        
           |  |  | 3 |  * Service fournissant des informations concernant le CEL au format RSS1, RSS2 ou ATOM.
 | 
        
           |  |  | 4 |  * Encodage en entrée : utf8
 | 
        
           |  |  | 5 |  * Encodage en sortie : utf8
 | 
        
           |  |  | 6 |  * Format du service :
 | 
        
           |  |  | 7 |  * /CelSyndicationObservation/liste-des-flux
 | 
        
           |  |  | 8 |  * /CelSyndicationObservation/opml
 | 
        
           |  |  | 9 |  * /CelSyndicationObservation/par-defaut/(rss1|rss2|atom)?start=0&limit=150
 | 
        
           |  |  | 10 |  * /CelSyndicationObservation/pour-admin/(rss1|rss2|atom)?start=0&limit=150
 | 
        
           |  |  | 11 |  * /CelSyndicationObservation/par-mots-cles/(rss1|rss2|atom)/mot-cle?start=0&limit=150
 | 
        
           |  |  | 12 |  * /CelSyndicationObservation/par-commune/(rss1|rss2|atom)/nom-commune?start=0&limit=150
 | 
        
           |  |  | 13 |  *
 | 
        
           |  |  | 14 |  * Les paramêtres :
 | 
        
           |  |  | 15 |  *  - "start" indique le numéro du premier item à afficher
 | 
        
           |  |  | 16 |  *  - "limit" nombre d'items à afficher
 | 
        
           |  |  | 17 |  *
 | 
        
           |  |  | 18 |  * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
 | 
        
           |  |  | 19 |  * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 20 |  * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 21 |  * @version $Id$
 | 
        
           |  |  | 22 |  * @copyright 2010
 | 
        
           |  |  | 23 |  */
 | 
        
           |  |  | 24 | class CelSyndicationObservation extends Cel {
 | 
        
           |  |  | 25 |   | 
        
           | 528 | jpm | 26 | 	private $parametres_origines = null;
 | 
        
           | 416 | aurelien | 27 | 	private $format = null;
 | 
        
           |  |  | 28 | 	private $service = null;
 | 
        
           |  |  | 29 | 	private $squelette = null;
 | 
        
           |  |  | 30 | 	private $squelette_dossier = null;
 | 
        
           |  |  | 31 | 	private $flux = array();
 | 
        
           | 715 | delphine | 32 | 	private $criteres = array(
 | 
        
           | 741 | delphine | 33 | 		'utilisateur' => 'identifiant',
 | 
        
           | 715 | delphine | 34 | 		'commune' => 'location',
 | 
        
           | 741 | delphine | 35 | 		'dept' => 'id_location',
 | 
        
           | 715 | delphine | 36 | 		'taxon' => 'nom_ret',
 | 
        
           |  |  | 37 | 		'commentaire' => 'commentaire',
 | 
        
           |  |  | 38 | 		'date' => 'date_observation',
 | 
        
           |  |  | 39 | 		'projet' => 'mots-cles');
 | 
        
           | 416 | aurelien | 40 |   | 
        
           |  |  | 41 | 	/**
 | 
        
           |  |  | 42 | 	 * Méthode appelée avec une requête de type GET.
 | 
        
           |  |  | 43 | 	 */
 | 
        
           |  |  | 44 | 	public function getElement($params = array()) {
 | 
        
           |  |  | 45 | 		// Initialisation des variables
 | 
        
           | 528 | jpm | 46 | 		$this->parametres_origines = $params;
 | 
        
           | 416 | aurelien | 47 | 		$info = array();
 | 
        
           |  |  | 48 | 		$contenu = '';
 | 
        
           |  |  | 49 |   | 
        
           | 536 | jpm | 50 | 		if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) {
 | 
        
           | 525 | jpm | 51 | 			// Pré traitement des paramêtres
 | 
        
           |  |  | 52 | 			$pour_bdd = false;
 | 
        
           |  |  | 53 | 			$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd);
 | 
        
           |  |  | 54 | 			extract($p);
 | 
        
           |  |  | 55 | 			$this->parametres = $params;
 | 
        
           |  |  | 56 | 			$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
 | 
        
           | 416 | aurelien | 57 |   | 
        
           | 525 | jpm | 58 | 			// Récupération de la liste des flux
 | 
        
           |  |  | 59 | 			$this->chargerListeDesFlux();
 | 
        
           |  |  | 60 |   | 
        
           |  |  | 61 | 			// Chargement du bon type de service demandé
 | 
        
           |  |  | 62 | 			if (isset($service)) {
 | 
        
           |  |  | 63 | 				$this->service = $this->traiterNomService($service);
 | 
        
           |  |  | 64 | 				$methode = $this->getNomMethodeService();
 | 
        
           |  |  | 65 | 				if (method_exists($this, $methode)) {
 | 
        
           |  |  | 66 | 					if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) {
 | 
        
           |  |  | 67 | 						// Mise en minuscule de l'indication du format
 | 
        
           |  |  | 68 | 						$this->format = strtolower($format);
 | 
        
           |  |  | 69 | 						// Définition du fichier squelette demandé
 | 
        
           |  |  | 70 | 						$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
 | 
        
           |  |  | 71 | 					} else if (isset($this->flux[$this->service])) {
 | 
        
           |  |  | 72 | 						$this->format = '';
 | 
        
           |  |  | 73 | 						$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
 | 
        
           |  |  | 74 | 					}
 | 
        
           |  |  | 75 |   | 
        
           |  |  | 76 | 					if (!isset($this->flux[$this->service]) || isset($this->format)) {
 | 
        
           |  |  | 77 | 						// Suppression des paramêtres inutile pour le reste des méthodes
 | 
        
           |  |  | 78 | 						array_shift($this->parametres);
 | 
        
           |  |  | 79 | 						array_shift($this->parametres);
 | 
        
           |  |  | 80 |   | 
        
           |  |  | 81 | 						// Récupération du contenu à renvoyer
 | 
        
           |  |  | 82 | 						$contenu = $this->$methode();
 | 
        
           |  |  | 83 | 					}
 | 
        
           |  |  | 84 | 				} else {
 | 
        
           |  |  | 85 | 					$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
 | 
        
           | 416 | aurelien | 86 | 				}
 | 
        
           |  |  | 87 | 			} else {
 | 
        
           | 525 | jpm | 88 | 				$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé.";
 | 
        
           | 416 | aurelien | 89 | 			}
 | 
        
           |  |  | 90 | 		}
 | 
        
           |  |  | 91 |   | 
        
           |  |  | 92 | 		// Envoie sur la sortie standard
 | 
        
           |  |  | 93 | 		$encodage = 'utf-8';
 | 
        
           |  |  | 94 | 		$mime = $this->getTypeMime();
 | 
        
           |  |  | 95 | 		$formatage_json = $this->getFormatageJson();
 | 
        
           |  |  | 96 | 		$this->envoyer($contenu, $mime, $encodage, $formatage_json);
 | 
        
           |  |  | 97 | 	}
 | 
        
           |  |  | 98 |   | 
        
           |  |  | 99 | 	private function getUrlBase() {
 | 
        
           | 637 | jpm | 100 | 		$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/');
 | 
        
           | 416 | aurelien | 101 | 		return $url_base;
 | 
        
           |  |  | 102 | 	}
 | 
        
           |  |  | 103 |   | 
        
           |  |  | 104 | 	private function getUrlServiceBase() {
 | 
        
           | 528 | jpm | 105 | 		$url_service = $this->getUrlBase().implode('/', $this->parametres_origines);
 | 
        
           | 416 | aurelien | 106 | 		return $url_service;
 | 
        
           |  |  | 107 | 	}
 | 
        
           |  |  | 108 |   | 
        
           |  |  | 109 | 	private function traiterNomService($nom) {
 | 
        
           |  |  | 110 | 		$nom = strtolower($nom);
 | 
        
           |  |  | 111 | 		return $nom;
 | 
        
           |  |  | 112 | 	}
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 | 	private function getNomMethodeService() {
 | 
        
           |  |  | 115 | 		$methode = '';
 | 
        
           |  |  | 116 | 		$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service))));
 | 
        
           |  |  | 117 | 		$methode = 'getService'.$service_formate;
 | 
        
           |  |  | 118 | 		return $methode;
 | 
        
           |  |  | 119 | 	}
 | 
        
           |  |  | 120 |   | 
        
           |  |  | 121 | 	private function getTypeMime() {
 | 
        
           |  |  | 122 | 		$mime = '';
 | 
        
           |  |  | 123 | 		$test = isset($this->format) ? $this->format : $this->service;
 | 
        
           |  |  | 124 | 		switch ($test) {
 | 
        
           |  |  | 125 | 			case 'atom' :
 | 
        
           |  |  | 126 | 				$mime = 'application/atom+xml';
 | 
        
           |  |  | 127 | 				break;
 | 
        
           |  |  | 128 | 			case 'rss1' :
 | 
        
           |  |  | 129 | 			case 'rss2' :
 | 
        
           |  |  | 130 | 				$mime = 'application/rss+xml';
 | 
        
           |  |  | 131 | 				break;
 | 
        
           |  |  | 132 | 			case 'opml' :
 | 
        
           |  |  | 133 | 				$mime = 'text/x-opml';
 | 
        
           |  |  | 134 | 				break;
 | 
        
           |  |  | 135 | 			default:
 | 
        
           |  |  | 136 | 				$mime = 'text/html';
 | 
        
           |  |  | 137 | 		}
 | 
        
           |  |  | 138 | 		return $mime;
 | 
        
           |  |  | 139 | 	}
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | 	private function getFormatageJson() {
 | 
        
           |  |  | 142 | 		$json = false;
 | 
        
           |  |  | 143 | 		switch ($this->service) {
 | 
        
           |  |  | 144 | 			case 'liste-des-flux' :
 | 
        
           |  |  | 145 | 				$json = true;
 | 
        
           |  |  | 146 | 				break;
 | 
        
           |  |  | 147 | 			default:
 | 
        
           |  |  | 148 | 				$json = false;
 | 
        
           |  |  | 149 | 		}
 | 
        
           |  |  | 150 | 		return $json;
 | 
        
           |  |  | 151 | 	}
 | 
        
           |  |  | 152 |   | 
        
           |  |  | 153 | 	private function getFlux($nom) {
 | 
        
           |  |  | 154 | 		return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
 | 
        
           |  |  | 155 | 	}
 | 
        
           |  |  | 156 |   | 
        
           |  |  | 157 | 	private function setFlux($nom, $titre, $description) {
 | 
        
           |  |  | 158 | 		$url_base = $this->getUrlBase();
 | 
        
           |  |  | 159 | 		$formats = array('atom', 'rss2', 'rss1');
 | 
        
           |  |  | 160 | 		$flux = array();
 | 
        
           |  |  | 161 | 		foreach ($formats as $format) {
 | 
        
           |  |  | 162 | 			$url = $url_base.$nom.'/'.$format;
 | 
        
           |  |  | 163 | 			$flux[$format] = $url;
 | 
        
           |  |  | 164 | 		}
 | 
        
           |  |  | 165 | 		$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
 | 
        
           |  |  | 166 | 	}
 | 
        
           |  |  | 167 |   | 
        
           |  |  | 168 | 	private function chargerListeDesFlux() {
 | 
        
           |  |  | 169 | 		$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL',
 | 
        
           |  |  | 170 | 			'Ce flux fournit des informations sur les observations du CEL.');
 | 
        
           | 742 | delphine | 171 | 		$this->setFlux('par-mots-cles', 'Flux de syndication obsolète',
 | 
        
           |  |  | 172 | 			"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'.");
 | 
        
           |  |  | 173 | 		$this->setFlux('par-commune','Flux de syndication obsolète',
 | 
        
           |  |  | 174 | 			"Ce flux  est désormais accessible via le flux multicriteres/atom/M?commune='commune'.");
 | 
        
           |  |  | 175 | 		$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '.
 | 
        
           |  |  | 176 | 			'filtrées par un ou plusieurs critères',
 | 
        
           |  |  | 177 | 			"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ".
 | 
        
           |  |  | 178 | 			"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ".
 | 
        
           |  |  | 179 | 			"et/ou date.");
 | 
        
           | 416 | aurelien | 180 | 	}
 | 
        
           |  |  | 181 |   | 
        
           |  |  | 182 | 	private function getServiceListeDesFlux() {
 | 
        
           |  |  | 183 | 		return $this->flux;
 | 
        
           |  |  | 184 | 	}
 | 
        
           |  |  | 185 |   | 
        
           |  |  | 186 | 	private function getServiceOpml() {
 | 
        
           |  |  | 187 | 		$donnees = array();
 | 
        
           |  |  | 188 | 		$id = 1;
 | 
        
           |  |  | 189 | 		foreach ($this->flux as $flux_nom => $flux){
 | 
        
           |  |  | 190 | 			$info = array();
 | 
        
           |  |  | 191 | 			$info['type'] = 'atom';
 | 
        
           |  |  | 192 | 			$info['titre'] = $flux['titre'];
 | 
        
           |  |  | 193 | 			$info['texte'] = "CEL - Obs - $flux_nom";
 | 
        
           |  |  | 194 | 			$info['description'] = $flux['description'];
 | 
        
           |  |  | 195 | 			$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom';
 | 
        
           |  |  | 196 | 			$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication';
 | 
        
           |  |  | 197 | 			$donnees['liste_flux'][] = $info;
 | 
        
           |  |  | 198 | 		}
 | 
        
           |  |  | 199 |   | 
        
           |  |  | 200 | 		$this->squelette = $this->squelette_dossier.'opml.tpl.xml';
 | 
        
           |  |  | 201 | 		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
 | 
        
           |  |  | 202 | 		return $contenu;
 | 
        
           |  |  | 203 | 	}
 | 
        
           |  |  | 204 |   | 
        
           |  |  | 205 | 	private function getServiceParDefaut() {
 | 
        
           |  |  | 206 | 		// Construction de la requête
 | 
        
           | 715 | delphine | 207 | 		$requete = 	(isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
 | 
        
           | 416 | aurelien | 208 | 			'FROM cel_inventory '.
 | 
        
           | 528 | jpm | 209 | 			(($this->etreFluxAdmin()) ? '' : 'WHERE transmission = 1 ').
 | 
        
           | 715 | delphine | 210 | 			'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  : 'date_modification DESC').' '.
 | 
        
           | 416 | aurelien | 211 | 			"LIMIT $this->start,$this->limit ";
 | 
        
           |  |  | 212 |   | 
        
           |  |  | 213 | 		$elements = $this->executerRequete($requete);
 | 
        
           |  |  | 214 |   | 
        
           |  |  | 215 | 		// Création du contenu
 | 
        
           |  |  | 216 | 		$contenu = $this->executerService($elements);
 | 
        
           |  |  | 217 | 		return $contenu;
 | 
        
           |  |  | 218 | 	}
 | 
        
           |  |  | 219 |   | 
        
           |  |  | 220 | 	private function getServiceParMotsCles() {
 | 
        
           | 743 | delphine | 221 | 		$infos=array();
 | 
        
           |  |  | 222 | 		$infos[0]['num_nom_sel'] = '';
 | 
        
           |  |  | 223 | 		$infos[0]['date_modification'] = '2011-06-28';
 | 
        
           |  |  | 224 | 		$donnees = $this->construireDonneesCommunesAuFlux($infos);
 | 
        
           |  |  | 225 | 		$donnees['items'][0]['guid'] = 0;
 | 
        
           |  |  | 226 | 		$donnees['items'][0]['description'] =  'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
 | 
        
           |  |  | 227 | 			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?projet=';
 | 
        
           |  |  | 228 | 		if (isset($this->parametres[0])) {
 | 
        
           |  |  | 229 | 			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
 | 
        
           | 416 | aurelien | 230 | 		} else {
 | 
        
           | 743 | delphine | 231 | 			$donnees['items'][0]['description'] .= '</b>';
 | 
        
           | 416 | aurelien | 232 | 		}
 | 
        
           | 743 | delphine | 233 | 		$donnees['items'][0]['titre'] = '';
 | 
        
           |  |  | 234 | 		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
 | 
        
           | 416 | aurelien | 235 | 		return $contenu;
 | 
        
           |  |  | 236 | 	}
 | 
        
           |  |  | 237 |   | 
        
           |  |  | 238 | 	private function getServiceParCommune() {
 | 
        
           | 743 | delphine | 239 | 		$infos=array();
 | 
        
           |  |  | 240 | 		$infos[0]['num_nom_sel'] = '';
 | 
        
           |  |  | 241 | 		$infos[0]['date_modification'] = '2011-06-28';
 | 
        
           |  |  | 242 | 		$donnees = $this->construireDonneesCommunesAuFlux($infos);
 | 
        
           |  |  | 243 | 		$donnees['items'][0]['guid'] = 0;
 | 
        
           |  |  | 244 | 		$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '.
 | 
        
           |  |  | 245 | 			'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationObservation/multicriteres/atom?commune=';
 | 
        
           |  |  | 246 | 		if (isset($this->parametres[0])) {
 | 
        
           |  |  | 247 | 			$donnees['items'][0]['description'] .= $this->parametres[0].'</b>';
 | 
        
           | 416 | aurelien | 248 | 		} else {
 | 
        
           | 743 | delphine | 249 | 			$donnees['items'][0]['description'] .= '</b>';
 | 
        
           | 416 | aurelien | 250 | 		}
 | 
        
           | 743 | delphine | 251 | 		$donnees['items'][0]['titre'] = '';
 | 
        
           |  |  | 252 | 		$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
 | 
        
           | 416 | aurelien | 253 | 		return $contenu;
 | 
        
           |  |  | 254 | 	}
 | 
        
           |  |  | 255 |   | 
        
           | 715 | delphine | 256 | 	private function getServiceMultiCriteres() {
 | 
        
           |  |  | 257 | 		$contenu = '';
 | 
        
           |  |  | 258 | 		if (isset($_GET['debut'])) $this->start = $_GET['debut'];
 | 
        
           |  |  | 259 | 		if (isset($_GET['limite'])) $this->limite = $_GET['limite'];
 | 
        
           |  |  | 260 |   | 
        
           |  |  | 261 | 		// Construction de la requête
 | 
        
           |  |  | 262 | 		$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
 | 
        
           |  |  | 263 | 				'FROM cel_inventory '.
 | 
        
           |  |  | 264 | 				'WHERE transmission = 1 '.
 | 
        
           |  |  | 265 | 			'	AND ';
 | 
        
           |  |  | 266 |   | 
        
           |  |  | 267 | 		if ($this->estUneRechercheGenerale()) {
 | 
        
           |  |  | 268 | 			$chaine_requete = $_GET['recherche'];
 | 
        
           |  |  | 269 | 			$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete);
 | 
        
           |  |  | 270 | 		} else {
 | 
        
           |  |  | 271 | 			$criteres = $this->traiterCriteresMultiples($_GET) ;
 | 
        
           |  |  | 272 | 			if (!empty($criteres)) {
 | 
        
           |  |  | 273 | 				$requete .= $this->creerSousRequeteRechercheParCriteres($criteres);
 | 
        
           |  |  | 274 | 			}
 | 
        
           |  |  | 275 | 		}
 | 
        
           |  |  | 276 | 		$requete = rtrim($requete, 'AND ');
 | 
        
           |  |  | 277 | 		$requete .= 'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby  :
 | 
        
           |  |  | 278 | 			'date_modification DESC, location ASC').' '.
 | 
        
           |  |  | 279 | 				"LIMIT $this->start,$this->limit ";
 | 
        
           |  |  | 280 |   | 
        
           |  |  | 281 | 		$elements = $this->executerRequete($requete);//echo $requete;
 | 
        
           |  |  | 282 |   | 
        
           |  |  | 283 | 		// Création du contenu
 | 
        
           |  |  | 284 | 		if ($elements != false && count($elements) > 0) {
 | 
        
           |  |  | 285 | 			$contenu = $this->executerService($elements);
 | 
        
           |  |  | 286 | 		} else {
 | 
        
           |  |  | 287 | 			$this->messages[] = "Aucune observation disponible.";
 | 
        
           |  |  | 288 | 		}
 | 
        
           |  |  | 289 |   | 
        
           |  |  | 290 |         return $contenu;
 | 
        
           |  |  | 291 | 	}
 | 
        
           |  |  | 292 |   | 
        
           |  |  | 293 | 	private function creerSousRequeteRechercheParCriteres($criteres) {
 | 
        
           |  |  | 294 | 		$requete = '';
 | 
        
           |  |  | 295 | 		foreach ($criteres as $pair) {
 | 
        
           |  |  | 296 | 			$nom_valeur = explode("=",$pair);
 | 
        
           |  |  | 297 | 			if (sizeof($nom_valeur) != 0) {
 | 
        
           |  |  | 298 | 				switch ($nom_valeur[0]) {
 | 
        
           |  |  | 299 | 					case "ci_limite" : $this->limite = $this->bdd->quote($nom_valeur[1]); break;
 | 
        
           |  |  | 300 | 					case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]);
 | 
        
           |  |  | 301 | 						foreach($mots_comment_liste as $mot_comment) {
 | 
        
           |  |  | 302 | 							$mot_comment = trim($mot_comment) ;
 | 
        
           |  |  | 303 | 							$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND ';
 | 
        
           |  |  | 304 | 						}
 | 
        
           |  |  | 305 | 						break;
 | 
        
           |  |  | 306 | 					case "date_observation" :
 | 
        
           |  |  | 307 | 						$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]);
 | 
        
           |  |  | 308 | 						if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) {
 | 
        
           |  |  | 309 | 							$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1];
 | 
        
           |  |  | 310 | 						}
 | 
        
           |  |  | 311 | 						$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break;
 | 
        
           |  |  | 312 | 					case "nom_ret" :
 | 
        
           |  |  | 313 | 						if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null';
 | 
        
           |  |  | 314 | 						$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'.
 | 
        
           |  |  | 315 | 							$nom_valeur[1].'%") AND '; break;
 | 
        
           |  |  | 316 | 					case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break;
 | 
        
           |  |  | 317 | 					default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break;
 | 
        
           |  |  | 318 | 				}
 | 
        
           |  |  | 319 | 			}
 | 
        
           |  |  | 320 | 		}
 | 
        
           |  |  | 321 | 		$requete = rtrim($requete,' AND ');
 | 
        
           |  |  | 322 | 		return $requete;
 | 
        
           |  |  | 323 | 	}
 | 
        
           |  |  | 324 |   | 
        
           |  |  | 325 | 	private function creerSousRequeteMotsCles($mot_cle) {
 | 
        
           |  |  | 326 | 		$requete = 'mots_cles like "inexistant" OR';
 | 
        
           | 741 | delphine | 327 | 		if (preg_match('/.*OU.*/', $mot_cle)) {
 | 
        
           | 715 | delphine | 328 | 			$requete = $this->creerSousRequeteMotsClesOu($mot_cle);
 | 
        
           |  |  | 329 | 		} else if (preg_match('/.*ET.*/', $mot_cle)) {
 | 
        
           |  |  | 330 | 			$requete = $this->creerSousRequeteMotsClesEt($mot_cle);
 | 
        
           |  |  | 331 | 		} else {
 | 
        
           |  |  | 332 | 			// Construction de la requête
 | 
        
           |  |  | 333 | 			$prerequete = 	'SELECT * '.
 | 
        
           |  |  | 334 | 				'FROM cel_mots_cles_obs '.
 | 
        
           |  |  | 335 | 				'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle));
 | 
        
           |  |  | 336 | 			$elements = $this->executerRequete($prerequete);
 | 
        
           |  |  | 337 | 			if ($elements != false && count($elements) > 0) {
 | 
        
           |  |  | 338 | 				$requete = '';
 | 
        
           |  |  | 339 | 				foreach ($elements as $occurence) {
 | 
        
           |  |  | 340 | 					$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
 | 
        
           |  |  | 341 | 						$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
 | 
        
           |  |  | 342 | 				}
 | 
        
           |  |  | 343 | 			}
 | 
        
           |  |  | 344 | 		}
 | 
        
           |  |  | 345 | 		$requete = rtrim($requete,' OR ').' AND ';
 | 
        
           |  |  | 346 | 		return $requete;
 | 
        
           |  |  | 347 | 	}
 | 
        
           |  |  | 348 |   | 
        
           |  |  | 349 | 	private function creerSousRequeteMotsClesOu($mot_cle) {
 | 
        
           |  |  | 350 | 		$requete = 'mots_cles like "inexistant" OR';
 | 
        
           | 741 | delphine | 351 | 		$tab_mots_cles = explode('OU', $mot_cle);
 | 
        
           | 715 | delphine | 352 | 		$where = '';
 | 
        
           |  |  | 353 | 		foreach ($tab_mots_cles as $mot) {
 | 
        
           | 741 | delphine | 354 | 			$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR ';
 | 
        
           | 715 | delphine | 355 | 		}
 | 
        
           |  |  | 356 | 		$where = rtrim($where,' OR ');
 | 
        
           |  |  | 357 |   | 
        
           |  |  | 358 | 		// Construction de la requête
 | 
        
           |  |  | 359 | 		$prerequete = 	"SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where ";
 | 
        
           |  |  | 360 | 		$elements = $this->executerRequete($prerequete);//print_r($elements);
 | 
        
           |  |  | 361 | 		if ($elements != false && count($elements) > 0) {
 | 
        
           |  |  | 362 | 			$requete = '';
 | 
        
           |  |  | 363 | 			foreach ($elements as $occurence) {
 | 
        
           |  |  | 364 | 				$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '.
 | 
        
           |  |  | 365 | 					$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
 | 
        
           |  |  | 366 | 			}
 | 
        
           |  |  | 367 | 		}
 | 
        
           |  |  | 368 | 		return $requete;
 | 
        
           |  |  | 369 | 	}
 | 
        
           |  |  | 370 |   | 
        
           |  |  | 371 | 	private function creerSousRequeteMotsClesEt($mot_cle) {
 | 
        
           |  |  | 372 | 		$requete = 'mots_cles like "inexistant" OR';
 | 
        
           |  |  | 373 | 		$where = '';
 | 
        
           |  |  | 374 | 		$champs = 'a.cmc_id_proprietaire , ';
 | 
        
           |  |  | 375 | 		$table = '';
 | 
        
           |  |  | 376 | 		$i = "a"; $j = "a";
 | 
        
           |  |  | 377 |   | 
        
           |  |  | 378 | 		$tab_mots_cles = explode("ET", $mot_cle);
 | 
        
           |  |  | 379 | 		foreach ($tab_mots_cles as $mot) {
 | 
        
           |  |  | 380 | 			$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , ";
 | 
        
           |  |  | 381 | 			$table .= "cel_mots_cles_obs $i , ";
 | 
        
           | 741 | delphine | 382 | 			$where .= "$i.cmc_id_mot_cle_general = ".$this->bdd->quote($this->encoderMotCle(trim($mot))).' AND ';
 | 
        
           | 715 | delphine | 383 | 			if ($i !== "a") {
 | 
        
           |  |  | 384 | 				$where .= " $i.cmc_id_proprietaire = ".$j.".cmc_id_proprietaire AND ";
 | 
        
           |  |  | 385 | 				$j++;
 | 
        
           |  |  | 386 | 			}
 | 
        
           |  |  | 387 | 			$i++;
 | 
        
           |  |  | 388 | 		}
 | 
        
           |  |  | 389 | 		$where = rtrim($where,' AND '); $champs = rtrim($champs,' , '); $table = rtrim($table,' , ');
 | 
        
           |  |  | 390 |   | 
        
           |  |  | 391 | 		// Construction de la requête
 | 
        
           |  |  | 392 | 		$prerequete = 	"SELECT $champs FROM $table WHERE $where ";
 | 
        
           |  |  | 393 | 		$elements = $this->executerRequete($prerequete);//print_r($elements);
 | 
        
           |  |  | 394 | 		if ($elements != false && count($elements) > 0) {
 | 
        
           |  |  | 395 | 			$requete = '';
 | 
        
           |  |  | 396 | 			foreach ($elements as $occurence) {
 | 
        
           |  |  | 397 | 				$requete = ' (';
 | 
        
           |  |  | 398 | 				for ($j = 'a'; $j < $i; $j++) {
 | 
        
           |  |  | 399 | 					$requete .= 'mots_cles like "%'.$occurence[$j].'%" AND ';
 | 
        
           |  |  | 400 | 				}
 | 
        
           |  |  | 401 | 				$requete .= ' identifiant = '.$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR ';
 | 
        
           |  |  | 402 | 			}
 | 
        
           |  |  | 403 | 		}
 | 
        
           |  |  | 404 | 		return $requete;
 | 
        
           |  |  | 405 | 	}
 | 
        
           |  |  | 406 |   | 
        
           |  |  | 407 | 	private function traiterCriteresMultiples($tableau_criteres) {
 | 
        
           |  |  | 408 | 		$tableau_criteres_pour_bdd = array();
 | 
        
           |  |  | 409 |   | 
        
           |  |  | 410 | 		foreach($tableau_criteres as $nom_critere => $valeur_critere) {
 | 
        
           |  |  | 411 | 			if (isset($this->criteres[$nom_critere])) {
 | 
        
           |  |  | 412 | 				$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere;
 | 
        
           |  |  | 413 | 			}
 | 
        
           |  |  | 414 | 		}
 | 
        
           |  |  | 415 | 		return $tableau_criteres_pour_bdd;
 | 
        
           |  |  | 416 | 	}
 | 
        
           |  |  | 417 |   | 
        
           |  |  | 418 | 	private function creerSousRequeteRechercheGenerale($chaine_requete) {
 | 
        
           |  |  | 419 | 		$requete = '';
 | 
        
           |  |  | 420 | 		if (trim($chaine_requete) != '') {
 | 
        
           |  |  | 421 | 			$chaine_requete = strtolower($chaine_requete);
 | 
        
           |  |  | 422 | 			$chaine_requete = str_replace(' ', '_', $chaine_requete);
 | 
        
           |  |  | 423 | 			$requete = ' ('.
 | 
        
           |  |  | 424 | 				'nom_ret LIKE "'.$chaine_requete.'%"'.
 | 
        
           |  |  | 425 | 				' OR '.
 | 
        
           |  |  | 426 | 				'nom_sel LIKE "'.$chaine_requete.'%"'.
 | 
        
           |  |  | 427 | 				' OR '.
 | 
        
           |  |  | 428 | 				'location LIKE "'.$chaine_requete.'%" '.
 | 
        
           |  |  | 429 | 				' OR '.
 | 
        
           |  |  | 430 | 				'id_location LIKE "'.$chaine_requete.'%" '.
 | 
        
           |  |  | 431 | 				' OR '.
 | 
        
           |  |  | 432 | 				'identifiant LIKE "'.$chaine_requete.'%" '.
 | 
        
           |  |  | 433 | 				') ';
 | 
        
           |  |  | 434 | 		}
 | 
        
           |  |  | 435 | 		return $requete;
 | 
        
           |  |  | 436 | 	}
 | 
        
           |  |  | 437 |   | 
        
           |  |  | 438 | 	private function estUneRechercheGenerale() {
 | 
        
           |  |  | 439 | 		return isset($_GET['recherche']);
 | 
        
           |  |  | 440 | 	}
 | 
        
           |  |  | 441 |   | 
        
           | 416 | aurelien | 442 | 	private function executerService($elements) {
 | 
        
           |  |  | 443 | 		$contenu = '';
 | 
        
           |  |  | 444 | 		if (is_array($elements)) {
 | 
        
           |  |  | 445 | 			// Prétraitement des données
 | 
        
           |  |  | 446 | 			$donnees = $this->construireDonneesCommunesAuFlux($elements);
 | 
        
           |  |  | 447 |   | 
        
           |  |  | 448 | 			foreach ($elements as $element) {
 | 
        
           |  |  | 449 | 				$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element);
 | 
        
           |  |  | 450 | 			}
 | 
        
           |  |  | 451 |   | 
        
           |  |  | 452 | 			// Création du contenu à partir d'un template PHP
 | 
        
           |  |  | 453 | 			if (isset($this->squelette)) {
 | 
        
           |  |  | 454 | 				$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees);
 | 
        
           |  |  | 455 | 			}
 | 
        
           |  |  | 456 | 		}
 | 
        
           |  |  | 457 | 		return $contenu;
 | 
        
           |  |  | 458 | 	}
 | 
        
           |  |  | 459 |   | 
        
           |  |  | 460 | 	private function construireDonneesCommunesAuFlux($observations) {
 | 
        
           |  |  | 461 | 		$donnees = $this->getFlux($this->service);
 | 
        
           |  |  | 462 | 		$donnees['guid'] = $this->getUrlServiceBase();
 | 
        
           | 741 | delphine | 463 | 		$donnees['titre'] = 'Flux des observations du CEL';
 | 
        
           | 416 | aurelien | 464 | 		$donnees['lien_service'] = $this->creerUrlService();
 | 
        
           | 715 | delphine | 465 | 		$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu'];
 | 
        
           | 416 | aurelien | 466 | 		$donnees['editeur'] = $this->config['settings']['editeur'];
 | 
        
           |  |  | 467 | 		$derniere_info_en_date = reset($observations);
 | 
        
           |  |  | 468 | 		$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']);
 | 
        
           |  |  | 469 | 		$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
 | 
        
           |  |  | 470 | 		$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
 | 
        
           |  |  | 471 | 		$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
 | 
        
           |  |  | 472 | 		$donnees['annee_courante'] = date('Y');
 | 
        
           |  |  | 473 | 		$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation';
 | 
        
           | 715 | delphine | 474 | 		$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ?  $match[1] : '0';
 | 
        
           | 416 | aurelien | 475 | 		return $donnees;
 | 
        
           |  |  | 476 | 	}
 | 
        
           |  |  | 477 |   | 
        
           |  |  | 478 | 	private function construireDonneesCommunesAuxItems($observation) {
 | 
        
           |  |  | 479 | 		$item = array();
 | 
        
           | 528 | jpm | 480 | 		$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']);
 | 
        
           | 416 | aurelien | 481 | 		$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
 | 
        
           |  |  | 482 | 		$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
 | 
        
           |  |  | 483 | 		$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
 | 
        
           |  |  | 484 | 		$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
 | 
        
           |  |  | 485 | 		$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation']));
 | 
        
           |  |  | 486 | 		$item['titre'] = $this->creerTitre($observation);
 | 
        
           |  |  | 487 | 		$item['guid'] = $this->creerGuidItem($observation);
 | 
        
           |  |  | 488 | 		$item['lien'] = $this->creerLienItem($observation);
 | 
        
           |  |  | 489 | 		$item['categorie'] = $this->creerCategorie($item);
 | 
        
           | 528 | jpm | 490 | 		$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($observation), $item);
 | 
        
           |  |  | 491 | 		$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item));
 | 
        
           | 522 | jpm | 492 | 		$item['modifier_par'] = $this->creerAuteur($observation['identifiant'], $this->etreFluxAdmin());
 | 
        
           | 416 | aurelien | 493 | 		return $item;
 | 
        
           |  |  | 494 | 	}
 | 
        
           |  |  | 495 |   | 
        
           |  |  | 496 | 	private function creerTitre($obs) {
 | 
        
           |  |  | 497 | 		$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']';
 | 
        
           |  |  | 498 | 		$lieu = $obs['location'].' ('.$obs['id_location'].')';
 | 
        
           | 522 | jpm | 499 | 		$utilisateur = $this->creerAuteur($obs['identifiant'], $this->etreFluxAdmin());
 | 
        
           | 416 | aurelien | 500 | 		$titre = "$nom_plante à $lieu par $utilisateur";
 | 
        
           |  |  | 501 | 		$titre = $this->nettoyerTexte($titre);
 | 
        
           |  |  | 502 | 		return $titre;
 | 
        
           |  |  | 503 | 	}
 | 
        
           |  |  | 504 |   | 
        
           |  |  | 505 | 	private function creerGuidItem($element) {
 | 
        
           |  |  | 506 | 		$guid = sprintf($this->config['settings']['guidObsTpl'], 'obs'.$element['id']);
 | 
        
           |  |  | 507 | 		return $guid;
 | 
        
           |  |  | 508 | 	}
 | 
        
           |  |  | 509 |   | 
        
           |  |  | 510 | 	private function creerLienItem($element) {
 | 
        
           | 506 | jpm | 511 | 		$lien = null;
 | 
        
           |  |  | 512 | 		if ($element['num_nom_sel'] != 0) {
 | 
        
           | 585 | jpm | 513 | 			$lien = sprintf($this->config['settings']['efloreUrlTpl'], urlencode($element['num_nom_sel']), 'cel');
 | 
        
           | 506 | jpm | 514 | 		}
 | 
        
           | 416 | aurelien | 515 | 		return $lien;
 | 
        
           |  |  | 516 | 	}
 | 
        
           |  |  | 517 |   | 
        
           |  |  | 518 | 	private function creerDescription($obs, $item) {
 | 
        
           | 568 | jpm | 519 | 		$id_obs = $obs['id'];
 | 
        
           | 528 | jpm | 520 | 		$famille = $obs['famille'];
 | 
        
           |  |  | 521 | 		$nom_saisi = $obs['nom_sel'];
 | 
        
           |  |  | 522 | 		$nom_retenu = $obs['nom_ret'];
 | 
        
           |  |  | 523 | 		$auteur = $this->creerAuteur($obs['identifiant'], $this->etreFluxAdmin());
 | 
        
           |  |  | 524 | 		$mots_cles_obs = $this->decoderMotsClesObs($obs['identifiant'], $obs['mots_cles']);
 | 
        
           | 416 | aurelien | 525 | 		$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']);
 | 
        
           | 528 | jpm | 526 | 		$lieu = $obs['location'].' ('.$obs['id_location'].') > '.$obs['lieudit'].' > '.$obs['station'];
 | 
        
           |  |  | 527 | 		$milieu = $obs['milieu'];
 | 
        
           |  |  | 528 | 		$coordonnees = ($this->etreNull($obs['coord_x']) && $this->etreNull($obs['coord_y'])) ? '' : $obs['coord_x'].'/'.$obs['coord_y'];
 | 
        
           | 529 | jpm | 529 | 		$commentaire = $obs['commentaire'];
 | 
        
           | 528 | jpm | 530 | 		$date_observation = $this->formaterDate($obs['date_observation'], '%A %d %B %Y');
 | 
        
           |  |  | 531 | 		$date_transmission = $this->formaterDate($obs['date_transmission']);
 | 
        
           |  |  | 532 | 		$date_modification = $this->formaterDate($obs['date_modification']);
 | 
        
           |  |  | 533 | 		$date_creation = $this->formaterDate($obs['date_creation']);
 | 
        
           |  |  | 534 | 		$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non';
 | 
        
           |  |  | 535 |   | 
        
           |  |  | 536 | 		$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'.
 | 
        
           | 416 | aurelien | 537 | 			'<ul>'.
 | 
        
           | 528 | jpm | 538 | 			'<li>'.'Famille : '.$famille.'</li>'.
 | 
        
           |  |  | 539 | 			'<li>'.'Nom saisi : '.$nom_saisi.'</li>'.
 | 
        
           |  |  | 540 | 			'<li>'.'Nom retenu : '.$nom_retenu.'</li>'.
 | 
        
           |  |  | 541 | 			'<li>'.'Observée le : '.$date_observation.'</li>'.
 | 
        
           |  |  | 542 | 			'<li>'.'Lieu : '.$lieu.'</li>'.
 | 
        
           |  |  | 543 | 			'<li>'.'Milieu : '.$milieu.'</li>'.
 | 
        
           |  |  | 544 | 			(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : '').
 | 
        
           |  |  | 545 | 			'<li>'.'Commentaire : '.$commentaire.'</li>'.
 | 
        
           |  |  | 546 | 			'<li>'.'Mots-clés : '.implode(', ', $mots_cles_obs).'</li>'.
 | 
        
           |  |  | 547 | 			(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : '').
 | 
        
           |  |  | 548 | 			'<li>Modifiée le : '.$date_modification.'</li>'.
 | 
        
           |  |  | 549 | 			'<li>Créée le : '.$date_creation.'</li>'.
 | 
        
           |  |  | 550 | 			(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : '').
 | 
        
           | 416 | aurelien | 551 | 			'</ul>';
 | 
        
           |  |  | 552 | 		$description = $this->nettoyerTexte($description);
 | 
        
           |  |  | 553 | 		return $description;
 | 
        
           |  |  | 554 | 	}
 | 
        
           |  |  | 555 |   | 
        
           |  |  | 556 | 	private function creerCategorie($element) {
 | 
        
           |  |  | 557 | 		$categorie = '';
 | 
        
           |  |  | 558 | 		$categorie = 'Observation';
 | 
        
           |  |  | 559 | 		$categorie = $this->nettoyerTexte($categorie);
 | 
        
           |  |  | 560 | 		return $categorie;
 | 
        
           |  |  | 561 | 	}
 | 
        
           |  |  | 562 |   | 
        
           |  |  | 563 | 	private function etreFluxAdmin() {
 | 
        
           | 715 | delphine | 564 | 		return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false;
 | 
        
           | 416 | aurelien | 565 | 	}
 | 
        
           |  |  | 566 |   | 
        
           |  |  | 567 | 	private function creerUrlService() {
 | 
        
           |  |  | 568 | 		$url_service = $this->getUrlServiceBase();
 | 
        
           | 528 | jpm | 569 | 		if (count($_GET) > 0) {
 | 
        
           | 637 | jpm | 570 | 			$parametres_get = array();
 | 
        
           |  |  | 571 | 			foreach ($_GET as $cle => $valeur) {
 | 
        
           |  |  | 572 | 				$parametres_get[] = $cle.'='.$valeur;
 | 
        
           |  |  | 573 | 			}
 | 
        
           |  |  | 574 | 			$url_service .= '?'.implode('&', $parametres_get);
 | 
        
           | 416 | aurelien | 575 | 		}
 | 
        
           |  |  | 576 | 		return $url_service;
 | 
        
           |  |  | 577 | 	}
 | 
        
           |  |  | 578 | }
 |