/trunk/jrest/services/CelWidgetMapPoint.php |
---|
32,1281 → 32,1275 |
*/ |
// TODO : supprimer le TRIM quand les obs seront reliées correctements aux localisations (sur le code INSEE par exemple) |
class CelWidgetMapPoint extends Cel { |
const MARQUEUR_GROUPE = 'GROUPE'; |
const MARQUEUR_COMMUNE = 'COMMUNE'; |
const MARQUEUR_STATION = 'STATION'; |
private $standard = "AND donnees_standard = 1"; |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($ressources) { |
$retour = null; |
if($this->parametres == null) { |
$this->parametres = array(); |
} |
extract($this->parametres); |
//Chronometre::chrono("Avant groupage"); |
if (isset($this->parametres['standard']) && $this->parametres['standard'] == 0) { |
$this->standard = ""; |
} |
$action = array_shift($ressources); |
if (isset($action)) { |
$methode = $this->traiterNomMethodeGet($action); |
if (method_exists($this, $methode)) { |
$retour = $this->$methode($ressources); |
} else { |
$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Vous devez indiquer le type de ressource."; |
} |
//Chronometre::chrono("Apres traitement"); |
//echo Chronometre::afficherChrono(); |
if (is_null($retour)) { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyer($info); |
} else if (isset($retour['type']) && $retour['type'] == 'jsonVar') { |
$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']); |
} else if (isset($retour['type']) && $retour['type'] == 'jsonP') { |
$this->envoyerJsonp($retour['donnees']); |
} else if (isset($retour['type']) && $retour['type'] == 'png') { |
header("Content-type: image/png"); |
imagepng($retour['img']); |
imagedestroy($retour['img']); |
} else { |
$this->envoyerJson($retour); |
} |
} |
/** |
* Les icones des groupes de stations |
*/ |
public function getIconeGroupe($params) { |
extract($this->parametres); |
$chemin_marqueur = sprintf($this->config['settings']['cheminCelMarkerObsTpl'], $type); |
$img = imagecreatefrompng($chemin_marqueur); |
$noir = imagecolorallocate($img, 0, 0, 0); |
$texte = (String) $nbre; |
$x = (imagesx($img) - 6.0 * strlen($texte)) / 2; |
$y = (imagesy($img) - 16) / 2; |
imagestring($img, 3, $x, $y, $texte, $noir); |
imagealphablending($img, false); |
imagesavealpha($img, true); |
return array('type' => 'png', 'img' => $img); |
} |
public function getTout($params) { |
$emplacements = null; |
$concatenation_id = "CONCAT(IFNULL(latitude,''),IFNULL(longitude,''), IFNULL(wgs84_latitude,''),IFNULL(wgs84_longitude,'')) "; |
$requete = 'SELECT ce_zone_geo, zone_geo, station, '. |
"mots_cles_texte, ". |
"latitude, ". |
"wgs84_latitude, ". |
"longitude, ". |
"wgs84_longitude, ". |
$concatenation_id." as id_coord ". |
'FROM cel_export_total AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
' ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) '. |
"WHERE transmission = '1' ". |
$this->standard. |
" AND (". |
$this->construireWhereRectangleStationOR()." OR ". |
$this->construireWhereRectangleCommuneOR().") ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(). |
' GROUP BY id_coord'; |
$resultats_emplacements = Cel::db()->requeter($requete); |
$emplacements = $this->traiterEmplacements($resultats_emplacements, $this->compterObservations($params)); |
return $emplacements; |
} |
private function afficherRequeteFormatee($requete) { |
$requete = str_replace(')',')<br />',$requete); |
$requete = str_replace('(',' <br /> (',$requete); |
echo '<pre>'.$requete.'</pre>'; |
exit; |
} |
private $nb_obs = 0; |
private function compterObservations($params) { |
$requete = 'SELECT COUNT(*) as nb '. |
'FROM cel_export_total AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
' ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) '. |
"WHERE transmission = '1' ". |
$this->standard. |
" AND (". |
$this->construireWhereRectangleStationOR()." OR ". |
$this->construireWhereRectangleCommuneOR().") ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(); |
$resultats_nb_obs = Cel::db()->requeter($requete); |
return $resultats_nb_obs[0]['nb']; |
} |
private function traiterEmplacements(&$emplacements, $nb_total_observation) { |
$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11; |
$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20; |
$marqueurs = array( |
'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0), |
'points' => null |
); |
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($emplacements, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom); |
// laisser la classe cartoGroupage compter les élements simplifie le comptage |
// et permet de ne pas reparser le tableau pour compter les différents éléments |
$nb_elements = CartoGroupage::getNbElements(); |
// les bornes servent à centrer la carte dans le cas ou l'on demande des paramètres précis |
$marqueurs['stats']['coordmax'] = CartoGroupage::getBornes(); |
$marqueurs['stats']['stations'] = $nb_elements['stations']; |
$marqueurs['stats']['communes'] = $nb_elements['communes']; |
$marqueurs['stats']['observations'] = (int)$nb_total_observation; |
} else { |
$marqueurs['points'] = $emplacements; |
} |
return $marqueurs; |
} |
private function traiterStations($communes, $stations) { |
$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11; |
$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20; |
$marqueurs = array( |
'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0), |
'points' => null |
); |
$marqueurs['stats']['observations'] = $this->traiterNbreObs($communes) + $this->traiterNbreObs($stations); |
$points = array(); |
if ($communes !== false) { |
foreach ($communes as $commune) { |
if (is_numeric($commune['lat']) && is_numeric($commune['lng'])) { |
extract($commune); |
$id = self::MARQUEUR_COMMUNE.':'.$lat.'|'.$lng; |
$lata = round($lat, 5); |
$lnga = round($lng, 5); |
if (!isset($points[$id])) { |
$points[$id]['id'] = $id; |
$points[$id]['nom'] = $nom; |
$points[$id]['lat'] = $lata; |
$points[$id]['lng'] = $lnga; |
$points[$id]['nbre'] = 1; |
$marqueurs['stats']['communes']++; |
} else { |
$points[$id]['nbre']++; |
} |
} |
} |
} |
if ($stations !== false) { |
foreach ($stations as $station) { |
if (is_numeric($station['lat']) && is_numeric($station['lng'])) { |
extract($station); |
$id = self::MARQUEUR_STATION.':'.$lat.'|'.$lng; |
$lata = round($lat, 5); |
$lnga = round($lng, 5); |
$nom = $this->etreNull($nom) ? $lata.','.$lnga : $nom; |
if (!isset($points[$id])) { |
$points[$id]['id'] = $id; |
$points[$id]['nom'] = $nom; |
$points[$id]['lat'] = $lata; |
$points[$id]['lng'] = $lnga; |
$points[$id]['nbre'] = 1; |
$marqueurs['stats']['stations']++; |
} else { |
$points[$id]['nbre']++; |
} |
} |
} |
} |
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom); |
} else { |
$marqueurs['points'] = $points; |
} |
//$marqueurs['stats']['latDiff'] = abs($marqueurs['stats']['latMin'] - $marqueurs['stats']['latMax']); |
//$marqueurs['stats']['lngDiff'] = abs($marqueurs['stats']['lngMin'] - $marqueurs['stats']['lngMax']); |
return $marqueurs; |
} |
private function definirLatLngMaxMin(&$marqueurs, $lat, $lng) { |
if ($lat != null && $lng != null) { |
$marqueurs['stats']['latMin'] = $marqueurs['stats']['latMin'] > $lat ? $lat : $marqueurs['stats']['latMin']; |
$marqueurs['stats']['lngMin'] = $marqueurs['stats']['lngMin'] > $lng ? $lng : $marqueurs['stats']['lngMin']; |
$marqueurs['stats']['latMax'] = $marqueurs['stats']['latMax'] < $lat ? $lat : $marqueurs['stats']['latMax']; |
$marqueurs['stats']['lngMax'] = $marqueurs['stats']['lngMax'] < $lng ? $lng : $marqueurs['stats']['lngMax']; |
} |
} |
private function traiterNbreObs($resultats) { |
$obs_nbre = 0; |
if ($resultats !== false) { |
$obs_nbre = count($resultats); |
} |
return $obs_nbre; |
} |
private function verifierLatLng($lat, $lng) { |
$ok_lat = $this->etreLatitude($lat) ? true : false; |
$ok_lng = $this->etreLongitude($lng) ? true : false; |
$ok = $ok_lat && $ok_lng; |
return $ok; |
} |
private function etreLatitude($lat) { |
$ok = false; |
//$format = preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lat) ? true : false; |
$ok = ($lat >= -90 && $lat <= 90) ? true : false; |
return $ok; |
} |
private function etreLongitude($lng) { |
$ok = false; |
//$format = preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lng) ? true : false; |
$ok = ($lng >= -180 && $lng <= 180) ? true : false; |
return $ok; |
} |
/* à changer pour localisation_floutage */ |
private function etreObsSensible($tags) { |
$sensible = true; |
if (stristr($tags, 'sensible') === FALSE) { |
$sensible = false; |
} |
return $sensible; |
} |
private function communeEstDemandee() { |
$station_infos = $this->decomposerParametreStation(); |
$commune_demandee = true; |
if($station_infos['type'] == self::MARQUEUR_STATION) { |
$commune_demandee = false; |
} |
return $commune_demandee; |
} |
/** |
* Données pour l'affichage des obs d'une station |
*/ |
public function getObservations($params) { |
$resultats = array(); |
$total = 0; |
if (isset($this->parametres['station']) && !$this->etreNull($this->parametres['station'])) { |
$requete = 'SELECT SQL_CALC_FOUND_ROWS id_observation, ce_utilisateur, courriel_utilisateur, pseudo_utilisateur as nom_utilisateur, "" as prenom_utilisateur, '. |
' nom_sel, nom_ret, nom_sel_nn, nom_ret_nn, "" as nt, famille, '. |
' lieudit, zone_geo, date_observation, milieu, commentaire, '. |
' utm_secteur, utm_x, utm_y, code, date_transmission, nom_referentiel '. |
'FROM cel_export_total AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
" ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) ". |
"WHERE transmission = '1' ". |
$this->standard. |
(($this->communeEstDemandee()) ? $this->construireWhereCommuneSansCoordonneesAvecSensibles() : $this->construireWhereCoordonneesSansSensibles()). |
$this->construireWhereDept(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY nom_sel ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//echo $requete;exit; |
$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
$requete = 'SELECT FOUND_ROWS()'; |
$total = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE); |
} |
// Post-traitement |
$observations = $this->traiterObservations($resultats, $total); |
$observations = $this->ajouterImagesAuxObs($observations); |
$observations = $this->ajouterAuteursAuxObs($observations); |
$observations = $this->supprimerIdDesObs($observations); |
return $observations; |
} |
private function traiterObservations($donnees, $total) { |
$observations = array('commune' => '', 'observations' => array(), 'observateurs' => array()); |
$observations['total'] = (isset($total)) ? $total : 0; |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
//echo '<pre>'.print_r($donnee,true).'</pre>';exit; |
$observation = array(); |
$observation['idObs'] = $donnee->id_observation; |
$observation['nn'] = $this->etreNull($donnee->nom_sel_nn) ? null : $donnee->nom_sel_nn; |
$observation['nomSci'] = $this->nettoyerTexte($donnee->nom_sel); |
$observation['date'] = ($donnee->date_observation != '0000-00-00 00:00:00') ? $this->formaterDate($donnee->date_observation, '%d/%m/%Y') : ''; |
$observation['datePubli'] = $this->formaterDate($donnee->date_transmission); |
$observation['lieu'] = $this->traiterLieu($donnee); |
$observation['observateur'] = $donnee->courriel_utilisateur; |
$observation['observateurId'] = $donnee->ce_utilisateur; |
$observation['urlEflore'] = $this->getUrlEflore($donnee->nom_referentiel, $donnee->nom_sel_nn); |
if (isset($donnee->zone_geo)) { |
$observations['commune'] = $this->nettoyerTexte($donnee->zone_geo); |
} |
$observations['observations'][$donnee->id_observation] = $observation; |
if (! array_key_exists($donnee->ce_utilisateur, $observations['observateurs'])) { |
$observations['observateurs'][$donnee->courriel_utilisateur] = $donnee->courriel_utilisateur; |
} |
} |
} |
return $observations; |
} |
private function traiterLieu($donnee) { |
$lieu = array(); |
if (!$this->etreNull($donnee->lieudit)) { |
$lieu[] = $donnee->lieudit; |
} |
if (!$this->etreNull($donnee->milieu)) { |
$lieu[] = $donnee->milieu; |
} |
return implode(', ', $lieu); |
} |
private function chargerImages(Array $obs_ids) { |
// Récupération des données au format Json |
$service = 'CelImage/liste-ids?obsId='.implode(',', $obs_ids); |
$url = sprintf($this->config['settings']['baseURLServicesCelTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
$donnees = json_decode($json); |
// Post-traitement des données |
$images = $this->traiterImages($donnees); |
return $images; |
} |
private function traiterImages($donnees) { |
$images = array(); |
if (count($donnees) > 0) { |
foreach ($donnees as $id_obs => $id_images) { |
foreach ($id_images as $id_img) { |
$urls['idImg'] = $id_img; |
$urls['guid'] = sprintf($this->config['settings']['guidImgTpl'], $id_img); |
$urls['miniature'] = $this->getUrlImage($id_img, 'CXS').'.jpg'; |
$urls['normale'] = $this->getUrlImage($id_img, 'XL').'.jpg'; |
$images[$id_obs][] = $urls; |
} |
} |
} |
return $images; |
} |
private function ajouterImagesAuxObs($observations) { |
$images = $this->chargerImages(array_keys($observations['observations'])); |
foreach ($observations['observations'] as $id => $infos) { |
if(isset($images[$id])) { |
$infos['images'] = $images[$id]; |
$observations['observations'][$id] = $infos; |
} |
} |
return $observations; |
} |
private function ajouterAuteursAuxObs($observations) { |
$observateurs = $this->recupererUtilisateursIdentite(array_keys($observations['observateurs'])); |
unset($observations['observateurs']); |
foreach ($observations['observations'] as $id => $infos) { |
$courriel = strtolower($infos['observateur']); |
if(isset($observateurs[$courriel])) { |
$infos['observateur'] = $observateurs[$courriel]['intitule']; |
$infos['observateurId'] = $observateurs[$courriel]['id']; |
} |
$observations['observations'][$id] = $infos; |
} |
return $observations; |
} |
private function supprimerIdDesObs($observations) { |
// Le tableau de sortie ne doit pas avoir les id des obs en clé car sinon Jquery Template ne fonctionne pas |
$observationSansId = $observations; |
unset($observationSansId['observations']); |
foreach ($observations['observations'] as $id => $infos) { |
$observationSansId['observations'][] = $infos; |
} |
return $observationSansId; |
} |
/** |
* Liste des taxons présents sur la carte |
*/ |
public function getTaxons($params) { |
$json = null; |
$requete = 'SELECT SQL_CALC_FOUND_ROWS DISTINCT nom_ret, nom_ret_nn, nt, famille '. |
'FROM cel_export_total AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
' ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) '. |
"WHERE transmission = '1' ". |
$this->standard. |
" AND nom_ret != '' ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY nom_ret ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//$this->debug[] = $requete; |
$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
//echo $requete;exit; |
$requete = 'SELECT FOUND_ROWS()'; |
$taxons['total'] = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE); |
// Post-traitement |
$taxons['taxons'] = $this->traiterTaxons($resultats); |
return $taxons; |
} |
private function traiterTaxons($donnees) { |
$taxons = array(); |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
if (!isset($taxons[$donnee->nt]) && ! $this->etreNull($donnee->nom_ret)) { |
$taxon = array(); |
$taxon['nn'] = $donnee->nom_ret_nn; |
$taxon['nt'] = $donnee->nt; |
$taxon['nom'] = $this->nettoyerTexte($donnee->nom_ret); |
$taxon['famille'] = $this->nettoyerTexte($donnee->famille); |
$taxons[$donnee->nt] = $taxon; |
} |
} |
} |
$taxons = array_values($taxons); |
return $taxons; |
} |
private function construireWhereCoordonnees() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->decomposerParametreStation()); |
if (isset($type)) { |
if ($type == self::MARQUEUR_COMMUNE) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng "; |
} else if ($type == self::MARQUEUR_STATION) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) "; |
} |
} |
return $sql; |
} |
private function construireWhereCoordonneesSansSensibles() { |
$sql = '('; |
// Récupération des coordonnées depuis l'id station |
extract($this->decomposerParametreStation()); |
if (isset($type)) { |
if ($type == self::MARQUEUR_COMMUNE) { |
$lat = Cel::db()->proteger($lat); |
$lng = Cel::db()->proteger($lng); |
$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng "; |
} else if ($type == self::MARQUEUR_STATION) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) "; |
} |
} |
//$sql .= ' AND (localisation_floutage IS NULL OR localisation_floutage = "précise" ) '; |
return $sql; |
} |
private function construireWhereCommentaire() { |
$sql = ''; |
list($type, $commentaire) = $this->decomposerParametreCommentaire(); |
if (!$this->etreNull($commentaire)) { |
$commentaire = Cel::db()->proteger('%'.$commentaire.'%'); |
switch ($type) { |
case '*' : |
$sql = $this->obtenirConditionPourCommentaires($commentaire); |
$sql = " AND (commentaire LIKE $commentaire OR ($sql)) "; |
break; |
case 'observation' : |
$sql = " AND commentaire LIKE $commentaire "; |
break; |
case 'photo' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaires($commentaire).' '; |
break; |
case 'photo.meta' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireMeta($commentaire).' '; |
break; |
case 'photo.utilisateur' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireUtilisateur($commentaire).' '; |
break; |
default: |
$sql = " AND commentaire LIKE $commentaire "; |
} |
} |
return $sql; |
} |
private function construireWhereNomTaxon() { |
$sql = ''; |
list($type, $nom) = $this->decomposerParametreTaxon(); |
if (!$this->etreNull($nom)) { |
$nom = Cel::db()->proteger($nom.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND (nom_ret LIKE $nom OR nom_sel LIKE $nom OR famille LIKE $nom) "; |
break; |
case 'retenu' : |
$sql = " AND nom_ret LIKE $nom "; |
break; |
case 'selectionne' : |
$sql = " AND nom_sel LIKE $nom "; |
break; |
case 'famille' : |
$sql = " AND famille LIKE $nom "; |
break; |
default: |
$sql = " AND nom_ret LIKE $nom "; |
} |
} |
return $sql; |
} |
private function construireWhereReferentiel() { |
$sql = ''; |
extract($this->parametres); |
if (isset($referentiel) && !$this->etreNull($referentiel)) { |
$referentiel = Cel::db()->proteger($referentiel.'%'); |
$sql = ' AND co.nom_referentiel LIKE '.$referentiel.' '; |
} |
return $sql; |
} |
private function construireWhereDate() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
list($type, $date) = $this->decomposerParametreDate(); |
if (!$this->etreNull($date)) { |
$date = Cel::db()->proteger($date.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND ( |
const MARQUEUR_GROUPE = 'GROUPE'; |
const MARQUEUR_COMMUNE = 'COMMUNE'; |
const MARQUEUR_STATION = 'STATION'; |
private $standard = "1"; |
private $table_export = "cel_export"; |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($ressources) { |
$retour = null; |
if($this->parametres == null) { |
$this->parametres = array(); |
} |
extract($this->parametres); |
//Chronometre::chrono("Avant groupage"); |
if (isset($this->parametres['standard']) && $this->parametres['standard'] == 0) { |
$this->standard = "0"; |
$this->table_export = "cel_export_total"; |
} |
$action = array_shift($ressources); |
if (isset($action)) { |
$methode = $this->traiterNomMethodeGet($action); |
if (method_exists($this, $methode)) { |
$retour = $this->$methode($ressources); |
} else { |
$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Vous devez indiquer le type de ressource."; |
} |
//Chronometre::chrono("Apres traitement"); |
//echo Chronometre::afficherChrono(); |
if (is_null($retour)) { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyer($info); |
} else if (isset($retour['type']) && $retour['type'] == 'jsonVar') { |
$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']); |
} else if (isset($retour['type']) && $retour['type'] == 'jsonP') { |
$this->envoyerJsonp($retour['donnees']); |
} else if (isset($retour['type']) && $retour['type'] == 'png') { |
header("Content-type: image/png"); |
imagepng($retour['img']); |
imagedestroy($retour['img']); |
} else { |
$this->envoyerJson($retour); |
} |
} |
/** |
* Les icones des groupes de stations |
*/ |
public function getIconeGroupe($params) { |
extract($this->parametres); |
$chemin_marqueur = sprintf($this->config['settings']['cheminCelMarkerObsTpl'], $type); |
$img = imagecreatefrompng($chemin_marqueur); |
$noir = imagecolorallocate($img, 0, 0, 0); |
$texte = (String) $nbre; |
$x = (imagesx($img) - 6.0 * strlen($texte)) / 2; |
$y = (imagesy($img) - 16) / 2; |
imagestring($img, 3, $x, $y, $texte, $noir); |
imagealphablending($img, false); |
imagesavealpha($img, true); |
return array('type' => 'png', 'img' => $img); |
} |
public function getTout($params) { |
$emplacements = null; |
$concatenation_id = "CONCAT(IFNULL(latitude,''),IFNULL(longitude,'')) "; |
$transmission = ( $this->standard == 0) ? "transmission = '1' AND " : ""; |
$requete = 'SELECT distinct ce_zone_geo, zone_geo, NULL as station, '. |
"NULL as mots_cles_texte, ". |
"latitude, ". |
"NULL as wgs84_latitude, ". |
"longitude, ". |
"NULL as wgs84_longitude, ". |
$concatenation_id." as id_coord ". |
'FROM '.$this->table_export.' AS co '. |
"WHERE ".$transmission. |
" (". |
$this->construireWhereRectangleStationOR()." ". |
$this->construireWhereRectangleCommuneOR().") ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(); |
$resultats_emplacements = Cel::db()->requeter($requete); |
$emplacements = $this->traiterEmplacements($resultats_emplacements, $this->compterObservations($params)); |
return $emplacements; |
} |
private function afficherRequeteFormatee($requete) { |
$requete = str_replace(')',')<br />',$requete); |
$requete = str_replace('(',' <br /> (',$requete); |
echo '<pre>'.$requete.'</pre>'; |
exit; |
} |
private $nb_obs = 0; |
private function compterObservations($params) { |
$transmission = ( $this->standard == 0) ? "transmission = '1' AND " : ""; |
$requete = 'SELECT COUNT(*) as nb '. |
'FROM '.$this->table_export.' AS co '. |
"WHERE ".$transmission. |
" (". |
$this->construireWhereRectangleStationOR()." OR ". |
$this->construireWhereRectangleCommuneOR().") ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(); |
$resultats_nb_obs = Cel::db()->requeter($requete); |
return $resultats_nb_obs[0]['nb']; |
} |
private function traiterEmplacements(&$emplacements, $nb_total_observation) { |
$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11; |
$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20; |
$marqueurs = array( |
'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0), |
'points' => null |
); |
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($emplacements, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom); |
// laisser la classe cartoGroupage compter les élements simplifie le comptage |
// et permet de ne pas reparser le tableau pour compter les différents éléments |
$nb_elements = CartoGroupage::getNbElements(); |
// les bornes servent à centrer la carte dans le cas ou l'on demande des paramètres précis |
$marqueurs['stats']['coordmax'] = CartoGroupage::getBornes(); |
$marqueurs['stats']['stations'] = $nb_elements['stations']; |
$marqueurs['stats']['communes'] = $nb_elements['communes']; |
$marqueurs['stats']['observations'] = (int)$nb_total_observation; |
} else { |
$marqueurs['points'] = $emplacements; |
} |
return $marqueurs; |
} |
private function traiterStations($communes, $stations) { |
$zoom = (int) array_key_exists('zoom', $this->parametres) ? $this->parametres['zoom'] : 11; |
$distance = (int) array_key_exists('distance', $this->parametres) ? $this->parametres['distance'] : 20; |
$marqueurs = array( |
'stats' => array('stations' => 0, 'communes' => 0, 'observations' => 0), |
'points' => null |
); |
$marqueurs['stats']['observations'] = $this->traiterNbreObs($communes) + $this->traiterNbreObs($stations); |
$points = array(); |
if ($communes !== false) { |
foreach ($communes as $commune) { |
if (is_numeric($commune['lat']) && is_numeric($commune['lng'])) { |
extract($commune); |
$id = self::MARQUEUR_COMMUNE.':'.$lat.'|'.$lng; |
$lata = round($lat, 5); |
$lnga = round($lng, 5); |
if (!isset($points[$id])) { |
$points[$id]['id'] = $id; |
$points[$id]['nom'] = $nom; |
$points[$id]['lat'] = $lata; |
$points[$id]['lng'] = $lnga; |
$points[$id]['nbre'] = 1; |
$marqueurs['stats']['communes']++; |
} else { |
$points[$id]['nbre']++; |
} |
} |
} |
} |
if ($stations !== false) { |
foreach ($stations as $station) { |
if (is_numeric($station['lat']) && is_numeric($station['lng'])) { |
extract($station); |
$id = self::MARQUEUR_STATION.':'.$lat.'|'.$lng; |
$lata = round($lat, 5); |
$lnga = round($lng, 5); |
$nom = $this->etreNull($nom) ? $lata.','.$lnga : $nom; |
if (!isset($points[$id])) { |
$points[$id]['id'] = $id; |
$points[$id]['nom'] = $nom; |
$points[$id]['lat'] = $lata; |
$points[$id]['lng'] = $lnga; |
$points[$id]['nbre'] = 1; |
$marqueurs['stats']['stations']++; |
} else { |
$points[$id]['nbre']++; |
} |
} |
} |
} |
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom); |
} else { |
$marqueurs['points'] = $points; |
} |
//$marqueurs['stats']['latDiff'] = abs($marqueurs['stats']['latMin'] - $marqueurs['stats']['latMax']); |
//$marqueurs['stats']['lngDiff'] = abs($marqueurs['stats']['lngMin'] - $marqueurs['stats']['lngMax']); |
return $marqueurs; |
} |
private function definirLatLngMaxMin(&$marqueurs, $lat, $lng) { |
if ($lat != null && $lng != null) { |
$marqueurs['stats']['latMin'] = $marqueurs['stats']['latMin'] > $lat ? $lat : $marqueurs['stats']['latMin']; |
$marqueurs['stats']['lngMin'] = $marqueurs['stats']['lngMin'] > $lng ? $lng : $marqueurs['stats']['lngMin']; |
$marqueurs['stats']['latMax'] = $marqueurs['stats']['latMax'] < $lat ? $lat : $marqueurs['stats']['latMax']; |
$marqueurs['stats']['lngMax'] = $marqueurs['stats']['lngMax'] < $lng ? $lng : $marqueurs['stats']['lngMax']; |
} |
} |
private function traiterNbreObs($resultats) { |
$obs_nbre = 0; |
if ($resultats !== false) { |
$obs_nbre = count($resultats); |
} |
return $obs_nbre; |
} |
private function verifierLatLng($lat, $lng) { |
$ok_lat = $this->etreLatitude($lat) ? true : false; |
$ok_lng = $this->etreLongitude($lng) ? true : false; |
$ok = $ok_lat && $ok_lng; |
return $ok; |
} |
private function etreLatitude($lat) { |
$ok = false; |
//$format = preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lat) ? true : false; |
$ok = ($lat >= -90 && $lat <= 90) ? true : false; |
return $ok; |
} |
private function etreLongitude($lng) { |
$ok = false; |
//$format = preg_match('/^[-]?[0-9]+(?:[.][0-9]+|)$/', $lng) ? true : false; |
$ok = ($lng >= -180 && $lng <= 180) ? true : false; |
return $ok; |
} |
/* à changer pour localisation_floutage */ |
private function etreObsSensible($tags) { |
$sensible = true; |
if (stristr($tags, 'sensible') === FALSE) { |
$sensible = false; |
} |
return $sensible; |
} |
private function communeEstDemandee() { |
$station_infos = $this->decomposerParametreStation(); |
$commune_demandee = true; |
if($station_infos['type'] == self::MARQUEUR_STATION) { |
$commune_demandee = false; |
} |
return $commune_demandee; |
} |
/** |
* Données pour l'affichage des obs d'une station |
*/ |
public function getObservations($params) { |
$resultats = array(); |
$total = 0; |
$transmission = ( $this->standard == 0) ? "transmission = '1' " : " 1 "; |
if (isset($this->parametres['station']) && !$this->etreNull($this->parametres['station'])) { |
$requete = 'SELECT SQL_CALC_FOUND_ROWS id_observation, ce_utilisateur, courriel_utilisateur, pseudo_utilisateur as nom_utilisateur, "" as prenom_utilisateur, '. |
' nom_sel, nom_ret, nom_sel_nn, nom_ret_nn, "" as nt, famille, '. |
' lieudit, zone_geo, date_observation, milieu, commentaire, '. |
' null as utm_secteur, null as utm_x, null as utm_y, ce_zone_geo as code, date_transmission, nom_referentiel '. |
'FROM '.$this->table_export.' AS co '. |
"WHERE ".$transmission. |
(($this->communeEstDemandee()) ? $this->construireWhereCommuneSansCoordonneesAvecSensibles() : $this->construireWhereCoordonneesSansSensibles()). |
$this->construireWhereDept(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxonAvecSousTaxons(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY nom_sel ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//echo $requete;exit; |
$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
$requete = 'SELECT FOUND_ROWS()'; |
$total = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE); |
} |
// Post-traitement |
$observations = $this->traiterObservations($resultats, $total); |
$observations = $this->ajouterImagesAuxObs($observations); |
$observations = $this->ajouterAuteursAuxObs($observations); |
$observations = $this->supprimerIdDesObs($observations); |
return $observations; |
} |
private function traiterObservations($donnees, $total) { |
$observations = array('commune' => '', 'observations' => array(), 'observateurs' => array()); |
$observations['total'] = (isset($total)) ? $total : 0; |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
//echo '<pre>'.print_r($donnee,true).'</pre>';exit; |
$observation = array(); |
$observation['idObs'] = $donnee->id_observation; |
$observation['nn'] = $this->etreNull($donnee->nom_sel_nn) ? null : $donnee->nom_sel_nn; |
$observation['nomSci'] = $this->nettoyerTexte($donnee->nom_sel); |
$observation['date'] = ($donnee->date_observation != '0000-00-00 00:00:00') ? $this->formaterDate($donnee->date_observation, '%d/%m/%Y') : ''; |
$observation['datePubli'] = $this->formaterDate($donnee->date_transmission); |
$observation['lieu'] = $this->traiterLieu($donnee); |
$observation['observateur'] = $donnee->courriel_utilisateur; |
$observation['observateurId'] = $donnee->ce_utilisateur; |
$observation['urlEflore'] = $this->getUrlEflore($donnee->nom_referentiel, $donnee->nom_sel_nn); |
if (isset($donnee->zone_geo)) { |
$observations['commune'] = $this->nettoyerTexte($donnee->zone_geo); |
} |
$observations['observations'][$donnee->id_observation] = $observation; |
if (! array_key_exists($donnee->ce_utilisateur, $observations['observateurs'])) { |
$observations['observateurs'][$donnee->courriel_utilisateur] = $donnee->courriel_utilisateur; |
} |
} |
} |
return $observations; |
} |
private function traiterLieu($donnee) { |
$lieu = array(); |
if (!$this->etreNull($donnee->lieudit)) { |
$lieu[] = $donnee->lieudit; |
} |
if (!$this->etreNull($donnee->milieu)) { |
$lieu[] = $donnee->milieu; |
} |
return implode(', ', $lieu); |
} |
private function chargerImages(Array $obs_ids) { |
// Récupération des données au format Json |
$service = 'CelImage/liste-ids?obsId='.implode(',', $obs_ids); |
$url = sprintf($this->config['settings']['baseURLServicesCelTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
$donnees = json_decode($json); |
// Post-traitement des données |
$images = $this->traiterImages($donnees); |
return $images; |
} |
private function traiterImages($donnees) { |
$images = array(); |
if (count($donnees) > 0) { |
foreach ($donnees as $id_obs => $id_images) { |
foreach ($id_images as $id_img) { |
$urls['idImg'] = $id_img; |
$urls['guid'] = sprintf($this->config['settings']['guidImgTpl'], $id_img); |
$urls['miniature'] = $this->getUrlImage($id_img, 'CXS').'.jpg'; |
$urls['normale'] = $this->getUrlImage($id_img, 'XL').'.jpg'; |
$images[$id_obs][] = $urls; |
} |
} |
} |
return $images; |
} |
private function ajouterImagesAuxObs($observations) { |
$images = $this->chargerImages(array_keys($observations['observations'])); |
foreach ($observations['observations'] as $id => $infos) { |
if(isset($images[$id])) { |
$infos['images'] = $images[$id]; |
$observations['observations'][$id] = $infos; |
} |
} |
return $observations; |
} |
private function ajouterAuteursAuxObs($observations) { |
$observateurs = $this->recupererUtilisateursIdentite(array_keys($observations['observateurs'])); |
unset($observations['observateurs']); |
foreach ($observations['observations'] as $id => $infos) { |
$courriel = strtolower($infos['observateur']); |
if(isset($observateurs[$courriel])) { |
$infos['observateur'] = $observateurs[$courriel]['intitule']; |
$infos['observateurId'] = $observateurs[$courriel]['id']; |
} |
$observations['observations'][$id] = $infos; |
} |
return $observations; |
} |
private function supprimerIdDesObs($observations) { |
// Le tableau de sortie ne doit pas avoir les id des obs en clé car sinon Jquery Template ne fonctionne pas |
$observationSansId = $observations; |
unset($observationSansId['observations']); |
foreach ($observations['observations'] as $id => $infos) { |
$observationSansId['observations'][] = $infos; |
} |
return $observationSansId; |
} |
/** |
* Liste des taxons présents sur la carte |
*/ |
public function getTaxons($params) { |
$json = null; |
$transmission = ( $this->standard == 0) ? "transmission = '1' AND " : ""; |
$requete = 'SELECT SQL_CALC_FOUND_ROWS DISTINCT nom_ret, nom_ret_nn, nt, famille '. |
'FROM '.$this->table_export.' AS co '. |
"WHERE ".$transmission. |
" nom_ret != '' ". |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereDate(). |
$this->construireWhereCommentaire(). |
$this->construireWherePhotosSeulement(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereNombreDeJours(). |
$this->construireWhereAnnee(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY nom_ret ASC '. |
"LIMIT {$this->start},{$this->limit} "; |
//$this->debug[] = $requete; |
$resultats = Cel::db()->requeter($requete, self::SQL_RETOUR_COMPLET, self::SQL_MODE_OBJET); |
//echo $requete;exit; |
$requete = 'SELECT FOUND_ROWS()'; |
$taxons['total'] = (int) Cel::db()->requeter($requete, self::SQL_RETOUR_COLONNE); |
// Post-traitement |
$taxons['taxons'] = $this->traiterTaxons($resultats); |
return $taxons; |
} |
private function traiterTaxons($donnees) { |
$taxons = array(); |
if (is_array($donnees) && count($donnees) > 0) { |
foreach ($donnees as $donnee) { |
if (!isset($taxons[$donnee->nt]) && ! $this->etreNull($donnee->nom_ret)) { |
$taxon = array(); |
$taxon['nn'] = $donnee->nom_ret_nn; |
$taxon['nt'] = $donnee->nt; |
$taxon['nom'] = $this->nettoyerTexte($donnee->nom_ret); |
$taxon['famille'] = $this->nettoyerTexte($donnee->famille); |
$taxons[$donnee->nt] = $taxon; |
} |
} |
} |
$taxons = array_values($taxons); |
return $taxons; |
} |
private function construireWhereCoordonnees() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->decomposerParametreStation()); |
if (isset($type)) { |
if ($type == self::MARQUEUR_COMMUNE) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
//$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng "; |
} else if ($type == self::MARQUEUR_STATION) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) "; |
} |
} |
return $sql; |
} |
private function construireWhereCoordonneesSansSensibles() { |
$sql = '('; |
// Récupération des coordonnées depuis l'id station |
extract($this->decomposerParametreStation()); |
if (isset($type)) { |
if ($type == self::MARQUEUR_COMMUNE) { |
$lat = Cel::db()->proteger($lat); |
$lng = Cel::db()->proteger($lng); |
//$sql = " AND wgs84_latitude LIKE $lat AND wgs84_longitude LIKE $lng "; |
} else if ($type == self::MARQUEUR_STATION) { |
$lat = Cel::db()->proteger($lat.'%'); |
$lng = Cel::db()->proteger($lng.'%'); |
$sql = " AND (latitude LIKE $lat AND longitude LIKE $lng) "; |
} |
} |
//$sql .= ' AND (localisation_floutage IS NULL OR localisation_floutage = "précise" ) '; |
return $sql; |
} |
private function construireWhereCommentaire() { |
$sql = ''; |
list($type, $commentaire) = $this->decomposerParametreCommentaire(); |
if (!$this->etreNull($commentaire)) { |
$commentaire = Cel::db()->proteger('%'.$commentaire.'%'); |
switch ($type) { |
case '*' : |
$sql = $this->obtenirConditionPourCommentaires($commentaire); |
$sql = " AND (commentaire LIKE $commentaire OR ($sql)) "; |
break; |
case 'observation' : |
$sql = " AND commentaire LIKE $commentaire "; |
break; |
case 'photo' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaires($commentaire).' '; |
break; |
case 'photo.meta' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireMeta($commentaire).' '; |
break; |
case 'photo.utilisateur' : |
$sql = ' AND '.$this->obtenirConditionPourCommentaireUtilisateur($commentaire).' '; |
break; |
default: |
$sql = " AND commentaire LIKE $commentaire "; |
} |
} |
return $sql; |
} |
private function construireWhereNomTaxon() { |
$sql = ''; |
list($type, $nom) = $this->decomposerParametreTaxon(); |
if (!$this->etreNull($nom)) { |
$nom = Cel::db()->proteger($nom.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND (nom_ret LIKE $nom OR nom_sel LIKE $nom OR famille LIKE $nom) "; |
break; |
case 'retenu' : |
$sql = " AND nom_ret LIKE $nom "; |
break; |
case 'selectionne' : |
$sql = " AND nom_sel LIKE $nom "; |
break; |
case 'famille' : |
$sql = " AND famille LIKE $nom "; |
break; |
default: |
$sql = " AND nom_ret LIKE $nom "; |
} |
} |
return $sql; |
} |
private function construireWhereReferentiel() { |
$sql = ''; |
extract($this->parametres); |
if (isset($referentiel) && !$this->etreNull($referentiel)) { |
$referentiel = Cel::db()->proteger($referentiel); |
$sql = ' AND co.nom_referentiel = '.$referentiel.' '; |
} |
return $sql; |
} |
private function construireWhereDate() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
list($type, $date) = $this->decomposerParametreDate(); |
if (!$this->etreNull($date)) { |
$date = Cel::db()->proteger($date.'%'); |
switch ($type) { |
case '*' : |
$sql = " AND ( |
date_observation LIKE $date |
OR date_creation LIKE $date |
OR date_modification LIKE $date |
OR date_transmission LIKE $date) "; |
break; |
case 'observation' : |
$sql = " AND date_observation LIKE $date "; |
break; |
case 'creation' : |
$sql = " AND date_creation LIKE $date "; |
break; |
case 'modification' : |
$sql = " AND date_modification LIKE $date "; |
break; |
case 'transmission' : |
$sql = " AND date_transmission LIKE $date "; |
break; |
case 'photo' : |
$sql = $this->obtenirConditionPourDatePhoto($date); |
break; |
case 'ajout' : |
$sql = $this->obtenirConditionPourDateAjout($date); |
break; |
case 'liaison' : |
$sql = $this->obtenirConditionPourDateLiaison($date); |
break; |
default: |
$sql = " AND date_observation LIKE $date "; |
} |
} |
return $sql; |
} |
private function obtenirConditionPourDatePhoto($date) { |
$observations = $this->obtenirObsLieesImg('date.photo', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une photo prise à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateLiaison($date) { |
$observations = $this->obtenirObsLieesImg('date.liaison', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'a été liée à une image à à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateAjout($date) { |
$observations = $this->obtenirObsLieesImg('date.ajout', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image ajoutée à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourCommentaireMeta($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.meta', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des méta-données correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaireUtilisateur($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.utilisateur', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des utilisateur correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaires($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.*', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont un des commentaires correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
/** |
* Récupération des identifiant d'utilisateur et des ordres des observations correspondant à une date. |
* Retour sous forme de tableau : array[identifiant] = array(ordre, ordre...); |
*/ |
private function obtenirObsLieesImg($type, $param) { |
// Construction de la requête |
$requete = 'SELECT DISTINCT co.id_obs, co.ce_utilisateur AS utilisateur '. |
'FROM cel_export_total AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
' ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) '. |
"WHERE co.transmission = '1' and co.images != null". |
$this->standard. |
($type == 'date.creation' ? " AND co.date_creation LIKE $param " : ''). |
($type == 'commentaire.obs' ? " AND co.commentaire LIKE $param " : ''). |
($type == 'commentaire.*' ? " AND co.commentaire LIKE $param " : ''). |
$this->construireWhereCoordonnees(). |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY utilisateur ASC, ordre ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$resultats = Cel::db()->requeter($requete); |
$observations = null; |
if ($resultats != false) { |
$observations = array(); |
foreach ($resultats as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$ordre = $occurence['ordre']; |
if (!array_key_exists($utilisateur, $observations)) { |
$observations[$utilisateur] = array(); |
} |
if (!array_key_exists($ordre, $observations[$utilisateur])) { |
$observations[$utilisateur][$ordre] = $ordre; |
} |
} |
} |
return $observations; |
} |
private function assemblerObsEnConditionSql($observations, $operateur = 'AND') { |
$sql = ''; |
if ($observations != null) { |
// Pré-construction du where de la requête |
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))"; |
foreach ($observations as $utilisateur => $ordres) { |
$morceaux_requete[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres)); |
} |
if (count($morceaux_requete) > 0) { |
$sql = implode(" \nOR ", $morceaux_requete); |
} |
} else { |
// Nous voulons que la requête ne retourne rien |
$sql = "identifiant = '' AND ordre = ''"; |
} |
$sql = " $operateur ($sql) "; |
return $sql; |
} |
private function construireWhereRectangleStation() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
// ATTENTION : latitude correspond bien à la LATITUDE! |
$sql = " AND (latitude != 0 AND longitude != 0) ". |
" AND latitude > $latMin ". |
" AND latitude < $latMax ". |
" AND longitude > $lngMin ". |
" AND longitude < $lngMax "; |
} |
return $sql; |
} |
private function construireWhereRectangleStationOR() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
$sql = "( (latitude != 0 AND longitude != 0) ". |
" AND latitude BETWEEN $latMin AND $latMax ". |
" AND longitude BETWEEN $lngMin AND $lngMax )"; |
/*$sql = " MBRWithin(mon_point, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','. |
$latMax.' '.$lngMin.','. |
$latMax.' '.$lngMax.','. |
$latMax.' '.$lngMin.','. |
$latMin.' '.$lngMin."))')) "; */ |
} |
return $sql; |
} |
private function construireWhereRectangleCommune() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
$sql = "AND wgs84_longitude != 0 AND wgs84_latitude != 0 ". |
" AND wgs84_latitude BETWEEN $latMin AND $latMax ". |
" AND wgs84_longitude BETWEEN $lngMin AND $lngMax "; |
} |
return $sql; |
} |
private function construireWhereRectangleCommuneOR() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
$sql = "( wgs84_longitude != 0 AND wgs84_latitude != 0 ". |
" AND wgs84_latitude BETWEEN $latMin AND $latMax ". |
" AND wgs84_longitude BETWEEN $lngMin AND $lngMax )"; |
/*$sql = " MBRWithin(point_commune, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','. |
$latMax.' '.$lngMin.','. |
$latMax.' '.$lngMax.','. |
$latMax.' '.$lngMin.','. |
$latMin.' '.$lngMin."))')) ";*/ |
} |
return $sql; |
} |
private function construireWhereDept() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($dept) && !$this->etreNull($dept)) { |
$valeurs_a_proteger = explode(',',trim($dept)); |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = '(dept = '.Cel::db()->quote($valeur).') '; |
} |
$valeurs = implode(' OR ', $valeurs_protegees); |
$sql = " AND ($valeurs) "; |
} |
return $sql; |
} |
private function construireWhereCommune() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['commune']) && !$this->etreNull($commune)) { |
$commune = Cel::db()->proteger($commune); |
$sql = " AND zone_geo LIKE $commune"; |
} |
if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) { |
$zonegeo = Cel::db()->proteger($zonegeo); |
$sql = " AND ce_zone_geo = $zonegeo"; |
} |
return $sql; |
} |
private function construireWherePays() { |
$sql = ''; |
extract($this->parametres); |
if (isset($this->parametres['pays']) && !$this->etreNull($pays)) { |
$pays = Cel::db()->proteger($pays); |
$sql = " AND pays = $pays"; |
} |
return $sql; |
} |
private function construireWhereCommuneSansCoordonneesAvecSensibles() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['commune']) && !$this->etreNull($commune)) { |
$commune = Cel::db()->proteger($commune); |
$sql = " AND zone_geo LIKE $commune"; |
} |
if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) { |
$zonegeo = Cel::db()->proteger($zonegeo); |
$sql = " AND ce_zone_geo = $zonegeo"; |
} |
$sql .= " AND ". |
"(". |
"(". |
"(latitude = '000null' OR latitude = '' OR latitude = 0 OR latitude IS NULL) AND ". |
"(longitude = '000null' OR longitude = '' OR longitude = 0 OR longitude IS NULL) ". |
')'. |
' OR localisation_floutage IN ("localité", "10x10km")'. |
') '; |
return $sql; |
} |
private function construireWherePhotosSeulement() { |
$sql = ''; |
if (isset($this->parametres['photos']) && $this->parametres['photos'] == 1) { |
$sql = 'AND co.id_observation IN (SELECT DISTINCT ce_observation FROM cel_images_export) '; |
} |
return $sql; |
} |
private function construireWhereUtilisateur() { |
$sql = ''; |
// TODO tester si l'on recoit un id, un mail ou bien un nom ou prenom |
// pour en faire une fonction polyvalente |
extract($this->parametres); |
if (isset($this->parametres['utilisateur']) && !$this->etreNull($utilisateur)) { |
$utilisateur = Cel::db()->proteger($utilisateur); |
if (is_numeric($this->parametres['utilisateur'])) { |
$sql = " AND co.ce_utilisateur = $utilisateur "; |
} else { |
$sql = " AND co.courriel_utilisateur = $utilisateur "; |
} |
} |
return $sql; |
} |
private function construireWhereNumTaxon() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) { |
$num_nom_ret = Cel::db()->proteger($num_nom_ret); |
$sql = " AND nom_ret_nn = $num_nom_ret "; |
} |
return $sql; |
} |
private function construireWhereNumTaxonAvecSousTaxons() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) { |
$sous_taxons = $this->obtenirSousTaxons($this->parametres['num_nom_ret']); |
$num_nom_retenu = Cel::db()->proteger($num_nom_ret); |
if(!empty($sous_taxons)) { |
$sql_in_sous_tax = implode(',', $sous_taxons); |
$sql = " AND (nom_sel_nn IN (".$sql_in_sous_tax.") OR ". |
"nom_ret_nn IN (".$sql_in_sous_tax.") ". |
") "; |
} |
else { |
$sql = " AND nom_ret_nn = $num_nom_ret "; |
} |
} |
return $sql; |
} |
private function obtenirSousTaxons($nt) { |
$referentiel = 'bdtfx'; |
if(isset($this->parametres['referentiel']) && $this->parametres['referentiel'] != "" && $this->parametres['referentiel'] != '*') { |
$referentiel = $this->parametres['referentiel']; |
} |
$nn_sous_taxons = array(); |
$sous_taxons = $this->obtenirSousTaxonsPourNn($referentiel, $nt); |
foreach($sous_taxons as $sous_tax) { |
$nn_sous_taxons[] = $sous_tax['num_nom']; |
} |
return $nn_sous_taxons; |
} |
private function construireWhereProjet() { |
$sql = ''; |
extract($this->parametres); |
$projet_sql = isset($projet) ? $this->getSqlWhereProjet($projet) : null; |
if (!$this->etreNull($projet_sql)) { |
$sql = " AND ($projet_sql) "; |
} |
return $sql; |
} |
/** |
* Traitement de $projet pour construction du filtre dans la requête |
* |
* projet1 ET projet2 ET projet3 => intersection |
* projet1 OU projet2 OU projet3 => union |
* projet1 ET projet2 OU projet3 => ATTENTION indéfini |
*/ |
private function getSqlWhereProjet($projet) { |
$sql = null; |
if (isset($projet) && !$this->etreNull($projet)) { |
if (strpos($projet, ' ET ')) { |
// intersection |
$projets = explode(' ET ', $projet); |
$clauses = array(); |
foreach ($projets as $proj) { |
if ($proj != '') { |
$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%'); |
} |
} |
$sql = implode($clauses, ' AND '); |
} else if (strpos($projet, ' OU ')) { |
// union |
$projets = explode(' OU ', $projet); |
$clauses = array(); |
foreach ($projets as $proj) { |
if ($proj != '') { |
$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%'); |
} |
} |
$sql = implode($clauses, ' OR '); |
} else { |
// simple |
$sql = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$projet.'%'); |
} |
} |
return $sql; |
} |
private function construireWhereTag() { |
$sql = ''; |
extract($this->parametres); |
$tag_sql = isset($tag) ? $this->getSqlWhereObsAvecImagesTaguees($tag) : null; |
if (!$this->etreNull($tag_sql)) { |
$sql = " AND ($tag_sql) "; |
} |
return $sql; |
} |
private function construireWhereNombreDeJours() { |
$sql = null; |
extract($this->parametres); |
if (isset($nbjours) && !$this->etreNull($nbjours)) { |
$sql = ' AND DATEDIFF(CURDATE(),co.date_creation) <= '.Cel::db()->proteger($nbjours).' '; |
} |
return $sql; |
} |
private function construireWhereAnnee() { |
$sql = null; |
extract($this->parametres); |
if (isset($annee) && !$this->etreNull($annee)) { |
$sql = ' AND YEAR(co.date_creation) = ' . Cel::db()->proteger($annee) . ' '; |
} |
return $sql; |
} |
private function construireWhereGroupeZoneGeo() { |
$sql = null; |
extract($this->parametres); |
if (isset($groupe_zones_geo) && !$this->etreNull($groupe_zones_geo)) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = 'AND ce_zone_geo IN ('.implode(',', $zones).') '; |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereObsAvecImagesTaguees($tag) { |
$sql = null; |
if (isset($tag) && !$this->etreNull($tag)) { |
$tag_sql = $this->getSqlWhereMotsCles($tag); |
// Construction de la requête |
$requete = 'SELECT DISTINCT co.id_observation AS id_obs, co.ce_utilisateur AS utilisateur '. |
'FROM cel_images_export ci'. |
' INNER JOIN cel_export_total AS co '. |
' ON (ci.ce_observation = co.id_observation) '. |
' LEFT JOIN cel_zones_geo AS zg '. |
" ON (zg.nom = co.zone_geo AND zg.id_zone_geo = co.ce_zone_geo) ". |
"WHERE co.transmission = '1' ". |
$this->standard. |
$this->construireWhereCoordonnees(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereProjet(). |
(!$this->etreNull($tag_sql) ? "AND ($tag_sql) " : ''). |
'ORDER BY utilisateur ASC, ci.ordre ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$elements_tag = Cel::db()->requeter($requete); |
$requete_tag = array(); |
if ($elements_tag != false && count($elements_tag) > 0) { |
$filtres = array(); |
foreach ($elements_tag as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$id_obs = $occurence['id_obs']; |
if (!array_key_exists($utilisateur, $filtres)) { |
$filtres[$utilisateur] = array(); |
} |
if (!array_key_exists($id_obs, $filtres[$utilisateur])) { |
$filtres[$utilisateur][$id_obs] = $id_obs; |
} |
} |
// Pré-construction du where de la requête |
$tpl_where = "(id_observation IN (%s))"; |
foreach ($filtres as $utilisateur => $id_obs) { |
$requete_tag[] = sprintf($tpl_where, implode(',', $id_obs)); |
} |
} else { |
$this->messages[] = "Aucune observation ne possède d'images avec ce mot-clé."; |
} |
if (count($requete_tag) > 0) { |
$sql = implode(" \nOR ", $requete_tag); |
} |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsCles($tag) { |
$sql = null; |
$mots_cles = $this->decomposerParametreTag($tag); |
$requete_projet = $this->getSqlWhereMotsClesImages($mots_cles); |
$sql = $requete_projet; |
//$this->debug[] = $sql; |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsClesImages($mots_cles_encodes) { |
$where_mots_cles_images = array(); |
foreach ($mots_cles_encodes['motsClesEncodesProteges'] as $mot_cle_encode) { |
$where_mots_cles_images[] = "ci.mots_cles_texte LIKE $mot_cle_encode"; |
} |
$where_mots_cles_images = implode(' '.$mots_cles_encodes['type'].' ', $where_mots_cles_images); |
return $where_mots_cles_images; |
} |
private function decomposerParametreTag($tags) { |
$mots_cles = array('type' => null, 'motsCles' => null, 'motsClesEncodesProteges' => null); |
if (preg_match('/.+OU.+/', $tags)) { |
$mots_cles['type'] = 'OR'; |
$mots_cles['motsCles'] = explode('OU', $tags); |
} else if (preg_match('/.+ET.+/', $tags)) { |
$mots_cles['type'] = 'AND'; |
$mots_cles['motsCles'] = explode('ET', $tags); |
} else { |
$mots_cles['motsCles'][] = $tags; |
} |
foreach ($mots_cles['motsCles'] as $mot) { |
$mots_cles['motsClesEncodesProteges'][] = Cel::db()->quote('%'.$mot.'%'); |
} |
$this->debug[] = $mots_cles; |
return $mots_cles; |
} |
private function decomposerLatLng($coord) { |
$lat_lng = array(); |
if (isset($coord)) { |
list($lat, $lng) = explode('|', $coord); |
$lat_lng = array('lat' => $lat, 'lng' => $lng); |
} |
return $lat_lng; |
} |
private function decomposerParametreStation() { |
$station_infos = array(); |
if (isset($this->parametres['station'])) { |
$station = $this->parametres['station']; |
$this->debug[] = $station; |
@list($type, $coord) = explode(':', $station); |
@list($lat, $lng) = explode('|', $coord); |
$station_infos = array('type' => $type, 'lat' => $lat, 'lng' => $lng); |
} |
return $station_infos; |
} |
private function decomposerParametreDate() { |
$date_infos = array(null,null); |
if (isset($this->parametres['date'])) { |
$date = $this->parametres['date']; |
if (strpos($date, ':')) { |
list($type, $date) = explode(':', $date); |
} else { |
$type = 'observation'; |
} |
$date = str_replace('/', '-', $date); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $date, $matches)) { |
$date = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$date_infos = array($type, $date); |
} |
return $date_infos; |
} |
private function decomposerParametreTaxon() { |
$nom_infos = array(null,null); |
if (isset($this->parametres['taxon'])) { |
$taxon = $this->parametres['taxon']; |
if (strpos($taxon, ':')) { |
$nom_infos = explode(':', $taxon); |
} else { |
$nom_infos = array('retenu', $taxon); |
} |
} |
return $nom_infos; |
} |
private function decomposerParametreCommentaire() { |
$commentaire_infos = array(null,null); |
if (isset($this->parametres['commentaire'])) { |
$commentaire = $this->parametres['commentaire']; |
if (strpos($commentaire, ':')) { |
$commentaire_infos = explode(':', $commentaire); |
} else { |
$commentaire_infos = array('observation', $commentaire); |
} |
} |
return $commentaire_infos; |
} |
break; |
case 'observation' : |
$sql = " AND date_observation LIKE $date "; |
break; |
case 'creation' : |
$sql = " AND date_creation LIKE $date "; |
break; |
case 'modification' : |
$sql = " AND date_modification LIKE $date "; |
break; |
case 'transmission' : |
$sql = " AND date_transmission LIKE $date "; |
break; |
case 'photo' : |
$sql = $this->obtenirConditionPourDatePhoto($date); |
break; |
case 'ajout' : |
$sql = $this->obtenirConditionPourDateAjout($date); |
break; |
case 'liaison' : |
$sql = $this->obtenirConditionPourDateLiaison($date); |
break; |
default: |
$sql = " AND date_observation LIKE $date "; |
} |
} |
return $sql; |
} |
private function obtenirConditionPourDatePhoto($date) { |
$observations = $this->obtenirObsLieesImg('date.photo', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une photo prise à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateLiaison($date) { |
$observations = $this->obtenirObsLieesImg('date.liaison', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'a été liée à une image à à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourDateAjout($date) { |
$observations = $this->obtenirObsLieesImg('date.ajout', $date); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image ajoutée à la date : $date"; |
} |
$sql = $this->assemblerObsEnConditionSql($observations); |
return $sql; |
} |
private function obtenirConditionPourCommentaireMeta($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.meta', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des méta-données correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaireUtilisateur($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.utilisateur', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont le commentaire des utilisateur correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
private function obtenirConditionPourCommentaires($commentaire) { |
$observations = $this->obtenirObsLieesImg('commentaire.*', $commentaire); |
if (is_null($observations)) { |
$this->debug[] = "Aucune observation n'est liée à une image dont un des commentaires correspond à : $commmentaire"; |
} |
$operateur = ''; |
$sql = $this->assemblerObsEnConditionSql($observations, $operateur); |
return $sql; |
} |
/** |
* Récupération des identifiant d'utilisateur et des ordres des observations correspondant à une date. |
* Retour sous forme de tableau : array[identifiant] = array(ordre, ordre...); |
*/ |
private function obtenirObsLieesImg($type, $param) { |
$transmission = ( $this->standard == 0) ? "transmission = '1' AND " : ""; |
// Construction de la requête |
$requete = 'SELECT DISTINCT co.id_obs, co.ce_utilisateur AS utilisateur '. |
'FROM '.$this->table_export.' AS co '. |
' LEFT JOIN cel_zones_geo AS zg '. |
' ON (zg.nom = co.zone_geo AND zg.code = co.ce_zone_geo) '. |
"WHERE ".$transmission." co.images != null". |
($type == 'date.creation' ? " AND co.date_creation LIKE $param " : ''). |
($type == 'commentaire.obs' ? " AND co.commentaire LIKE $param " : ''). |
($type == 'commentaire.*' ? " AND co.commentaire LIKE $param " : ''). |
$this->construireWhereCoordonnees(). |
$this->construireWhereDept(). |
$this->construireWhereCommune(). |
$this->construireWherePays(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereProjet(). |
$this->construireWhereTag(). |
$this->construireWhereGroupeZoneGeo(). |
'ORDER BY utilisateur ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$resultats = Cel::db()->requeter($requete); |
$observations = null; |
if ($resultats != false) { |
$observations = array(); |
foreach ($resultats as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$ordre = $occurence['id_obs']; |
if (!array_key_exists($utilisateur, $observations)) { |
$observations[$utilisateur] = array(); |
} |
if (!array_key_exists($ordre, $observations[$utilisateur])) { |
$observations[$utilisateur][$ordre] = $ordre; |
} |
} |
} |
return $observations; |
} |
private function assemblerObsEnConditionSql($observations, $operateur = 'AND') { |
$sql = ''; |
if ($observations != null) { |
// Pré-construction du where de la requête |
$tpl_where = "(identifiant = '%s' AND ordre IN (%s))"; |
foreach ($observations as $utilisateur => $ordres) { |
$morceaux_requete[] = sprintf($tpl_where, $utilisateur, implode(',', $ordres)); |
} |
if (count($morceaux_requete) > 0) { |
$sql = implode(" \nOR ", $morceaux_requete); |
} |
} else { |
// Nous voulons que la requête ne retourne rien |
$sql = "identifiant = '' AND ordre = ''"; |
} |
$sql = " $operateur ($sql) "; |
return $sql; |
} |
private function construireWhereRectangleStation() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
// ATTENTION : latitude correspond bien à la LATITUDE! |
$sql = " AND (latitude != 0 AND longitude != 0) ". |
" AND latitude > $latMin ". |
" AND latitude < $latMax ". |
" AND longitude > $lngMin ". |
" AND longitude < $lngMax "; |
} |
return $sql; |
} |
private function construireWhereRectangleStationOR() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
$sql = "( (latitude != 0 AND longitude != 0) ". |
" AND latitude BETWEEN $latMin AND $latMax ". |
" AND longitude BETWEEN $lngMin AND $lngMax )"; |
/*$sql = " MBRWithin(mon_point, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','. |
$latMax.' '.$lngMin.','. |
$latMax.' '.$lngMax.','. |
$latMax.' '.$lngMin.','. |
$latMin.' '.$lngMin."))')) "; */ |
} |
return $sql; |
} |
private function construireWhereRectangleCommune() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
/*$sql = "AND wgs84_longitude != 0 AND wgs84_latitude != 0 ". |
" AND wgs84_latitude BETWEEN $latMin AND $latMax ". |
" AND wgs84_longitude BETWEEN $lngMin AND $lngMax ";*/ |
} |
return $sql; |
} |
private function construireWhereRectangleCommuneOR() { |
$sql = ''; |
if (isset($this->parametres['ne']) && isset($this->parametres['sw']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) { |
$ne = $this->decomposerLatLng($this->parametres['ne']); |
$sw = $this->decomposerLatLng($this->parametres['sw']); |
$latMin = $sw['lat']; |
$lngMin = $sw['lng']; |
$latMax = $ne['lat']; |
$lngMax = $ne['lng']; |
/*$sql = "( wgs84_longitude != 0 AND wgs84_latitude != 0 ". |
" AND wgs84_latitude BETWEEN $latMin AND $latMax ". |
" AND wgs84_longitude BETWEEN $lngMin AND $lngMax )";*/ |
/*$sql = " MBRWithin(point_commune, GeomFromText('POLYGON((".$latMin.' '.$lngMin.','. |
$latMax.' '.$lngMin.','. |
$latMax.' '.$lngMax.','. |
$latMax.' '.$lngMin.','. |
$latMin.' '.$lngMin."))')) ";*/ |
} |
return $sql; |
} |
private function construireWhereDept() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($dept) && !$this->etreNull($dept)) { |
$valeurs_a_proteger = explode(',',trim($dept)); |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = '(dept = '.Cel::db()->quote($valeur).') '; |
} |
$valeurs = implode(' OR ', $valeurs_protegees); |
$sql = " AND ($valeurs) "; |
} |
return $sql; |
} |
private function construireWhereCommune() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['commune']) && !$this->etreNull($commune)) { |
$commune = Cel::db()->proteger($commune); |
$sql = " AND zone_geo LIKE $commune"; |
} |
if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) { |
$zonegeo = Cel::db()->proteger($zonegeo); |
$sql = " AND ce_zone_geo = $zonegeo"; |
} |
return $sql; |
} |
private function construireWherePays() { |
$sql = ''; |
extract($this->parametres); |
if (isset($this->parametres['pays']) && !$this->etreNull($pays)) { |
$pays = Cel::db()->proteger($pays); |
$sql = " AND pays = $pays"; |
} |
return $sql; |
} |
private function construireWhereCommuneSansCoordonneesAvecSensibles() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['commune']) && !$this->etreNull($commune)) { |
$commune = Cel::db()->proteger($commune); |
$sql = " AND zone_geo LIKE $commune"; |
} |
if (isset($this->parametres['zonegeo']) && !$this->etreNull($zonegeo)) { |
$zonegeo = Cel::db()->proteger($zonegeo); |
$sql = " AND ce_zone_geo = $zonegeo"; |
} |
$sql .= " AND ". |
"(". |
"(". |
"(latitude = '000null' OR latitude = '' OR latitude = 0 OR latitude IS NULL) AND ". |
"(longitude = '000null' OR longitude = '' OR longitude = 0 OR longitude IS NULL) ". |
')'. |
' OR localisation_floutage IN ("localité", "10x10km")'. |
') '; |
return $sql; |
} |
private function construireWherePhotosSeulement() { |
$sql = ''; |
if (isset($this->parametres['photos']) && $this->parametres['photos'] == 1) { |
$sql = ' AND co.images is not null '; |
} |
return $sql; |
} |
private function construireWhereUtilisateur() { |
$sql = ''; |
// TODO tester si l'on recoit un id, un mail ou bien un nom ou prenom |
// pour en faire une fonction polyvalente |
extract($this->parametres); |
if (isset($this->parametres['utilisateur']) && !$this->etreNull($utilisateur)) { |
$utilisateur = Cel::db()->proteger($utilisateur); |
if (is_numeric($this->parametres['utilisateur'])) { |
$sql = " AND co.ce_utilisateur = $utilisateur "; |
} else { |
$sql = " AND co.courriel_utilisateur = $utilisateur "; |
} |
} |
return $sql; |
} |
private function construireWhereNumTaxon() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) { |
$num_nom_ret = Cel::db()->proteger($num_nom_ret); |
$sql = " AND nom_ret_nn = $num_nom_ret "; |
} |
return $sql; |
} |
private function construireWhereNumTaxonAvecSousTaxons() { |
$sql = ''; |
// Récupération des coordonnées depuis l'id station |
extract($this->parametres); |
if (isset($this->parametres['num_nom_ret']) && !$this->etreNull($num_nom_ret)) { |
$sous_taxons = $this->obtenirSousTaxons($this->parametres['num_nom_ret']); |
$num_nom_retenu = Cel::db()->proteger($num_nom_ret); |
if(!empty($sous_taxons)) { |
$sql_in_sous_tax = implode(',', $sous_taxons); |
$sql = " AND (nom_sel_nn IN (".$num_nom_retenu.', '.$sql_in_sous_tax.") OR ". |
"nom_ret_nn IN (".$num_nom_retenu.', '.$sql_in_sous_tax.") ". |
") "; |
} |
else { |
$sql = " AND nom_ret_nn = $num_nom_ret "; |
} |
} |
return $sql; |
} |
private function obtenirSousTaxons($nt) { |
$referentiel = 'bdtfx'; |
if(isset($this->parametres['referentiel']) && $this->parametres['referentiel'] != "" && $this->parametres['referentiel'] != '*') { |
$referentiel = $this->parametres['referentiel']; |
} |
$nn_sous_taxons = array(); |
$sous_taxons = $this->obtenirSousTaxonsPourNn($referentiel, $nt); |
foreach($sous_taxons as $sous_tax) { |
$nn_sous_taxons[] = $sous_tax['num_nom']; |
} |
return $nn_sous_taxons; |
} |
private function construireWhereProjet() { |
$sql = ''; |
extract($this->parametres); |
$projet_sql = isset($projet) ? $this->getSqlWhereProjet($projet) : null; |
if (!$this->etreNull($projet_sql)) { |
$sql = " AND ($projet_sql) "; |
} |
return $sql; |
} |
/** |
* Traitement de $projet pour construction du filtre dans la requête |
* |
* projet1 ET projet2 ET projet3 => intersection |
* projet1 OU projet2 OU projet3 => union |
* projet1 ET projet2 OU projet3 => ATTENTION indéfini |
*/ |
private function getSqlWhereProjet($projet) { |
$sql = null; |
if (isset($projet) && !$this->etreNull($projet)) { |
if (strpos($projet, ' ET ')) { |
// intersection |
$projets = explode(' ET ', $projet); |
$clauses = array(); |
foreach ($projets as $proj) { |
if ($proj != '') { |
$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%'); |
} |
} |
$sql = implode($clauses, ' AND '); |
} else if (strpos($projet, ' OU ')) { |
// union |
$projets = explode(' OU ', $projet); |
$clauses = array(); |
foreach ($projets as $proj) { |
if ($proj != '') { |
$clauses[] = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$proj.'%'); |
} |
} |
$sql = implode($clauses, ' OR '); |
} else { |
// simple |
$sql = 'co.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$projet.'%'); |
} |
} |
return $sql; |
} |
private function construireWhereTag() { |
$sql = ''; |
extract($this->parametres); |
$tag_sql = isset($tag) ? $this->getSqlWhereObsAvecImagesTaguees($tag) : null; |
if (!$this->etreNull($tag_sql)) { |
$sql = " AND ($tag_sql) "; |
} |
return $sql; |
} |
private function construireWhereNombreDeJours() { |
$sql = null; |
extract($this->parametres); |
if (isset($nbjours) && !$this->etreNull($nbjours)) { |
$sql = ' AND DATEDIFF(CURDATE(),co.date_creation) <= '.Cel::db()->proteger($nbjours).' '; |
} |
return $sql; |
} |
private function construireWhereAnnee() { |
$sql = null; |
extract($this->parametres); |
if (isset($annee) && !$this->etreNull($annee)) { |
$sql = ' AND YEAR(co.date_creation) = ' . Cel::db()->proteger($annee) . ' '; |
} |
return $sql; |
} |
private function construireWhereGroupeZoneGeo() { |
$sql = null; |
extract($this->parametres); |
if (isset($groupe_zones_geo) && !$this->etreNull($groupe_zones_geo)) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = 'AND ce_zone_geo IN ('.implode(',', $zones).') '; |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereObsAvecImagesTaguees($tag) { |
$sql = null; |
$transmission = ( $this->standard == 0) ? "co.transmission = '1' " : " 1 "; |
if (isset($tag) && !$this->etreNull($tag)) { |
$tag_sql = $this->getSqlWhereMotsCles($tag); |
// Construction de la requête |
$requete = 'SELECT DISTINCT co.id_observation AS id_obs, co.ce_utilisateur AS utilisateur '. |
'FROM cel_images_export ci'. |
' INNER JOIN '.$this->table_export.' AS co '. |
' ON (ci.ce_observation = co.id_observation) '. |
' LEFT JOIN cel_zones_geo AS zg '. |
" ON (zg.nom = co.zone_geo AND zg.code = co.ce_zone_geo) ". |
"WHERE ".$transmission. |
$this->construireWhereCoordonnees(). |
$this->construireWhereUtilisateur(). |
$this->construireWhereNumTaxon(). |
$this->construireWhereNomTaxon(). |
$this->construireWhereReferentiel(). |
$this->construireWhereProjet(). |
(!$this->etreNull($tag_sql) ? "AND ($tag_sql) " : ''). |
'ORDER BY utilisateur ASC'; |
//$this->debug[] = $requete; |
//die($requete); |
$elements_tag = Cel::db()->requeter($requete); |
$requete_tag = array(); |
if ($elements_tag != false && count($elements_tag) > 0) { |
$filtres = array(); |
foreach ($elements_tag as $occurence) { |
$utilisateur = $occurence['utilisateur']; |
$id_obs = $occurence['id_obs']; |
if (!array_key_exists($utilisateur, $filtres)) { |
$filtres[$utilisateur] = array(); |
} |
if (!array_key_exists($id_obs, $filtres[$utilisateur])) { |
$filtres[$utilisateur][$id_obs] = $id_obs; |
} |
} |
// Pré-construction du where de la requête |
$tpl_where = "(id_observation IN (%s))"; |
foreach ($filtres as $utilisateur => $id_obs) { |
$requete_tag[] = sprintf($tpl_where, implode(',', $id_obs)); |
} |
} else { |
$this->messages[] = "Aucune observation ne possède d'images avec ce mot-clé."; |
} |
if (count($requete_tag) > 0) { |
$sql = implode(" \nOR ", $requete_tag); |
} |
} |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsCles($tag) { |
$sql = null; |
$mots_cles = $this->decomposerParametreTag($tag); |
$requete_projet = $this->getSqlWhereMotsClesImages($mots_cles); |
$sql = $requete_projet; |
//$this->debug[] = $sql; |
return $sql; |
} |
/** |
* Traitement de $tag pour construction du filtre dans la requête |
*/ |
private function getSqlWhereMotsClesImages($mots_cles_encodes) { |
$where_mots_cles_images = array(); |
foreach ($mots_cles_encodes['motsClesEncodesProteges'] as $mot_cle_encode) { |
$where_mots_cles_images[] = "ci.mots_cles_texte LIKE $mot_cle_encode"; |
} |
$where_mots_cles_images = implode(' '.$mots_cles_encodes['type'].' ', $where_mots_cles_images); |
return $where_mots_cles_images; |
} |
private function decomposerParametreTag($tags) { |
$mots_cles = array('type' => null, 'motsCles' => null, 'motsClesEncodesProteges' => null); |
if (preg_match('/.+OU.+/', $tags)) { |
$mots_cles['type'] = 'OR'; |
$mots_cles['motsCles'] = explode('OU', $tags); |
} else if (preg_match('/.+ET.+/', $tags)) { |
$mots_cles['type'] = 'AND'; |
$mots_cles['motsCles'] = explode('ET', $tags); |
} else { |
$mots_cles['motsCles'][] = $tags; |
} |
foreach ($mots_cles['motsCles'] as $mot) { |
$mots_cles['motsClesEncodesProteges'][] = Cel::db()->quote('%'.$mot.'%'); |
} |
$this->debug[] = $mots_cles; |
return $mots_cles; |
} |
private function decomposerLatLng($coord) { |
$lat_lng = array(); |
if (isset($coord)) { |
list($lat, $lng) = explode('|', $coord); |
$lat_lng = array('lat' => $lat, 'lng' => $lng); |
} |
return $lat_lng; |
} |
private function decomposerParametreStation() { |
$station_infos = array(); |
if (isset($this->parametres['station'])) { |
$station = $this->parametres['station']; |
$this->debug[] = $station; |
@list($type, $coord) = explode(':', $station); |
@list($lat, $lng) = explode('|', $coord); |
$station_infos = array('type' => $type, 'lat' => $lat, 'lng' => $lng); |
} |
return $station_infos; |
} |
private function decomposerParametreDate() { |
$date_infos = array(null,null); |
if (isset($this->parametres['date'])) { |
$date = $this->parametres['date']; |
if (strpos($date, ':')) { |
list($type, $date) = explode(':', $date); |
} else { |
$type = 'observation'; |
} |
$date = str_replace('/', '-', $date); |
if (preg_match('/(^[0-9]{2})-([0-9]{2})-([0-9]{4}$)/', $date, $matches)) { |
$date = $matches[3].'-'.$matches[2].'-'.$matches[1]; |
} |
$date_infos = array($type, $date); |
} |
return $date_infos; |
} |
private function decomposerParametreTaxon() { |
$nom_infos = array(null,null); |
if (isset($this->parametres['taxon'])) { |
$taxon = $this->parametres['taxon']; |
if (strpos($taxon, ':')) { |
$nom_infos = explode(':', $taxon); |
} else { |
$nom_infos = array('retenu', $taxon); |
} |
} |
return $nom_infos; |
} |
private function decomposerParametreCommentaire() { |
$commentaire_infos = array(null,null); |
if (isset($this->parametres['commentaire'])) { |
$commentaire = $this->parametres['commentaire']; |
if (strpos($commentaire, ':')) { |
$commentaire_infos = explode(':', $commentaire); |
} else { |
$commentaire_infos = array('observation', $commentaire); |
} |
} |
return $commentaire_infos; |
} |
} |
?> |
/trunk/jrest/services/CelSyndicationObservation.php |
---|
29,571 → 29,571 |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
class CelSyndicationObservation extends Cel { |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $criteres = array( |
'utilisateur' => 'courriel_utilisateur', |
'commune' => 'zone_geo', |
'dept' => 'ce_zone_geo', |
'taxon' => 'nom_ret', |
'num_taxon' => 'nt', |
'commentaire' => 'commentaire', |
'date' => 'date_observation', |
'motcle' => 'tags', |
'standard' => 'donnees_standard', |
'projet' => 'mots-cles', |
'groupe_zones_geo' => 'groupe_zones_geo'); |
private $catalogue_cles_labels_champs_etendus = array(); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
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); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$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(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$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(); |
$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)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
private function getTypeMime() { |
$mime = ''; |
$test = isset($this->format) ? $this->format : $this->service; |
switch ($test) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->getUrlBase(); |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$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', |
'Ce flux fournit des informations sur les observations du CEL.'); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ". |
"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; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Obs - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$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').' * '. |
'FROM cel_export_total '. |
(($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 = Cel::db()->requeter($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limit = $_GET['limite']; |
$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus ! |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_export_total '. |
'WHERE 1 AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND '); |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$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 : |
'date_modification DESC, zone_geo ASC').' '. |
"LIMIT $this->start,$this->limit "; |
$elements = Cel::db()->requeter($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// déclenche une erreur 500 à tort; ne pas faire ça |
//$this->messages[] = "Aucune observation disponible."; |
} |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $criteres = array( |
'utilisateur' => 'courriel_utilisateur', |
'commune' => 'zone_geo', |
'dept' => 'ce_zone_geo', |
'taxon' => 'nom_ret', |
'num_taxon' => 'nt', |
'commentaire' => 'commentaire', |
'date' => 'date_observation', |
'motcle' => 'tags', |
'standard' => 'donnees_standard', |
'projet' => 'mots-cles', |
'groupe_zones_geo' => 'groupe_zones_geo'); |
private $catalogue_cles_labels_champs_etendus = array(); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
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); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$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(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$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(); |
$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)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
private function getTypeMime() { |
$mime = ''; |
$test = isset($this->format) ? $this->format : $this->service; |
switch ($test) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->getUrlBase(); |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$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', |
'Ce flux fournit des informations sur les observations du CEL.'); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles observations publiques du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles observations du CEL filtrées par ". |
"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; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Obs - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$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 creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break; |
case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
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].'='.Cel::db()->quote($nom_valeur[1]).' AND '; break; |
case "ce_zone_geo" : |
$requete .= ' ('.$nom_valeur[0].' LIKE "INSEE-C:'.$nom_valeur[1].'%") AND '; break; |
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]).' AND '; break; |
case "tags" : $requete .= $this->creerSousRequeteTags($nom_valeur[1]).' AND '; break; |
case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = '(ce_zone_geo IN ('.implode(',', $zones).')) '; |
return $sql; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').') '; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteTags($tag) { |
$requete = '(id_observation IN (SELECT ce_observation FROM cel_images ci WHERE '; |
$where = ''; |
if (preg_match('/.*OU.*/', $tag)) { |
$mots_cles_tab = explode('OU',$tag); |
foreach($mots_cles_tab as $mot_cle_item) { |
$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$where .= '('.rtrim($where,'OR ').') '; |
} else if (preg_match('/.*ET.*/', $tag)) { |
$mots_cles_tab = explode('ET',$tag); |
foreach($mots_cles_tab as $mot_cle_item) { |
$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$where .= '('.rtrim($where, 'AND ').') '; |
} else { |
$where .= "(ci.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$tag.'%').') '; |
} |
$requete .= $where.' ))'; |
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; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'ce_zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '. |
' OR '. |
'courriel_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'mots_cles_texte LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
private function executerService($elements) { |
$contenu = ''; |
if (is_array($elements)) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
$ids_observations = array(); |
foreach ($elements as $element) { |
$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur']; |
$ids_observations[] = $element['id_observation']; |
} |
$gestion_obs_etendus = new GestionChampsEtendus($this->config, 'obs'); |
$gestion_champs_etendus = new GestionChampsEtendus2($this->config); |
$champs_etendus = $gestion_obs_etendus->consulterParLots($ids_observations); |
if(!empty($champs_etendus)) { |
$this->catalogue_cles_labels_champs_etendus = $gestion_champs_etendus->consulterCatalogueChampsEtendusPredefinis(true); |
// afin de simplifier les erreurs de majuscules et minuscules |
$this->catalogue_cles_labels_champs_etendus = array_change_key_case($this->catalogue_cles_labels_champs_etendus); |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$element['obs_etendue'] = isset($champs_etendus[$element['id_observation']]) ? $champs_etendus[$element['id_observation']] : array(); |
$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(); |
$donnees['titre'] = 'Flux des observations du CEL'; |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu']; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($observations); |
$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($observation) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation'])); |
$item['titre'] = $this->creerTitre($observation); |
$item['guid'] = $this->creerGuidItem($observation); |
$item['lien'] = $this->creerLienItem($observation); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($observation), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item)); |
$item['modifier_par'] = $this->nettoyerTexte($observation['id_observation']); |
return $item; |
} |
private function creerTitre($obs) { |
$date = ($obs['date_observation'] != '0000-00-00 00:00:00') ? 'le '.date("d/m/Y", strtotime($obs['date_observation'])) : '' ; |
$nom_plante = $obs['nom_sel'].' [nn'.$obs['nom_sel_nn'].']'; |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($obs); |
$utilisateur = $this->getIntituleAuteur($obs['courriel_utilisateur']); |
$titre = "$nom_plante à $lieu par $utilisateur $date"; |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerGuidItem($element) { |
$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id_observation']); |
return $guid; |
} |
private function creerLienItem($element) { |
$lien = null; |
if ($element['nom_sel_nn'] != 0) { |
$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'cel'); |
} |
return $lien; |
} |
private function creerDescription($obs, $item) { |
$id_obs = $obs['id_observation']; |
$famille = $obs['famille']; |
$nom_saisi = $obs['nom_sel']; |
$nom_retenu = $obs['nom_ret']; |
$auteur = $this->getIntituleAuteur($obs['courriel_utilisateur']); |
$auteur_mail = $obs['courriel_utilisateur']; |
$mots_cles_obs = $obs['mots_cles_texte']; |
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id_observation']); |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($obs).' > '.$obs['lieudit'].' > '.$obs['station']; |
$milieu = $obs['milieu']; |
$coordonnees = ($this->etreNull($obs['latitude']) && $this->etreNull($obs['longitude'])) ? '' : $obs['latitude'].'/'.$obs['longitude']; |
$commentaire = $obs['commentaire']; |
$date_observation = ($obs['date_observation'] != '0000-00-00 00:00:00') ? $this->formaterDate($obs['date_observation'], '%A %d %B %Y') : ''; |
$date_transmission = $this->formaterDate($obs['date_transmission']); |
$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>'. |
'<li>'.'Nom saisi : '.$nom_saisi.'</li>'. |
'<li>'.'Nom retenu : '.$nom_retenu.'</li>'. |
'<li>'.'Observée le : '.$date_observation.'</li>'. |
'<li>'.'Lieu : '.$lieu.'</li>'. |
'<li>'.'Milieu : '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : ''). |
'<li>'.'Commentaire : '.$this->nePasInterpreterXml($commentaire).'</li>'. |
'<li>'.'Mots-clés : '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : ''). |
'<li>Modifiée le : '.$date_modification.'</li>'. |
'<li>Créée le : '.$date_creation.'</li>'. |
'<li>'.'Par : '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
$this->creerDescriptionChampsEtendus($obs, $item). |
(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : ''). |
'</ul>'; |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerDescriptionChampsEtendus($obs, $item) { |
$champs_etendus = ''; |
foreach($obs['obs_etendue'] as $cle => &$champ) { |
if($this->doitAfficherChampEtendu($champ->cle, $this->catalogue_cles_labels_champs_etendus)) { |
if(isset($this->catalogue_cles_labels_champs_etendus[$champ->cle])) { |
$label = $this->catalogue_cles_labels_champs_etendus[$champ->cle]['label']; |
} else { |
$label = preg_replace("/(?<=\\w)(?=[A-Z])/"," $1", $champ->cle); |
$label = trim($label); |
$label = $label; |
} |
$champs_etendus .= '<li>'.$this->nePasInterpreterXml($label.' : '.$champ->valeur).' </li>'; |
} |
} |
if($champs_etendus != '') { |
$champs_etendus = '<li> Champs supplémentaires : <ul>'.$champs_etendus.'</ul></li>'; |
} |
return $champs_etendus; |
} |
private function doitAfficherChampEtendu($cle, $catalogue) { |
// Suppression des nombres à la fin de la chaines dans le cas des clés |
// "multiples" et mise en minuscule |
$cle_simplifiee = preg_replace("/\d+$/","",$cle); |
$cle_simplifiee = strtolower(rtrim($cle_simplifiee, ":")); |
// Un champ est affichable s'il n'est pas au catalogue ou bien |
// s'il n'est pas marqué privé dans celui-ci |
$affichable = !isset($catalogue[$cle_simplifiee]) || |
$catalogue[$cle_simplifiee]['options']['prive'] != 1; |
return $affichable; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Observation'; |
$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) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
private function getIntituleAuteur($courriel) { |
$courriel = strtolower($courriel); |
if(isset($this->auteurs[$courriel])) { |
$intitule = $this->auteurs[$courriel]; |
} else { |
$intitule = $courriel; |
} |
return $intitule; |
} |
} |
private function getServiceParDefaut() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_export_total '. |
(($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 = Cel::db()->requeter($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limit = $_GET['limite']; |
$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus ! |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '. |
'FROM cel_export_total '. |
'WHERE 1 AND '.(($this->etreFluxAdmin()) ? '' : ' transmission = 1 AND '); |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$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 : |
'date_modification DESC, zone_geo ASC').' '. |
"LIMIT $this->start,$this->limit "; |
$elements = Cel::db()->requeter($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// déclenche une erreur 500 à tort; ne pas faire ça |
//$this->messages[] = "Aucune observation disponible."; |
} |
return $contenu; |
} |
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break; |
case "commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
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].'='.Cel::db()->quote($nom_valeur[1]).' AND '; break; |
case "ce_zone_geo" : |
$requete .= ' ('.$nom_valeur[0].' LIKE "'.$nom_valeur[1].'%") AND '; break; |
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]).' AND '; break; |
case "tags" : $requete .= $this->creerSousRequeteTags($nom_valeur[1]).' AND '; break; |
case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = '(ce_zone_geo IN ('.implode(',', $zones).')) '; |
return $sql; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').') '; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteTags($tag) { |
$requete = '(id_observation IN (SELECT ce_observation FROM cel_images ci WHERE '; |
$where = ''; |
if (preg_match('/.*OU.*/', $tag)) { |
$mots_cles_tab = explode('OU',$tag); |
foreach($mots_cles_tab as $mot_cle_item) { |
$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$where .= '('.rtrim($where,'OR ').') '; |
} else if (preg_match('/.*ET.*/', $tag)) { |
$mots_cles_tab = explode('ET',$tag); |
foreach($mots_cles_tab as $mot_cle_item) { |
$where .= '(ci.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$where .= '('.rtrim($where, 'AND ').') '; |
} else { |
$where .= "(ci.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$tag.'%').') '; |
} |
$requete .= $where.' ))'; |
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; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'ce_zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'ce_zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'courriel_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'mots_cles_texte LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
private function executerService($elements) { |
$contenu = ''; |
if (is_array($elements)) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
$ids_observations = array(); |
foreach ($elements as $element) { |
$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur']; |
$ids_observations[] = $element['id_observation']; |
} |
$gestion_obs_etendus = new GestionChampsEtendus($this->config, 'obs'); |
$gestion_champs_etendus = new GestionChampsEtendus2($this->config); |
$champs_etendus = $gestion_obs_etendus->consulterParLots($ids_observations); |
if(!empty($champs_etendus)) { |
$this->catalogue_cles_labels_champs_etendus = $gestion_champs_etendus->consulterCatalogueChampsEtendusPredefinis(true); |
// afin de simplifier les erreurs de majuscules et minuscules |
$this->catalogue_cles_labels_champs_etendus = array_change_key_case($this->catalogue_cles_labels_champs_etendus); |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$element['obs_etendue'] = isset($champs_etendus[$element['id_observation']]) ? $champs_etendus[$element['id_observation']] : array(); |
$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(); |
$donnees['titre'] = 'Flux des observations du CEL'; |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = $this->config['settings']['baseURLAbsolu']; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($observations); |
$date_modification_timestamp = strtotime($derniere_info_en_date['date_modification']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationObservation'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($observation) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($observation['date_modification']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['date_creation_simple'] = strftime('%A %d %B %Y à %H:%M', strtotime($observation['date_creation'])); |
$item['titre'] = $this->creerTitre($observation); |
$item['guid'] = $this->creerGuidItem($observation); |
$item['lien'] = $this->creerLienItem($observation); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($observation), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($observation, $item)); |
$item['modifier_par'] = $this->nettoyerTexte($observation['id_observation']); |
return $item; |
} |
private function creerTitre($obs) { |
$date = ($obs['date_observation'] != '0000-00-00 00:00:00') ? 'le '.date("d/m/Y", strtotime($obs['date_observation'])) : '' ; |
$nom_plante = $obs['nom_sel'].' [nn'.$obs['nom_sel_nn'].']'; |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($obs); |
$utilisateur = $this->getIntituleAuteur($obs['courriel_utilisateur']); |
$titre = "$nom_plante à $lieu par $utilisateur $date"; |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerGuidItem($element) { |
$guid = sprintf($this->config['settings']['guidObsTpl'], $element['id_observation']); |
return $guid; |
} |
private function creerLienItem($element) { |
$lien = null; |
if ($element['nom_sel_nn'] != 0) { |
$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'cel'); |
} |
return $lien; |
} |
private function creerDescription($obs, $item) { |
$id_obs = $obs['id_observation']; |
$famille = $obs['famille']; |
$nom_saisi = $obs['nom_sel']; |
$nom_retenu = $obs['nom_ret']; |
$auteur = $this->getIntituleAuteur($obs['courriel_utilisateur']); |
$auteur_mail = $obs['courriel_utilisateur']; |
$mots_cles_obs = $obs['mots_cles_texte']; |
$lien_correction = sprintf($this->config['settings']['phpEditUrlTpl'], $obs['id_observation']); |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($obs).' > '.$obs['lieudit'].' > '.$obs['station']; |
$milieu = $obs['milieu']; |
$coordonnees = ($this->etreNull($obs['latitude']) && $this->etreNull($obs['longitude'])) ? '' : $obs['latitude'].'/'.$obs['longitude']; |
$commentaire = $obs['commentaire']; |
$date_observation = ($obs['date_observation'] != '0000-00-00 00:00:00') ? $this->formaterDate($obs['date_observation'], '%A %d %B %Y') : ''; |
$date_transmission = $this->formaterDate($obs['date_transmission']); |
$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>'. |
'<li>'.'Nom saisi : '.$nom_saisi.'</li>'. |
'<li>'.'Nom retenu : '.$nom_retenu.'</li>'. |
'<li>'.'Observée le : '.$date_observation.'</li>'. |
'<li>'.'Lieu : '.$lieu.'</li>'. |
'<li>'.'Milieu : '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Coordonnées (Lat/Long) : '.$coordonnees.'</li>' : ''). |
'<li>'.'Commentaire : '.$this->nePasInterpreterXml($commentaire).'</li>'. |
'<li>'.'Mots-clés : '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li>Transmis (= public) : '.$transmission.'</li>' : ''). |
'<li>Modifiée le : '.$date_modification.'</li>'. |
'<li>Créée le : '.$date_creation.'</li>'. |
'<li>'.'Par : '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
$this->creerDescriptionChampsEtendus($obs, $item). |
(($this->etreFluxAdmin()) ? '<li><a href="'.$lien_correction.'">Corriger cette observation</a></li>' : ''). |
'</ul>'; |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerDescriptionChampsEtendus($obs, $item) { |
$champs_etendus = ''; |
foreach($obs['obs_etendue'] as $cle => &$champ) { |
if($this->doitAfficherChampEtendu($champ->cle, $this->catalogue_cles_labels_champs_etendus)) { |
if(isset($this->catalogue_cles_labels_champs_etendus[$champ->cle])) { |
$label = $this->catalogue_cles_labels_champs_etendus[$champ->cle]['label']; |
} else { |
$label = preg_replace("/(?<=\\w)(?=[A-Z])/"," $1", $champ->cle); |
$label = trim($label); |
$label = $label; |
} |
$champs_etendus .= '<li>'.$this->nePasInterpreterXml($label.' : '.$champ->valeur).' </li>'; |
} |
} |
if($champs_etendus != '') { |
$champs_etendus = '<li> Champs supplémentaires : <ul>'.$champs_etendus.'</ul></li>'; |
} |
return $champs_etendus; |
} |
private function doitAfficherChampEtendu($cle, $catalogue) { |
// Suppression des nombres à la fin de la chaines dans le cas des clés |
// "multiples" et mise en minuscule |
$cle_simplifiee = preg_replace("/\d+$/","",$cle); |
$cle_simplifiee = strtolower(rtrim($cle_simplifiee, ":")); |
// Un champ est affichable s'il n'est pas au catalogue ou bien |
// s'il n'est pas marqué privé dans celui-ci |
$affichable = !isset($catalogue[$cle_simplifiee]) || |
$catalogue[$cle_simplifiee]['options']['prive'] != 1; |
return $affichable; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Observation'; |
$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) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
private function getIntituleAuteur($courriel) { |
$courriel = strtolower($courriel); |
if(isset($this->auteurs[$courriel])) { |
$intitule = $this->auteurs[$courriel]; |
} else { |
$intitule = $courriel; |
} |
return $intitule; |
} |
} |
/trunk/jrest/services/CelWidgetManager.php |
---|
136,7 → 136,7 |
$projet = (isset($_GET['projet'])) ? $_GET['projet'] : ""; |
$langue = (isset($_GET['langue'])) ? $_GET['langue'] : "fr"; |
$liste = $champs->consulterProjetChampsEtendus($projet, $langue); |
$liste = $this->traiterCorrespondanceChampsEtendusBDInterface($liste); |
$liste = $this->traiterCorrespondanceChampsEtendusBDInterface($liste, $projet); |
$this->envoyerJson($liste); |
} |
213,25 → 213,25 |
} |
return $champsrequete; |
} |
protected function traiterCorrespondanceChampsEtendusBDInterface(Array $champsrequete) { |
protected function traiterCorrespondanceChampsEtendusBDInterface(Array $champsrequete, $projet = "null") { |
$champssupp = array(); $i = 0; |
foreach ($champsrequete as $champ) { |
$champssupp[$champ['project']]['projet'] = $champ['project']; |
$champssupp[$champ['project']]['langue'] = $champ['language_iso_code']; |
$champssupp[$projet]['projet'] = $champ['project']; |
$champssupp[$projet]['langue'] = $champ['language_iso_code']; |
// pour la table extended fiels champs interface => champs bd |
foreach ($this->correspondance_champs_etendus as $ci => $ce) { |
if (isset($champ[$ce]) && $champ[$ce] != "") { |
$champssupp[$champ['project']]['champs-supp'][$i][$ci] = $champ[$ce]; |
$champssupp[$projet]['champs-supp'][$i][$ci] = $champ[$ce]; |
} else { |
$champssupp[$champ['project']]['champs-supp'][$i][$ci]= ""; |
$champssupp[$projet]['champs-supp'][$i][$ci]= ""; |
} |
} |
// pour la table extended fiels trad champs interface => champs bd |
foreach ($this->correspondance_champs_etendus_trad as $cet => $cr) { |
if (isset($champ[$cr]) && $champ[$cr] != "") { |
$champssupp[$champ['project']]['champs-supp'][$i][$cet]= $champ[$cr]; |
$champssupp[$projet]['champs-supp'][$i][$cet]= $champ[$cr]; |
} else { |
$champssupp[$champ['project']]['champs-supp'][$i][$cet]=""; |
$champssupp[$projet]['champs-supp'][$i][$cet]=""; |
} |
}$i++; |
} |
/trunk/jrest/services/CelWidgetSaisie.php |
---|
43,7 → 43,7 |
} else if (array_key_exists('projet', $requeteDonnees)) { |
$this->debug[] = 'Projet : '.$requeteDonnees['projet']; |
if ($requeteDonnees['projet'] != "base") { |
$this->projet = $requeteDonnees['projet']; |
$this->projet = $requeteDonnees['projet'] ?? null; |
$this->projetId = $requeteDonnees['id_projet'] ?? null; |
} |
125,6 → 125,8 |
'coordinates' => [ (float)$obs['longitude'], (float)$obs['latitude'] ] |
]); // CONCAT('{\"type\":\"Point\",\"coordinates\":[', longitude, ',', latitude,']}'), |
$obsAAjouter['geodatum'] = 'WGS84'; |
$obsAAjouter['published_location'] = ($this->tagsObs != null && in_array('sensible', $this->tagsObs) == true) ? |
"localité" : "précise"; |
$obsAAjouter['phenology'] = isset($obs['phenologie']) ? $obs['phenologie'] : null; |
$obsAAjouter['coef'] = isset($obs['abondance']) ? $obs['abondance'] : null; |
137,7 → 139,7 |
$obsAAjouter['image_nom'] = $obs['image_nom'] ?? null; |
$obsAAjouter['image_b64'] = $obs['image_b64'] ?? null; |
$obsAAjouter['certainty'] = ''; |
$obsAAjouter['certainty'] = null; |
if (isset($obs['certitude'])) { |
switch ($obs['certitude']) { |
case 'certaine': |
151,9 → 153,11 |
break; |
} |
} |
$obsAAjouter['certainty'] = ($this->projet == "aDeterminer") ? 'à déterminer' : $obsAAjouter['certainty']; |
$obsAAjouter['input_source'] = 'widget'; |
$obsAAjouter['project_id'] = $this->projetId; |
$obsAAjouter['project'] = $this->projet; |
// racommodage en attendant mieux |
$obsAAjouter['project'] = ($this->projetId == null) ? null : ($this->projetId == 53) ? "missions-flore" : $this->projet ; |
if ($this->isFromPlantNet) { |
$obsAAjouter['input_source'] = 'PlantNet'; |
$obsAAjouter['plantnet_id'] = $obs['obs_id']; |
663,6 → 667,7 |
private function traiterNomFichierImage($fichierNom) { |
$fichierNom = preg_replace('/[.](jpeg|jpg)$/i', '.jpg', strtolower(trim($fichierNom))); |
return $fichierNom; |
} |
749,7 → 754,7 |
$requete = $this->construireRequeteInsertionImage($infosImage); |
$resultat = Cel::db()->executer($requete); |
if ($resultat !== false) { |
$idImage = $this->traiterEtRecupererIdImage($nomFichierImage); |
$idImage = $this->traiterEtRecupererIdImage($nomFichierImage, $id_obs); |
if ($idImage !== false) { |
$infosImage['url'] = 'https://api.tela-botanica.org/img:'.str_pad($idImage, 9, '0', STR_PAD_LEFT).'O'; |
799,14 → 804,13 |
return $ok; |
} |
private function traiterEtRecupererIdImage($original_name) { |
$id_utilisateur = Cel::db()->proteger($this->userId); |
$email_utilisateur = Cel::db()->proteger($this->userEmail); |
private function traiterEtRecupererIdImage($original_name, $id_obs) { |
$original_name = Cel::db()->proteger($original_name); |
$id_obs = Cel::db()->proteger($id_obs); |
$requete = 'SELECT id '. |
'FROM photo '. |
"WHERE (user_id = $id_utilisateur OR user_email = $email_utilisateur)". |
"WHERE occurrence_id = ".$id_obs. |
" AND original_name = $original_name "; |
$resultat = Cel::db()->requeter($requete); |
$id_image = $resultat[0]['id'] ?? false; |
/trunk/jrest/services/CelSyndicationImage.php |
---|
2,7 → 2,7 |
// declare(encoding='UTF-8'); |
/** |
* Service fournissant des informations concernant les images du CEL au format RSS1, RSS2 ou ATOM. |
* |
* @internal Mininum PHP version : 5.2 |
* @category CEL |
17,709 → 17,713 |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org> |
*/ |
class CelSyndicationImage extends Cel { |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $format_image = 'XL'; |
private $criteres = array( |
'utilisateur' => 'b.courriel_utilisateur', |
'commune' => 'b.zone_geo', |
'dept' => 'b.dept', |
'taxon' => 'b.nom_ret', |
'num_taxon' => 'b.nt', |
'num_nom' => 'b.nom_sel_nn', |
'commentaire' => 'c.commentaire', |
'date' => 'c.date_prise_de_vue', |
'tag' => 'tag', |
'motcle' => 'tag', |
'projet' => 'projet', |
'referentiel' => 'referentiel', |
'groupe_zones_geo' => 'groupe_zones_geo', |
'standard' => 'donnees_standard' |
); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
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); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$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 deux premiers paramètres (service et format) pour le reste des méthodes |
array_shift($this->parametres); |
array_shift($this->parametres); |
// Récupération du contenu à renvoyer |
$contenu = $this->$methode(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé."; |
} |
} |
// Envoie sur la sortie standard |
$encodage = 'utf-8'; |
$mime = $this->getTypeMime(); |
$formatage_json = $this->getFormatageJson(); |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
private function chargerListeDesFlux() { |
$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL', |
"Ce flux fournit l'url des nouvelles images du CEL liées à une observation."); |
$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)', |
"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation."); |
$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'."); |
$this->setFlux('par-commune','Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'."); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ". |
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ". |
"et/ou date."); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/'; |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux); |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function traiterNomService($nom) { |
$nom = strtolower($nom); |
return $nom; |
} |
private function getNomMethodeService() { |
$methode = ''; |
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
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 getTypeMime() { |
$mime = ''; |
switch ($this->format) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Image'; |
$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) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) { |
$infos = null; |
try { |
$infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($infos === false) { |
$this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete"; |
} |
} catch (PDOException $e) { |
$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; |
$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $infos; |
} |
private function executerService($elements) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
foreach ($elements as $element) { |
$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur']; |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element); |
} |
// Création du contenu à partir d'un template PHP |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function construireDonneesCommunesAuFlux($infos) { |
$donnees = $this->getFlux($this->service); |
$donnees['guid'] = $this->getUrlServiceBase(); |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ? |
$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : ''; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($infos); |
$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($info) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['titre'] = $this->creerTitre($info); |
$item['guid'] = $this->creerGuidItem($info); |
$item['lien'] = $this->creerLienItem($info); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item)); |
$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur'])); |
return $item; |
} |
private function creerGuidItem($element) { |
$guid = $this->getUrlImage($element['id_image']); |
return $guid; |
} |
private function creerTitre($element) { |
$methode = 'creerTitre'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple'; |
$titre = $this->$methode($element); |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerDescription($donnees, $item) { |
$methode = 'creerDescription'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet'; |
$description = $this->$methode($donnees, $item); |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerLienItem($element) { |
if ($this->etreNull($element['id_observation'])) { |
// Lien vers image grand format |
$lien = $this->getUrlImage($element['id_image'], $this->format_image); |
} else { |
// Lien vers fiche eFlore onglet Illustration |
$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration'); |
} |
return $lien; |
} |
private function getServiceListeDesFlux() { |
return $this->flux; |
} |
private function getServiceOpml() { |
$donnees = array(); |
$id = 1; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Images - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$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 getServiceSimple() { |
if (isset($this->parametres[0])) { |
$this->format_image = $this->parametres[0]; |
} |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '. |
' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '. |
' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '. |
'FROM cel_export_total AS co LEFT JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '. |
'WHERE co.transmission = 1 '. |
' AND co.ce_utilisateur = ci.ce_utilisateur '. |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci.date_creation DESC').' '. |
"LIMIT $this->start, $this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function creerTitreSimple($element) { |
$date = $element['date_observation']; |
$date = date("d/m/Y", strtotime($date)); |
if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) { |
$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date; |
} else { |
$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date; |
} |
$zoneGeo = $element['zone_geo']; |
if ($zoneGeo) { |
$titre .= " - $zoneGeo"; |
} |
return $titre; |
} |
private function creerDescriptionSimple($donnees, $item) { |
$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration'); |
return $description; |
} |
private function getServiceComplet() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '. |
' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '. |
' co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '. |
' co.commentaire AS commentaire_obs '. |
'FROM cel_images_export AS ci '. |
' LEFT JOIN cel_export_total AS co '. |
' ON (ci.ce_observation = co.id_observation) '. |
(($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 '). |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci.date_creation DESC').' '. |
"LIMIT $this->start, $this->limit "; |
//echo $requete; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// ne pas faire ça, car ça déclenche une erreur 500 à tort ! |
//$this->messages[] = "Aucune image disponible."; |
$contenu = array(); |
} |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limit = $_GET['limite']; |
$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus ! |
if ($this->parametresSontDemandes()) { |
$requete = $this->creerRequeteAvecParametres(); |
} else { |
$requete = $this->creerRequeteSansParametres(); |
} |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// ne pas faire ça, car ça déclenche une erreur 500 à tort ! |
//$this->messages[] = "Aucune image disponible."; |
} |
private $parametres_origines = null; |
private $format = null; |
private $service = null; |
private $squelette = null; |
private $squelette_dossier = null; |
private $auteurs = array(); |
private $flux = array(); |
private $format_image = 'XL'; |
private $criteres = array( |
'utilisateur' => 'b.courriel_utilisateur', |
'commune' => 'b.zone_geo', |
'dept' => 'b.dept', |
'taxon' => 'b.nom_ret', |
'num_taxon' => 'b.nt', |
'num_nom' => 'b.nom_sel_nn', |
'commentaire' => 'c.commentaire', |
'date' => 'c.date_prise_de_vue', |
'tag' => 'tag', |
'motcle' => 'tag', |
'projet' => 'projet', |
'referentiel' => 'referentiel', |
'groupe_zones_geo' => 'groupe_zones_geo' |
); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params = array()) { |
// Initialisation des variables |
$this->parametres_origines = $params; |
$info = array(); |
$contenu = ''; |
if (! $this->etreFluxAdmin() || $this->authentifierAdmin()) { |
// Pré traitement des paramêtres |
$pour_bdd = false; |
$p = $this->traiterParametres(array('service', 'format'), $params, $pour_bdd); |
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); |
$methode = $this->getNomMethodeService(); |
if (method_exists($this, $methode)) { |
if (isset($format) && preg_match('/^(?:rss1|rss2|atom)$/i', $format)) { |
// Mise en minuscule de l'indication du format |
$this->format = strtolower($format); |
// Définition du fichier squelette demandé |
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml'; |
} else if (isset($this->flux[$this->service])) { |
$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 deux premiers paramètres (service et format) pour le reste des méthodes |
array_shift($this->parametres); |
array_shift($this->parametres); |
// Récupération du contenu à renvoyer |
$contenu = $this->$methode(); |
} |
} else { |
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible."; |
} |
} else { |
$this->messages[] = "Le service CEL Syndication Image nécessite d'indiquer en premier paramètre le type d'information demandé."; |
} |
} |
// Envoie sur la sortie standard |
$encodage = 'utf-8'; |
$mime = $this->getTypeMime(); |
$formatage_json = $this->getFormatageJson(); |
$this->envoyer($contenu, $mime, $encodage, $formatage_json); |
} |
private function chargerListeDesFlux() { |
$this->setFlux('simple', 'Nouvelles images liées à une observation dans le CEL', |
"Ce flux fournit l'url des nouvelles images du CEL liées à une observation."); |
$this->setFlux('complet', 'Nouvelles images liées à une observation dans le CEL (détails)', |
"Ce flux fournit les informations sur les nouvelles images du CEL liées à une observation."); |
$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'."); |
$this->setFlux('par-commune','Flux de syndication obsolète', |
"Ce flux est désormais accessible via le flux multicriteres/atom/M?commune='commune'."); |
$this->setFlux('multicriteres','Flux de syndication des nouvelles images liées à une observation publique du CEL '. |
'filtrées par un ou plusieurs critères', |
"Ce flux fournit des informations sur les nouvelles images liées à une observation du CEL filtrées par ". |
"auteur (mail), commune (nom), departement (code postal), taxon (nom scientifique), commentaire, tag ". |
"et/ou date."); |
} |
private function setFlux($nom, $titre, $description) { |
$url_base = $this->config['settings']['baseURLAbsoluDyn'].'CelSyndicationImage/'; |
$formats = array('atom', 'rss2', 'rss1'); |
$flux = array(); |
foreach ($formats as $format) { |
$url = $url_base.$nom.'/'.$format; |
$flux[$format] = $url; |
} |
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux); |
} |
private function getFlux($nom) { |
return isset($this->flux[$nom]) ? $this->flux[$nom] : array(); |
} |
private function traiterNomService($nom) { |
$nom = strtolower($nom); |
return $nom; |
} |
private function getNomMethodeService() { |
$methode = ''; |
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('-', $this->service)))); |
$methode = 'getService'.$service_formate; |
return $methode; |
} |
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 getTypeMime() { |
$mime = ''; |
switch ($this->format) { |
case 'atom' : |
$mime = 'application/atom+xml'; |
break; |
case 'rss1' : |
case 'rss2' : |
$mime = 'application/rss+xml'; |
break; |
case 'opml' : |
$mime = 'text/x-opml'; |
break; |
default: |
$mime = 'text/html'; |
} |
return $mime; |
} |
private function getFormatageJson() { |
$json = false; |
switch ($this->service) { |
case 'liste-des-flux' : |
$json = true; |
break; |
default: |
$json = false; |
} |
return $json; |
} |
private function creerCategorie($element) { |
$categorie = ''; |
$categorie = 'Image'; |
$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) { |
$parametres_get = array(); |
foreach ($_GET as $cle => $valeur) { |
$parametres_get[] = $cle.'='.$valeur; |
} |
$url_service .= '?'.implode('&', $parametres_get); |
} |
return $url_service; |
} |
protected function executerRequete($requete, $retour = 'All', $mode = PDO::FETCH_ASSOC) { |
$infos = null; |
try { |
$infos = Cel::db()->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
if ($infos === false) { |
$this->messages[] = "La requête suivante n'a retourné aucun résultat :\n$requete"; |
} |
} catch (PDOException $e) { |
$msgTpl = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; |
$this->messages[] = sprintf($msgTpl, $e->getFile(), $e->getLine(), $e->getMessage()); |
} |
return $infos; |
} |
private function executerService($elements) { |
// Prétraitement des données |
$donnees = $this->construireDonneesCommunesAuFlux($elements); |
foreach ($elements as $element) { |
$identifiants[$element['courriel_utilisateur']] = $element['courriel_utilisateur']; |
} |
$this->auteurs = $this->creerAuteurs($identifiants); |
foreach ($elements as $element) { |
$donnees['items'][] = $this->construireDonneesCommunesAuxItems($element); |
} |
// Création du contenu à partir d'un template PHP |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function parametresSontDemandes() { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres); |
} |
private function creerRequeteSansParametres() { |
// Construction de la requête |
$requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '. |
' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '. |
'FROM cel_images_export c '. |
' left JOIN cel_export AS b '. |
' ON (c.ce_observation = b.id_observation) '; |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'c.date_creation DESC').' '. |
"LIMIT $this->start,$this->limit "; |
//echo $requete; |
return $requete; |
} |
private function creerRequeteAvecParametres() { |
// Construction de la requête |
$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '. |
' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '. |
'FROM cel_images_export AS c '. |
' INNER JOIN cel_export_total AS b '. |
' ON (c.ce_observation = b.id_observation) '. |
'WHERE donnees_standard = 1'. |
(($this->etreFluxAdmin()) ? '' : ' AND b.transmission = 1 '). |
' AND '; |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= $this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
if (!empty($criteres)) { |
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres); |
} |
} |
$requete = str_replace(' AND ) ',' ', $requete); |
$requete = rtrim($requete, 'AND '); |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
'c.date_creation DESC').' '."LIMIT $this->start,$this->limit "; |
return $requete; |
} |
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break; |
case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break; |
case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
case "c.date_prise_de_vue" : |
$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].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break; |
case "b.ce_zone_geo" : |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break; |
case "b.nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'. |
$nom_valeur[1].'%") AND '; break; |
case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break; |
case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break; |
case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break; |
case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) '; |
return $sql; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').')'; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteProjet($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').')'; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteReferentiel($referentiel) { |
$requete = "b.nom_referentiel LIKE '$referentiel%'"; |
return $requete; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'b.nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
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; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerDescriptionComplet($donnees, $item) { |
$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']); |
$auteur_mail = $donnees['courriel_utilisateur']; |
$id_img = $donnees['id_image']; |
$nom_fichier = $donnees['nom_original']; |
$url_img = $this->getUrlImage($donnees['id_image'], 'CS'); |
$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL'); |
// |
$mots_cles_image = $donnees['mots_cles_texte_images']; |
$note = ($donnees['note_qualite'] +1).'/5'; |
$commentaire_img = $donnees['commentaire_img']; |
$id_obs = $donnees['id_observation']; |
$famille = $donnees['famille']; |
$nom_saisi = $donnees['nom_sel']; |
$nom_retenu = $donnees['nom_ret']; |
// |
$mots_cles_obs = $donnees['mots_cles_texte_obs']; |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station']; |
$milieu = $donnees['milieu']; |
$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude']; |
$commentaire_obs = $donnees['commentaire_obs']; |
$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y'); |
$date_transmission = $this->formaterDate($donnees['date_transmission']); |
$date_modification = $this->formaterDate($donnees['date_modification']); |
$date_creation = $this->formaterDate($donnees['date_creation']); |
$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non'; |
$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'. |
'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'. |
'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'. |
'<div class="gauche">'. |
'<h3>'.'Image'.'</h3>'. |
'<ul>'. |
'<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>'. |
'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'. |
'<li>'.'<span class="champ">Par :</span> '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'. |
'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'. |
'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'. |
'</ul>'. |
'</div>'; |
// TODO : ajouter le champ commentaire EXIF. |
if (! $this->etreNull($id_obs)) { |
$description .= |
'<div class="gauche">'. |
'<h3>'.'Observation'.'</h3>'. |
'<ul>'. |
'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'. |
'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'. |
'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'. |
'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'. |
'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'. |
'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : ''). |
'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : ''). |
'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'. |
'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'. |
'</ul>'. |
'</div>'; |
} |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function getServiceParMotsCles() { |
$infos=array(); |
$infos[0]['nom_sel_nn'] = ''; |
$infos[0]['date_creation'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceParCommune() { |
$infos=array(); |
$infos[0]['nom_sel_nn'] = ''; |
$infos[0]['date_creation'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getIntituleAuteur($courriel) { |
$courriel = strtolower($courriel); |
$intitule = $this->auteurs[$courriel]; |
return $intitule; |
} |
} |
private function construireDonneesCommunesAuFlux($infos) { |
$donnees = $this->getFlux($this->service); |
$donnees['guid'] = $this->getUrlServiceBase(); |
$donnees['lien_service'] = $this->creerUrlService(); |
$donnees['lien_cel'] = (isset($infos['nom_sel_nn']) && $infos['nom_sel_nn'] != '' && $infos['nom_sel_nn'] != 0) ? |
$this->getUrlEflore($infos['nom_referentiel'], $infos['nom_sel_nn']) : ''; |
$donnees['editeur'] = $this->config['settings']['editeur']; |
$derniere_info_en_date = reset($infos); |
$date_modification_timestamp = strtotime($derniere_info_en_date['date_creation']); |
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$donnees['annee_courante'] = date('Y'); |
$donnees['generateur'] = 'CEL - Jrest - CelSyndicationImage'; |
$donnees['generateur_version'] = (preg_match('/([0-9]+)/', '$Revision$', $match)) ? $match[1] : '0'; |
return $donnees; |
} |
private function construireDonneesCommunesAuxItems($info) { |
$item = array(); |
$date_modification_timestamp = $this->convertirDateHeureMysqlEnTimestamp($info['date_creation']); |
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp); |
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp); |
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp); |
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp); |
$item['titre'] = $this->creerTitre($info); |
$item['guid'] = $this->creerGuidItem($info); |
$item['lien'] = $this->creerLienItem($info); |
$item['categorie'] = $this->creerCategorie($item); |
$item['description'] = $this->creerDescription(Cel::protegerCaracteresHtmlDansChamps($info), $item); |
$item['description_encodee'] = htmlspecialchars($this->creerDescription($info, $item)); |
$item['modifier_par'] = $this->nettoyerTexte($this->getIntituleAuteur($info['courriel_utilisateur'])); |
return $item; |
} |
private function creerGuidItem($element) { |
$guid = $this->getUrlImage($element['id_image']); |
return $guid; |
} |
private function creerTitre($element) { |
$methode = 'creerTitre'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerTitreSimple'; |
$titre = $this->$methode($element); |
$titre = $this->nettoyerTexte($titre); |
return $titre; |
} |
private function creerDescription($donnees, $item) { |
$methode = 'creerDescription'.$this->service; |
$methode = (method_exists($this, $methode)) ? $methode : 'creerDescriptionComplet'; |
$description = $this->$methode($donnees, $item); |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function creerLienItem($element) { |
if ($this->etreNull($element['id_observation'])) { |
// Lien vers image grand format |
$lien = $this->getUrlImage($element['id_image'], $this->format_image); |
} else { |
// Lien vers fiche eFlore onglet Illustration |
$lien = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration'); |
} |
return $lien; |
} |
private function getServiceListeDesFlux() { |
return $this->flux; |
} |
private function getServiceOpml() { |
$donnees = array(); |
$id = 1; |
foreach ($this->flux as $flux_nom => $flux){ |
$info = array(); |
$info['type'] = 'atom'; |
$info['titre'] = $flux['titre']; |
$info['texte'] = "CEL - Images - $flux_nom"; |
$info['description'] = $flux['description']; |
$info['url_xml'] = $this->getUrlBase().$flux_nom.'/atom'; |
$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 getServiceSimple() { |
if (isset($this->parametres[0])) { |
$this->format_image = $this->parametres[0]; |
} |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '. |
' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '. |
' co.mots_cles_texte AS mots_cles_texte_images_obs, "" as commentaire, "" as note_qualite, nom_referentiel '. |
'FROM cel_export_total AS co JOIN cel_images_export AS ci ON (co.id_observation = ci.ce_observation) '. |
'WHERE co.transmission = 1 '. |
' AND co.ce_utilisateur = ci.ce_utilisateur '. |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci.date_creation DESC').' '. |
"LIMIT $this->start, $this->limit "; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
$contenu = $this->executerService($elements); |
return $contenu; |
} |
private function creerTitreSimple($element) { |
$date = $element['date_observation']; |
$date = date("d/m/Y", strtotime($date)); |
if ($this->etreNull($element['nom_sel']) && $this->etreNull($element['nom_sel_nn'])) { |
$titre = "Ajout d'une photo par ".$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date; |
} else { |
$titre = $element['nom_sel'].' [nn'.$element['nom_sel_nn'].'] par '.$this->getIntituleAuteur($element['courriel_utilisateur']).' le '.$date; |
} |
$zoneGeo = $element['zone_geo']; |
if ($zoneGeo) { |
$titre .= " - $zoneGeo"; |
} |
return $titre; |
} |
private function creerDescriptionSimple($donnees, $item) { |
$description = $this->getUrlEflore($element['nom_referentiel'], $element['nom_sel_nn'], 'illustration'); |
return $description; |
} |
private function getServiceComplet() { |
// Construction de la requête |
$requete = (isset($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' co.*, '. |
' ci.id_image, co.ce_utilisateur, nom_original, ci.date_creation, ci.mots_cles_texte AS mots_cles_texte_images, '. |
' co.mots_cles_texte AS mots_cles_texte_obs, ci.commentaire AS commentaire_img, note_qualite, nom_referentiel, '. |
' co.commentaire AS commentaire_obs '. |
'FROM cel_images_export AS ci '. |
' JOIN cel_export AS co '. |
' ON (ci.ce_observation = co.id_observation) '. |
(($this->etreFluxAdmin()) ? '' : 'WHERE co.transmission = 1 '). |
'ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'ci.date_creation DESC').' '. |
"LIMIT $this->start, $this->limit "; |
//echo $requete; |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// ne pas faire ça, car ça déclenche une erreur 500 à tort ! |
//$this->messages[] = "Aucune image disponible."; |
$contenu = array(); |
} |
return $contenu; |
} |
private function getServiceMultiCriteres() { |
$contenu = ''; |
if (isset($_GET['debut'])) $this->start = $_GET['debut']; |
if (isset($_GET['limite'])) $this->limit = $_GET['limite']; |
$this->limit = ($this->limit < 1000) ? $this->limit : 1000;// Pour éviter les abus ! |
if ($this->parametresSontDemandes()) { |
$requete = $this->creerRequeteAvecParametres(); |
} else { |
$requete = $this->creerRequeteSansParametres(); |
} |
$elements = $this->executerRequete($requete); |
// Création du contenu |
if ($elements != false && count($elements) > 0) { |
$contenu = $this->executerService($elements); |
} else { |
// ne pas faire ça, car ça déclenche une erreur 500 à tort ! |
//$this->messages[] = "Aucune image disponible."; |
} |
return $contenu; |
} |
private function parametresSontDemandes() { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
return (isset($_GET['recherche']) && $_GET['recherche'] != '') || !empty($criteres); |
} |
private function creerRequeteSansParametres() { |
// Construction de la requête |
$requete = 'SELECT *, b.mots_cles_texte AS mots_cles_texte_obs, c.mots_cles_texte AS mots_cles_texte_images, '. |
' b.commentaire AS commentaire_obs, "" AS commentaire_img, nom_referentiel '. |
'FROM cel_images_export c '. |
' JOIN cel_export AS b '. |
' ON (c.ce_observation = b.id_observation) '; |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : 'c.date_creation DESC').' '. |
"LIMIT $this->start,$this->limit "; |
//echo $requete; |
return $requete; |
} |
private function creerRequeteAvecParametres() { |
// Construction de la requête |
$requete = 'SELECT *, b.mots_cles_texte as mots_cles_texte_obs, c.mots_cles_texte as mots_cles_texte_images, '. |
' b.commentaire as commentaire_obs, "" as commentaire_img, nom_referentiel '. |
'FROM cel_images_export AS c '. |
' JOIN cel_export_total AS b '. |
' ON (c.ce_observation = b.id_observation) '. |
'WHERE '. |
(($this->etreFluxAdmin()) ? '' : ' b.transmission = 1 '). |
' AND '; |
if ($this->estUneRechercheGenerale()) { |
$chaine_requete = $_GET['recherche']; |
$requete .= "donnees_standard = 1 AND ".$this->creerSousRequeteRechercheGenerale($chaine_requete); |
} else { |
$criteres = $this->traiterCriteresMultiples($_GET) ; |
if (!isset($_GET["standard"])) { |
$requete .= "donnees_standard = 1 AND "; |
} elseif ($_GET["standard"] = 1) { |
$requete .= "donnees_standard = 1 AND "; |
} |
if (!empty($criteres)) { |
$requete .= $this->creerSousRequeteRechercheParCriteres($criteres); |
} |
} |
$requete = str_replace(' AND ) ',' ', $requete); |
$requete = rtrim($requete, 'AND '); |
$requete .= ' ORDER BY '.(isset($this->orderby) && (!is_null($this->orderby)) ? $this->orderby : |
'c.date_creation DESC').' '."LIMIT $this->start,$this->limit "; |
return $requete; |
} |
private function creerSousRequeteRechercheParCriteres($criteres) { |
$requete = ''; |
foreach ($criteres as $pair) { |
$nom_valeur = explode("=",$pair); |
if (sizeof($nom_valeur) != 0) { |
switch ($nom_valeur[0]) { |
case "ci_limite" : $this->limit = Cel::db()->quote($nom_valeur[1]); break; |
case "c.ci_numero_page" : $this->limit*Cel::db()->quote($nom_valeur[1]); break; |
case "c.commentaire" : $mots_comment_liste = explode(" " , $nom_valeur[1]); |
foreach($mots_comment_liste as $mot_comment) { |
$mot_comment = trim($mot_comment) ; |
$requete .= $nom_valeur[0].' LIKE '.Cel::db()->quote('%'.$mot_comment.'%').' AND '; |
} |
break; |
case "c.date_prise_de_vue" : |
$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].' LIKE '.Cel::db()->quote($nom_valeur[1]."%").' AND '; break; |
case "b.ce_zone_geo" : |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%") AND '; break; |
case "b.nom_ret" : |
if ($nom_valeur[1] == "indetermine") $nom_valeur[1] = 'null'; |
$requete .= ' ('.$nom_valeur[0].' LIKE "%'.$nom_valeur[1].'%" OR b.nom_sel LIKE "%'. |
$nom_valeur[1].'%") AND '; break; |
case "tag" : $requete .= $this->creerSousRequeteMotsCles($nom_valeur[1]).' AND '; break; |
case "projet" : $requete .= $this->creerSousRequeteProjet($nom_valeur[1]).' AND '; break; |
case "referentiel" : $requete .= $this->creerSousRequeteReferentiel($nom_valeur[1]).' AND '; break; |
case "groupe_zones_geo" : $requete .= $this->creerSousRequeteGroupeZonesGeo($nom_valeur[1])." AND "; break; |
default : $requete .= $nom_valeur[0].' = "'.$nom_valeur[1].'" AND '; break; |
} |
} |
} |
$requete = rtrim($requete,' AND '); |
return $requete; |
} |
private function creerSousRequeteGroupeZonesGeo($groupe_zones_geo) { |
$req = "SELECT valeur FROM cel_groupes_zones WHERE id_groupe = ".Cel::db()->proteger($groupe_zones_geo); |
$res = Cel::db()->requeter($req); |
$zones = array(); |
foreach($res as &$r) { |
$zones[] = Cel::db()->proteger($r['valeur']); |
} |
$sql = '(b.ce_zone_geo IN ('.implode(',', $zones).')) '; |
return $sql; |
} |
private function creerSousRequeteMotsCles($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').')'; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(c.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(c.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteProjet($mot_cle) { |
$requete = ''; |
if (preg_match('/.*OU.*/', $mot_cle)) { |
$mots_cles_tab = explode('OU',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') OR '; |
} |
$requete = '('.rtrim($requete,'OR ').')'; |
} else if (preg_match('/.*ET.*/', $mot_cle)) { |
$mots_cles_tab = explode('ET',$mot_cle); |
foreach($mots_cles_tab as $mot_cle_item) { |
$requete .= '(b.mots_cles_texte LIKE '.Cel::db()->proteger('%'.$mot_cle_item.'%').') AND '; |
} |
$requete = '('.rtrim($requete, 'AND ').') '; |
} else { |
$requete = "(b.mots_cles_texte LIKE ".Cel::db()->proteger('%'.$mot_cle.'%').') '; |
} |
return $requete; |
} |
private function creerSousRequeteReferentiel($referentiel) { |
$requete = "b.nom_referentiel LIKE '$referentiel%'"; |
return $requete; |
} |
private function creerSousRequeteRechercheGenerale($chaine_requete) { |
$requete = ''; |
if (trim($chaine_requete) != '') { |
$chaine_requete = strtolower($chaine_requete); |
$chaine_requete = str_replace(' ', '_', $chaine_requete); |
$requete = ' ('. |
'b.nom_ret LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.nom_sel LIKE "'.$chaine_requete.'%"'. |
' OR '. |
'b.zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_zone_geo LIKE "INSEE-C:'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_zone_geo LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.ce_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.courriel_utilisateur LIKE "'.$chaine_requete.'%" '. |
' OR '. |
'b.mots_cles_texte LIKE "'.$chaine_requete.'%" '. |
') '; |
} |
return $requete; |
} |
private function estUneRechercheGenerale() { |
return isset($_GET['recherche']); |
} |
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; |
} |
} |
return $tableau_criteres_pour_bdd; |
} |
private function creerDescriptionComplet($donnees, $item) { |
$auteur = $this->getIntituleAuteur($donnees['courriel_utilisateur']); |
$auteur_mail = $donnees['courriel_utilisateur']; |
$id_img = $donnees['id_image']; |
$nom_fichier = $donnees['nom_original']; |
$url_img = $this->getUrlImage($donnees['id_image'], 'CS'); |
$url_img_normale = $this->getUrlImage($donnees['id_image'], 'XL'); |
// |
$mots_cles_image = $donnees['mots_cles_texte_images']; |
$note = ($donnees['note_qualite'] +1).'/5'; |
$commentaire_img = $donnees['commentaire_img']; |
$id_obs = $donnees['id_observation']; |
$famille = $donnees['famille']; |
$nom_saisi = $donnees['nom_sel']; |
$nom_retenu = $donnees['nom_ret']; |
// |
$mots_cles_obs = $donnees['mots_cles_texte_obs']; |
$lieu = $this->formaterZoneGeoEtCodePourAffichage($donnees).' > '.$donnees['lieudit'].' > '.$donnees['station']; |
$milieu = $donnees['milieu']; |
$coordonnees = ($this->etreNull($donnees['latitude']) && $this->etreNull($donnees['longitude'])) ? '' : $donnees['latitude'].'/'.$donnees['longitude']; |
$commentaire_obs = $donnees['commentaire_obs']; |
$date_observation = $this->formaterDate($donnees['date_observation'], '%A %d %B %Y'); |
$date_transmission = $this->formaterDate($donnees['date_transmission']); |
$date_modification = $this->formaterDate($donnees['date_modification']); |
$date_creation = $this->formaterDate($donnees['date_creation']); |
$transmission = $donnees['transmission'] == 1 ? "oui ($date_transmission)" : 'non'; |
$description = '<style>.champ{color:grey} .gauche{float:left;padding:0 20px 0 0;} ul{list-style-type:none;padding:0;}</style>'. |
'<h2>'.(!$this->etreNull($id_obs) ? "Image #$id_img liée à l'observation #$id_obs" : "Image #$id_img non liée à une observation.").'</h2>'. |
'<a href="'.$url_img_normale.'"><img class="gauche" src="'.$url_img.'" alt="'.$nom_fichier.'" /></a>'. |
'<div class="gauche">'. |
'<h3>'.'Image'.'</h3>'. |
'<ul>'. |
'<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>'. |
'<li>'.'<span class="champ">Importée le :</span> '.$item['date_maj_simple'].'</li>'. |
'<li>'.'<span class="champ">Par :</span> '. |
(($this->etreFluxAdmin()) ? '<a href="mailto:'.$auteur_mail.'">'.$auteur.'</a>' : $auteur). |
'</li>'. |
'<li>'.'<span class="champ">Nom du fichier :</span> '.$this->nePasInterpreterXml($nom_fichier).'</li>'. |
'<li>'.'<span class="champ">Note qualité :</span> '.$note.'</li>'. |
'<li>'.'<span class="champ">Commentaires :</span> '.$this->nePasInterpreterXml($commentaire_img).'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_image).'</li>'. |
'</ul>'. |
'</div>'; |
// TODO : ajouter le champ commentaire EXIF. |
if (! $this->etreNull($id_obs)) { |
$description .= |
'<div class="gauche">'. |
'<h3>'.'Observation'.'</h3>'. |
'<ul>'. |
'<li>'.'<span class="champ">Famille :</span> '.$famille.'</li>'. |
'<li>'.'<span class="champ">Nom saisi :</span> '.$nom_saisi.'</li>'. |
'<li>'.'<span class="champ">Nom retenu :</span> '.$nom_retenu.'</li>'. |
'<li>'.'<span class="champ">Observée le :</span> '.$date_observation.'</li>'. |
'<li>'.'<span class="champ">Lieu :</span> '.$lieu.'</li>'. |
'<li>'.'<span class="champ">Milieu :</span> '.$milieu.'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Coordonnées (Lat/Long) :</span> '.$coordonnees.'</li>' : ''). |
'<li>'.'<span class="champ">Commentaire :</span> '.$this->nePasInterpreterXml($commentaire_obs).'</li>'. |
'<li>'.'<span class="champ">Mots-clés :</span> '.$this->nePasInterpreterXml($mots_cles_obs).'</li>'. |
(($this->etreFluxAdmin()) ? '<li><span class="champ">Transmis (= public) :</span> '.$transmission.'</li>' : ''). |
'<li><span class="champ">Modifiée le :</span> '.$date_modification.'</li>'. |
'<li><span class="champ">Créée le :</span> '.$date_creation.'</li>'. |
'</ul>'. |
'</div>'; |
} |
$description = $this->nettoyerTexte($description); |
return $description; |
} |
private function getServiceParMotsCles() { |
$infos=array(); |
$infos[0]['nom_sel_nn'] = ''; |
$infos[0]['date_creation'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?tag='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getServiceParCommune() { |
$infos=array(); |
$infos[0]['nom_sel_nn'] = ''; |
$infos[0]['date_creation'] = '2011-06-28'; |
$donnees = $this->construireDonneesCommunesAuFlux($infos); |
$donnees['items'][0]['guid'] = 0; |
$donnees['items'][0]['description'] = 'Ce flux est devenu obsolète. Veuillez utiliser le flux '. |
'<b>http://www.tela-botanica.org/eflore/cel2/jrest/CelSyndicationImage/multicriteres/atom?commune='; |
if (isset($this->parametres[0])) { |
$donnees['items'][0]['description'] .= $this->parametres[0].'</b>'; |
} else { |
$donnees['items'][0]['description'] .= '</b>'; |
} |
$donnees['items'][0]['titre'] = ''; |
$contenu = Cel::traiterSquelettePhp($this->squelette, $donnees); |
return $contenu; |
} |
private function getIntituleAuteur($courriel) { |
$courriel = strtolower($courriel); |
$intitule = $this->auteurs[$courriel]; |
return $intitule; |
} |
} |