10,11 → 10,11 |
* /CelSyndicationObservation/pour-admin/(rss1|rss2|atom)?start=0&limit=150 |
* /CelSyndicationObservation/par-mots-cles/(rss1|rss2|atom)/mot-cle?start=0&limit=150 |
* /CelSyndicationObservation/par-commune/(rss1|rss2|atom)/nom-commune?start=0&limit=150 |
* |
* |
* Les paramêtres : |
* - "start" indique le numéro du premier item à afficher |
* - "limit" nombre d'items à afficher |
* |
* |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
22,7 → 22,7 |
* @copyright 2010 |
*/ |
class CelSyndicationObservation extends Cel { |
|
|
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
31,14 → 31,14 |
private $auteurs = array(); |
private $flux = array(); |
private $criteres = array( |
'utilisateur' => 'identifiant', |
'commune' => 'location', |
'utilisateur' => 'identifiant', |
'commune' => 'location', |
'dept' => 'id_location', |
'taxon' => 'nom_ret', |
'commentaire' => 'commentaire', |
'date' => 'date_observation', |
'projet' => 'mots-cles'); |
|
|
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
47,7 → 47,7 |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
|
|
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
55,10 → 55,10 |
extract($p); |
$this->parametres = $params; |
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR; |
|
|
// Récupération de la liste des flux |
$this->chargerListeDesFlux(); |
|
|
// Chargement du bon type de service demandé |
if (isset($service)) { |
$this->service = $this->traiterNomService($service); |
73,12 → 73,12 |
$this->format = ''; |
$this->messages[] = "Le service CEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom."; |
} |
|
|
if (!isset($this->flux[$this->service]) || isset($this->format)) { |
// Suppression des paramêtres inutile pour le reste des méthodes |
array_shift($this->parametres); |
array_shift($this->parametres); |
|
|
// Récupération du contenu à renvoyer |
$contenu = $this->$methode(); |
} |
89,7 → 89,7 |
$this->messages[] = "Le service CEL Syndication Observation nécessite d'indiquer en premier paramètre le type d'information demandé."; |
} |
} |
|
|
// Envoie sur la sortie standard |
$encodage = 'utf-8'; |
$mime = $this->getTypeMime(); |
96,22 → 96,22 |
$formatage_json = $this->getFormatageJson(); |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
|
|
private function getUrlBase() { |
$url_base = sprintf($this->config['settings']['baseURLAbsolu'], get_class($this).'/'); |
return $url_base; |
} |
|
|
private function getUrlServiceBase() { |
$url_service = $this->getUrlBase().implode('/', $this->parametres_origines); |
return $url_service; |
} |
|
|
private function traiterNomService($nom) { |
$nom = strtolower($nom); |
return $nom; |
} |
|
|
private function getNomMethodeService() { |
$methode = ''; |
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service)))); |
118,10 → 118,10 |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
|
|
private function getTypeMime() { |
$mime = ''; |
$test = isset($this->format) ? $this->format : $this->service; |
$test = isset($this->format) ? $this->format : $this->service; |
switch ($test) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
138,7 → 138,7 |
} |
return $mime; |
} |
|
|
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
150,7 → 150,7 |
} |
return $json; |
} |
|
|
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
165,9 → 165,9 |
} |
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux); |
} |
|
|
private function chargerListeDesFlux() { |
$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL', |
$this->setFlux('par-defaut', 'Flux de syndication des observations publiques du CEL', |
'Ce flux fournit des informations sur les observations du CEL.'); |
$this->setFlux('par-mots-cles', 'Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?tag='mot-cle'."); |
179,11 → 179,11 |
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, projet ". |
"et/ou date."); |
} |
|
|
private function getServiceListeDesFlux() { |
return $this->flux; |
} |
|
|
private function getServiceOpml() { |
$donnees = array(); |
$id = 1; |
197,12 → 197,12 |
$info['url_html'] = $this->config['settings']['aideCelUrl'].'FluxSyndication'; |
$donnees['liste_flux'][] = $info; |
} |
|
|
$this->squelette = $this->squelette_dossier.'opml.tpl.xml'; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
|
|
private function getServiceParDefaut() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
210,14 → 210,14 |
(($this->etreFluxAdmin()) ? '' : 'WHERE transmission = 1 '). |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'date_modification DESC').' '. |
"LIMIT $this->start,$this->limit "; |
|
|
$elements = $this->executerRequete($requete); |
|
|
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
|
|
private function getServiceParMotsCles() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
229,13 → 229,13 |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
|
|
private function getServiceParCommune() { |
$infos=array(); |
$infos[0]['num_nom_sel'] = ''; |
247,24 → 247,24 |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
|
|
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limite = $_GET['limite']; |
|
|
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_inventory '. |
'WHERE transmission = 1 '. |
' AND '; |
|
|
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
272,13 → 272,13 |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
if (!empty($criteres)) { |
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres); |
} |
} |
} |
$requete = rtrim($requete, 'AND '); |
$requete .= 'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
$requete .= 'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
'date_modification DESC, location ASC').' '. |
"LIMIT $this->start,$this->limit "; |
|
|
$elements = $this->executerRequete($requete);//echo $requete; |
|
// Création du contenu |
287,10 → 287,10 |
} else { |
$this->messages[] = "Aucune observation disponible."; |
} |
|
|
return $contenu; |
} |
|
|
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
304,17 → 304,17 |
$requete .= $nom_valeur[0].' LIKE '.$this->bdd->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
case "date_observation" : |
case "date_observation" : |
$nom_valeur[1] = str_replace('/', '-', $nom_valeur[1]); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $nom_valeur[1], $matches)) { |
$nom_valeur[1] = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$requete .= $nom_valeur[0].'='.$this->bdd->quote($nom_valeur[1]).' AND '; break; |
case "nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
case "nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR nom_sel LIKE "%'. |
$nom_valeur[1].'%") AND '; break; |
case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break; |
case "mots-cles" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]); break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
322,7 → 322,7 |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
|
|
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
329,17 → 329,17 |
$requete = $this->creerSousRequeteMotsClesOu($mot_cle); |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$requete = $this->creerSousRequeteMotsClesEt($mot_cle); |
} else { |
} else { |
// Construction de la requête |
$prerequete = 'SELECT * '. |
'FROM cel_mots_cles_obs '. |
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle)); |
'WHERE cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle($mot_cle)); |
$elements = $this->executerRequete($prerequete); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
foreach ($elements as $occurence) { |
$requete .= '(mots_cles LIKE "%'.$occurence['cmc_id_mot_cle_utilisateur'].'%" AND identifiant = '. |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
$this->bdd->quote($occurence['cmc_id_proprietaire']).' ) OR '; |
} |
} |
} |
346,9 → 346,9 |
$requete = rtrim($requete,' OR ').' AND '; |
return $requete; |
} |
|
private function creerSousRequeteMotsClesOu($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
|
private function creerSousRequeteMotsClesOu($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$tab_mots_cles = explode('OU', $mot_cle); |
$where = ''; |
foreach ($tab_mots_cles as $mot) { |
355,9 → 355,9 |
$where .= 'cmc_id_mot_cle_general = '.$this->bdd->quote($this->encoderMotCle(trim($mot))).' OR '; |
} |
$where = rtrim($where,' OR '); |
|
|
// Construction de la requête |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where "; |
$prerequete = "SELECT cmc_id_mot_cle_utilisateur, cmc_id_proprietaire FROM cel_mots_cles_obs WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
368,7 → 368,7 |
} |
return $requete; |
} |
|
|
private function creerSousRequeteMotsClesEt($mot_cle) { |
$requete = 'mots_cles like "inexistant" OR'; |
$where = ''; |
375,8 → 375,8 |
$champs = 'a.cmc_id_proprietaire , '; |
$table = ''; |
$i = "a"; $j = "a"; |
|
$tab_mots_cles = explode("ET", $mot_cle); |
|
$tab_mots_cles = explode("ET", $mot_cle); |
foreach ($tab_mots_cles as $mot) { |
$champs .= "$i.cmc_id_mot_cle_utilisateur as $i , "; |
$table .= "cel_mots_cles_obs $i , "; |
388,9 → 388,9 |
$i++; |
} |
$where = rtrim($where,' AND '); $champs = rtrim($champs,' , '); $table = rtrim($table,' , '); |
|
|
// Construction de la requête |
$prerequete = "SELECT $champs FROM $table WHERE $where "; |
$prerequete = "SELECT $champs FROM $table WHERE $where "; |
$elements = $this->executerRequete($prerequete);//print_r($elements); |
if ($elements != false && count($elements) > 0) { |
$requete = ''; |
403,11 → 403,11 |
} |
} |
return $requete; |
} |
|
} |
|
private function traiterCriteresMultiples($tableau_criteres) { |
$tableau_criteres_pour_bdd = array(); |
|
|
foreach($tableau_criteres as $nom_critere => $valeur_critere) { |
if (isset($this->criteres[$nom_critere])) { |
$tableau_criteres_pour_bdd[] = $this->criteres[$nom_critere].'='.$valeur_critere; |
415,10 → 415,10 |
} |
return $tableau_criteres_pour_bdd; |
} |
|
|
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
435,11 → 435,11 |
} |
return $requete; |
} |
|
|
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
|
|
private function executerService($elements) { |
$contenu = ''; |
if (is_array($elements)) { |
452,15 → 452,15 |
foreach ($elements as $element) { |
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element); |
} |
|
|
// Création du contenu à partir d'un template PHP |
if (isset($this->squelette)) { |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
} |
} |
} |
return $contenu; |
} |
|
|
private function construireDonneesCommunesAuFlux($observations) { |
$donnees = $this->getFlux($this->service); |
$donnees['guid'] = $this->getUrlServiceBase(); |
476,9 → 476,9 |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
return $donnees; |
} |
|
|
private function construireDonneesCommunesAuxItems($observation) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']); |
493,26 → 493,26 |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription($this->protegerCaracteresHtmlDansChamps($observation), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item)); |
$item['modifier_par'] = $this->auteurs[$observation['identifiant']]; |
$item['modifier_par'] = $this->getIntituleAuteur($observation['identifiant']); |
return $item; |
} |
|
|
private function creerTitre($obs) { |
$date = $obs['date_observation']; |
$date = date("d/m/Y", strtotime($date)); |
$nom_plante = $obs['nom_sel'].' [nn'.$obs['num_nom_sel'].']'; |
$lieu = $obs['location'].' ('.$obs['id_location'].')'; |
$utilisateur = $this->auteurs[$obs['identifiant']]; |
$utilisateur = $this->getIntituleAuteur($obs['identifiant']); |
$titre = "$nom_plante à $lieu par $utilisateur le $date"; |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
|
|
private function creerGuidItem($element) { |
$guid = sprintf($this->config['settings']['guidObsTpl'], 'obs'.$element['id']); |
return $guid; |
} |
|
|
private function creerLienItem($element) { |
$lien = null; |
if ($element['num_nom_sel'] != 0) { |
520,13 → 520,13 |
} |
return $lien; |
} |
|
|
private function creerDescription($obs, $item) { |
$id_obs = $obs['id']; |
$famille = $obs['famille']; |
$nom_saisi = $obs['nom_sel']; |
$nom_retenu = $obs['nom_ret']; |
$auteur = $this->auteurs[$obs['identifiant']]; |
$auteur = $this->getIntituleAuteur($obs['identifiant']); |
$mots_cles_obs = $this->decoderMotsClesObs($obs['identifiant'], $obs['mots_cles']); |
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id']); |
$lieu = $obs['location'].' ('.$obs['id_location'].') > '.$obs['lieudit'].' > '.$obs['station']; |
538,7 → 538,7 |
$date_modification = $this->formaterDate($obs['date_modification']); |
$date_creation = $this->formaterDate($obs['date_creation']); |
$transmission = $obs['transmission'] == 1 ? "oui ($date_transmission)" : 'non'; |
|
|
$description = '<h2>'."Observation #$id_obs de $nom_saisi".'</h2>'. |
'<ul>'. |
'<li>'.'Famille : '.$famille.'</li>'. |
558,7 → 558,7 |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
|
|
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Observation'; |
565,11 → 565,11 |
$categorie = $this->nettoyerTexte($categorie); |
return $categorie; |
} |
|
|
private function etreFluxAdmin() { |
return (isset($_GET['admin']) && $_GET['admin'] == '1') ? true : false; |
} |
|
|
private function creerUrlService() { |
$url_service = $this->getUrlServiceBase(); |
if (count($_GET) > 0) { |
581,4 → 581,10 |
} |
return $url_service; |
} |
} |
|
private function getIntituleAuteur($courriel) { |
$courriel = strtolower($courriel); |
$intitule = $this->auteurs[$courriel]; |
return $intitule; |
} |
} |