New file |
0,0 → 1,710 |
<?php |
/** |
* Description : |
* Classe Observations.php permettant de fournir des informations sur les observations. |
* Si l'url finit par /observations on retourne une liste d'observations (seulement les 100 premières par défaut) : |
* espèce, lieu, date, observateur. |
* L'url peut contenir des paramètres optionnels passés après le ? : /observations?param1=val1¶m2=val2&... |
* |
* Les paramètres de requête disponibles sont : masque, masque.type (type d'observation : chorologie), |
* masque.date_observation (date d'observation), masque.station (département), masque.determination (nom scientifique de l'espèce) |
* masque.observateur (prénom, nom), masque.nn (identifiant du nom), recherche, distinct, retour.format, |
* navigation.depart et navigation.limite. |
* |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* @package framework-v3 |
* @author Delphine Cauquil <delphine@tela-botanica.org> |
* @author Jennifer Dhé <jennifer.dhe@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version 1.0 |
* @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org) |
*/ |
|
class Observations extends Commun { |
|
protected $serviceNom = 'observations'; |
|
/** Stockage des paramétres */ |
protected $table_param = array(); |
/** Valeur du paramètre de requete recherche : |
* - stricte : le masque est passé tel quel à l'opérateur LIKE. |
* - etendue : ajout automatique du signe % à la place des espaces et en fin de masque avec utilisation de LIKE. |
* - floue : recherche tolérante vis-à-vis d'approximations ou d'erreurs (fautes d'orthographe par exemple) */ |
protected $recherche = 'stricte'; |
/** Valeur du paramètre de requete distinct (=0|1) |
* Indique que l'on veut les noms distincts (par défaut tous les noms, même semblable, sont renvoyés) */ |
protected $distinct = null; |
protected $retour_format = 'max'; |
protected $presenceChorologie = ''; |
|
/** Variables constituant les parametres de la requete SQL (champ, condition, group by, limit) remplie |
* selon ressources et paramètres */ |
protected $requete_champ = ' id, num_nom, nom_sci '; |
protected $requete_condition = array(); |
/** Une observation est défini par départ qui correspont à un num_nom et dept qui correspond à un departement */ |
protected $limite_requete = array( |
'depart' => 0, |
'dept' => 01, |
'limite' => 20 |
); |
|
/** |
* Permet de stocker la requete formulée : |
* - noms | noms/#id | noms/#id/#champ+#champ |
* - noms/#id/relations | noms/#id/relations/synonymie | noms/#id/relations/homonymie | noms/#id/relations/flores |
* - noms/stats/rangs | noms/stats/annees | noms/stats/initiales |
* Est remplit au cours de l'analyse des ressources (traiterRessources()). |
* Est utilisée principalement pr déterminer le format du tableau à retourner. |
*/ |
protected $format_reponse = 'observations'; |
|
// +-------------------------------------------------------------------------------------------------------------------+ |
public function consulter($ressources, $parametres) { |
$this->parametres = $parametres; |
$this->traiterVersionProjet($ressources); |
$this->traiterRessources($ressources); |
$resultat_formate = ''; |
|
if ($this->corps_http == '' && $this->entete_http == '') { |
foreach ($this->table_version as $version) { |
$this->table = $version; //on stocke le nom de la table correspondant à la version du projet en cours |
$this->traiterParametres($parametres); |
$requete = $this->assemblerLaRequete(); //print_r($requete); |
$resultat = $this->getBdd()->recupererTous($requete); |
$res_version = $this->testerResultat($resultat, $requete); |
} |
if ($this->corps_http == '' && $this->entete_http == '') { |
if (isset($res_version)) { |
$resultat_formate = $res_version; |
} |
} |
} |
return $resultat_formate; |
} |
|
public function testerResultat($resultat, $requete) { |
if ($resultat == '') { //cas ou la requete comporte des erreurs |
$s = 'La requête SQL resultat formée comporte une erreur !!'; |
Debug::printr($requete); |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $s); |
} elseif ($resultat) { |
if (count($this->table_version) > 1) { |
$res_version[$version] = $this->retournerResultatFormate($resultat); |
} else { |
$res_version = $this->retournerResultatFormate($resultat); |
} |
} else { |
if ($this->format_reponse == 'zone-geo/id/relations') { |
//si aucune relations n'existe, la valeur null est retournée |
$res_version = null; |
} else { |
$d = 'Données recherchées introuvables dans la base'.$requete; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $d); |
Debug::printr($requete); |
} |
} |
return $res_version; |
} |
|
public function assemblerLaRequete() { |
$requete = "SELECT ".$this->formerRequeteChamp(). |
" FROM ".$this->table.$this->formerRequeteCondition(). |
' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite'];//echo $requete; |
return $requete; |
} |
|
public function formerRequeteChamp() { |
if (!isset($this->table_ressources)) { |
if (!isset($this->table_param['masque_station']) && !isset($this->table_param['masque_contributeur']) ) { |
$champ = ' * '; |
} else { |
$champ = $this->requete_champ; |
} |
} else { |
$champ = $this->requete_champ; |
} |
return $champ; |
} |
|
public function formerRequeteCondition() { |
$condition = ''; |
if ($this->requete_condition != null) { |
$condition = ' WHERE '.implode(' AND ', $this->requete_condition); |
} |
return $condition; |
} |
|
// +-------------------------------------------------------------------------------------------------------------------+ |
public function traiterRessources(&$ressources) { |
if (isset($ressources) && !empty($ressources)) { |
$this->table_ressources = $ressources; |
if (isset($this->table_ressources[0]) && !empty($this->table_ressources[0])) { |
$this->traiterRessourceId(); |
if (isset($this->table_ressources[1]) && !empty($this->table_ressources[1])) { |
$this->traiterRessourceChamp; |
} |
} |
} |
} |
|
public function traiterRessourceId() { |
//requete : /observations/#num_nom:#dept (ex : /observations/10:34) |
if (preg_match('/^([0-9]*):([0-9]{2})$/', $this->table_ressources[0], $conditions)) { |
$this->requete_condition[] = ' num_nom = '.$this->getBdd()->proteger($conditions[1]).' AND `'.$conditions[2]."` != '' "; |
$this->requete_champ .= ' ,catminat, rang, num_tax, freq_abs, freq_rel, rare_nat, `'.$conditions[2].'`'; |
$this->format_reponse .= '/id'; |
|
//requete : /observations/nom:#dept (ex : /observations/coquelicot:30) |
} elseif (preg_match('/^(.*):([0-9]{2})$/', $this->table_ressources[0], $conditions)) { |
$this->requete_condition[] = ' nom_sci like '.$this->getBdd()->proteger($conditions[1].'%').' AND `'.$conditions[2]."` != '' "; |
$this->requete_champ .= ' ,catminat, rang, num_tax, freq_abs, freq_rel, rare_nat, `'.$conditions[2].'`'; |
$this->format_reponse .= '/id'; |
//requete : /observations/num_nom:#num_nom (ex : /observations/num_nom:290) ?? |
} elseif (strrpos($this->table_ressources[0], ':') !== false) { |
|
} else { |
$r = 'Erreur dans les ressources de votre requête : </br> La ressource " '.$this->table_ressources[0]. |
' " n\'existe pas.'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $r); |
} |
} |
|
// +-------------------------------------------------------------------------------------------------------------------+ |
public function traiterParametres($parametres) { |
if (isset($parametres) && !empty($parametres)) { |
$this->table_param = $parametres; |
|
if (isset($parametres['recherche']) && $parametres['recherche'] != '') { |
$this->recherche = $parametres['recherche']; |
} |
foreach ($parametres as $param => $valeur) { |
switch ($param) { |
case 'masque' : $this->ajouterLeFiltreMasque($valeur); break; |
case 'masque.date.observation' : break; |
case 'masque.station' : $this->limite_requete['dept'] = $valeur; |
$this->ajouterUnFiltre('station', $valeur); break; |
case 'masque.departement' : |
$this->ajouterUnFiltre("`".$valeur."`", '1'); break; |
case 'masque.determination' : $this->ajouterUnFiltre('nom_sci', $valeur); break; |
case 'masque.determination.nn' : |
$this->requete_condition[] = '`num_nom` = '.$this->getBdd()->proteger($valeur); break; |
case 'masque.determination.nt' : |
$this->requete_condition[] = '`num_tax` = '.$this->getBdd()->proteger($valeur); break; case 'masque.observateur' : $this->ajouterLeFiltreContributeur($valeur); break; |
case 'masque.valeur' : $this->presenceChorologie = $valeur; break; |
case 'retour.format' : $this->retour_format = $valeur; break; |
case 'navigation.depart' : $this->ajouterLimiteDepart($valeur); break; |
case 'navigation.limite' : $this->limite_requete['limite'] = $valeur; break; |
case 'recherche' : break; |
case 'version.projet' : break; |
default : $p = 'Erreur dans les paramètres de recherche de votre requête : '. |
'</br> Le paramètre " '.$param.' " n\'existe pas.'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $p); break; |
} |
} |
} |
} |
|
/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) en fonctions des parametres demandés |
* @param $nom_champ |
* @param $valeur |
* @param $masque |
*/ |
public function ajouterUnFiltre($nom_champ, $valeur) { |
if ($nom_champ == 'station') { |
if (!preg_match('/^\s*([0-9]{2})\s*$/', $valeur, $colonne)) { // si le nom est passé |
$this->requete_condition[] = '1'; |
/* $url = $this->ajouterHrefAutreProjet('zone-geo',$key,'INSEE-D');// d'apres nom |
$dept = $this->rest_client->consulter($url); |
$entete = $this->rest_client->getReponseEntetes(); |
if (isset($entete['wrapper_data'])) { |
$colonne = json_decode($relation); |
} else { |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, |
'Le service '.$this->service.' de ce projet comporte des erreurs. url lancée : '.$url); |
}*/ |
} else { |
$this->requete_condition[] = '`'.$valeur."` != '' "; |
$this->requete_champ .= ', `'.$valeur.'` '; |
} |
} else { |
// recherche floue |
if ($this->recherche == 'floue') {//ajout_soundex |
$this->requete_condition[] = '(SOUNDEX('.$nom_champ.') = SOUNDEX(\''.$valeur.'\')' |
.' OR SOUNDEX(REVERSE('.$nom_champ.')) = SOUNDEX(REVERSE(\''.$valeur.'\'))) '; |
// recherche étendue |
} elseif ($this->recherche == 'etendue') { |
$valeur = str_replace(' ','%', $valeur); |
$valeur .= '%'; |
} |
// recherche stricte |
$this->requete_condition[] = $nom_champ.' LIKE '.$this->getBdd()->proteger($valeur); |
} |
} |
|
/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) quand le paramètre passé est masque |
* @param $valeur |
*/ |
public function ajouterLeFiltreMasque($valeur) { |
$this->ajouterUnfiltre('station', $valeur); |
$condition = '(( '.array_pop($this->requete_condition); |
$this->ajouterUnfiltre('num_nom', $valeur); |
$condition .= ' ) OR ('.array_pop($this->requete_condition); |
$condition = str_replace('( 1 ) OR', '', $condition); // si la valeur passée est une varchar supprime le filtre station |
$this->ajouterUnfiltre('nom_sci', $valeur); |
$this->requete_condition[] = $condition.' ) OR ('.array_pop($this->requete_condition).' )) '; |
} |
|
/** fonction d'ajout dans la requete SQL des conditions (WHERE ...) quand le paramètre passé est masque.contributeur |
* @param $valeur |
*/ |
public function ajouterLeFiltreContributeur($valeur) { |
$requete_contr = $this->creerRequeteContributeur($valeur); |
$res = $this->getBdd()->recupererTous($requete_contr); |
if ($res == '') { //cas ou la requete comporte des erreurs |
$c = 'La requête SQL formée comporte une erreur !!'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $c); |
Debug::printr($requete_contr); |
} elseif ($res) { |
unset($res[0]['id'],$res[0]['nom'],$res[0]['prenom'],$res[0]['courriel']); |
// si il y a un masque station et que le contributeur n'a pas de données dans ce dept |
if (isset($this->table_param['masque_station']) && isset($res[0][$this->table_param['masque_station']])) { |
if ($res[0][$this->table_param['masque_station']] != 1) { |
$d = "Les données recherchées sont introuvables pour l'observateur ".$valeur." dans le département " |
.$this->table_param['masque_station']; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $d); |
} |
} else { |
foreach ($res[0] as $dept=>$presence) { |
if ($presence == 1) { |
$this->ajouterUnfiltre('station', $dept); |
$requete_condition[] = array_pop($this->requete_condition); // recupere le filtre créé précédement |
} |
} |
$this->requete_condition[] = '(( '.implode(' ) OR ( ', $requete_condition).' ))'; // créé un filtre sur les dept |
} |
} else { |
$i = "Les données recherchées sont introuvables pour l'observateur ".$valeur; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $i); |
} |
} |
|
public function creerRequeteContributeur($valeur) { |
$condition = ''; |
if (preg_match('/(.*@[a-z]+\.[a-z]{2,3})/', $valeur, $match)) {// cherche sur le mail |
$condition = 'courriel = '.$this->getBdd()->proteger($match[1]); |
} elseif (preg_match('/^(\w+)\s+(\w+)$/', $valeur, $match)) {// cherche sur les nom prenom |
$condition = ' ((nom = '.$this->getBdd()->proteger($match[1]).' OR prenom = '.$this->getBdd()->proteger($match[1]). |
' ) AND (nom = '.$this->getBdd()->proteger($match[2]).' OR prenom = '.$this->getBdd()->proteger($match[2]).'))'. |
' OR ( nom LIKE '.$this->getBdd()->proteger($valeur.'%').')'; |
} else {// cherche si nom association |
$condition = 'nom LIKE '.$this->getBdd()->proteger($valeur.'%'); |
} |
list($table, $version) = explode('_v',$this->table); |
$requete_contr = "SELECT * FROM chorodep_contributeurs_v$version WHERE ".$condition; |
} |
|
public function ajouterLimiteDepart($id) { |
$d = explode(":", $id); |
$this->limite_requete['depart'] = 0; |
$this->limite_requete['dept'] = $d[1]; |
if (!isset($this->parametres['masque.determination.nn'])) { |
$requete_condition = (is_numeric($d[0])) ? '`num_nom` = '.$d[0] : '`nom_sci` like "'.urldecode($d[0]).'%"'; |
$requete = "SELECT id FROM $this->table WHERE ".$requete_condition; |
$res = $this->getBdd()->recuperer($requete); |
if ($res == '') { //cas ou la requete comporte des erreurs |
$r = 'La requête SQL formée comporte une erreur !!'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r); |
Debug::printr($requete); |
} elseif ($res) { |
$this->limite_requete['depart'] = $res['id'] - 1; |
} else { |
$i = "Les données recherchées sont introuvables"; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $i); |
} |
} |
} |
|
// +-------------------------------------------------------------------------------------------------------------------+ |
public function retournerResultatFormate($resultat) { |
$this->table_retour = array(); // stocke les données générales d'une observation et écrase les données d'un dep |
$this->chargerInfosGenerales(); |
switch ($this->format_reponse) { |
case 'observations' : $reponse = $this->formaterObservations($resultat); break; |
case 'observations/id' : $reponse = $this->formaterObservationsId($resultat[0]); break; |
case 'observations/id/champ': $reponse = $this->formaterObservationsIdChamp($resultat[0]); break; |
default : break; |
} |
return $reponse; |
} |
|
|
public function formaterObservations($resultat) { |
$num = 0; // compte le nombre d'observations pour retourner le nombre d'obs indiqué |
$depart = false; //le depart du resultat est noté ss forme #ligne:#departement $depart indique le departement est correct |
//on remplit la table $table_retour_json['resultat'] |
$this->table_retour = array(); |
foreach ($resultat as $tab) { |
foreach ($tab as $key => $valeur) { |
switch ($key) { |
case 'id' : break; |
case 'catminat' : break; |
case 'rang' : break; |
case 'num_tax' : break; |
case 'freq_abs' : break; |
case 'freq_rel' : break; |
case 'rare_nat' : break; |
case 'num_nom' : ($valeur == 'nc')? $num_nom = urlencode($tab['nom_sci']) : $num_nom = $valeur ; break; |
case 'nom_sci' : $this->table_retour['determination.nom_sci'] = $valeur; break; |
default : // pour les depts |
if (isset($this->parametres['masque.station'])) { |
if ($key == $this->parametres['masque.station']) { |
$id = $num_nom.":".$key; |
$this->completerDonnees($key, $valeur, $id); |
$resultat_json[$id] = $this->table_retour; |
$num++; |
} |
} else { |
if ($depart == true && $valeur != '') { |
if (($this->presenceChorologie != '' && $valeur == $this->presenceChorologie) || |
($this->presenceChorologie == '' && $valeur != $this->presenceChorologie)) { |
$id = $num_nom.":".$key; |
$this->completerDonnees($key, $valeur, $id); |
$resultat_json[$id] = $this->table_retour; |
$num++; |
} |
} |
if ($key == $this->limite_requete['dept']) $depart = true; |
} |
break; |
} |
if ($num == $this->limite_requete['limite']) { |
break; |
} |
} |
if ($num == $this->limite_requete['limite']) { |
break; |
} |
$this->table_retour = array(); |
} |
//on remplit la table $table_retour_json['entete'] |
//formuler les urls precedentes et suivantes affichées dans l'entete du resultat |
$url = $this->formulerUrlObs($id, $num, '/observations'); |
if ($url['precedent'] != '') { $this->table_entete['href.precedent'] = $url['precedent']; } |
if ($url['suivant'] != '') { $this->table_entete['href.suivant'] = $url['suivant']; } |
$this->table_entete['total'] = $num; |
$table_retour_json['entete'] = $this->table_entete; |
$table_retour_json['resultat'] = $resultat_json; |
return $table_retour_json; |
} |
|
public function completerDonnees($key, $valeur, $id) { |
if ($this->retour_format == 'max' ) { |
$this->afficherDonneesMax($key, $valeur); |
$this->table_retour['href'] = $this->ajouterHref('observations',$id); |
} else { |
$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key; |
$this->table_retour['valeur.code'] = $valeur; |
} |
} |
|
public function formaterObservationsId($resultat) { |
foreach ($resultat as $key => $valeur) { |
switch ($key) { |
case 'id' : break; |
case 'catminat' : if ($this->retour_format == 'max') $this->table_retour['determination.catminat'] = $valeur; break; |
case 'rang' : $this->table_retour['determination.rang'] = $valeur; break; |
case 'num_tax' : $this->table_retour['determination.num_tax'] = $valeur; break; |
case 'freq_abs' : break; |
case 'freq_rel' : break; |
case 'rare_nat' : $this->table_retour['determination.rarete_nationale.code'] = $valeur; break; |
case 'nom_sci' : $this->table_retour['determination.nom_sci'] = $valeur; break; |
case 'num_nom' : $this->table_retour['determination.num_nom'] = $valeur; break; |
default : if ($this->retour_format == 'max') { |
$this->afficherDonneesMax($key, $valeur, true); |
} else { |
$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key; |
$this->table_retour['valeur.code'] = $valeur; |
} break; |
} |
} |
return $this->table_retour; |
} |
|
public function afficherDonneesMax($key, $valeur, $id = false) { |
if ($key != 20) { //à part la Corse |
$url_dep = $this->ajouterHrefAutreProjet('zone-geo','',$key, 'insee-d'); |
$dep = $this->consulterHref($url_dep); |
if (isset($dep)) { |
$this->table_retour['station.departement'] = $dep->nom; |
$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key; |
$this->table_retour['station.departement.href'] = $url_dep; |
} else { |
$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key; |
} |
} else { |
$this->table_retour['station.departement.code'] = 'INSEE-D.'.$key; |
} |
//double encodage des paramétres contre validation de Apache |
$url_val = $this->ajouterHref('ontologies', 'presenceChorologie:'.urlencode(urlencode($valeur))); |
$val = $this->consulterHref($url_val); |
$this->table_retour['valeur'] = $val->nom; |
$this->table_retour['valeur.code'] = $valeur; |
$this->table_retour['valeur.href'] = $url_val; |
if ($this->format_reponse == 'observations/id') { // si on est |
$contr = $this->chargerContributeurs($key); |
if (isset($contr['general'])) { |
$this->table_retour['contributeur'] = $contr['general']; |
$this->table_retour['contributeur.details'] = $contr['details']; |
} |
$source = $this->chargerSources($key); |
if (isset($source['general'])) $this->table_retour['sources'] = $source['general']; |
if (isset($source['autres'])) $this->table_retour['sources.autres'] = $source['autres']; |
} |
} |
|
public function chargerInfosGenerales() { |
list($table, $version) = explode('_v',$this->table); |
$version = str_replace('_', '.', $version); |
$requete = "SELECT createurs, date_creation FROM chorodep_meta WHERE version = \"$version\";"; |
$resultat = $this->getBdd()->recuperer($requete); //Debug::printr($resultat); |
|
if ($resultat == '') { //cas ou la requete comporte des erreurs |
$r = 'La requête SQL metadonnees formée comporte une erreur !!'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r); |
Debug::printr($requete); |
} elseif ($resultat) { |
$this->table_retour['type'] = 'chorologie'; |
$this->table_retour['date_observation'] = $resultat['date_creation']; |
$this->table_retour['observateur.details'] = $this->traiterChampFormateDCSV($resultat['createurs']); |
} |
} |
|
public function chargerContributeurs($dept) { |
$contributeur = array(); |
list($table, $version) = explode('_v',$this->table); |
$requete = "SELECT prenom, nom, courriel FROM chorodep_contributeurs WHERE `$dept` = '1';"; |
$resultat = $this->getBdd()->recupererTous($requete); //Debug::printr($resultat); |
|
if ($resultat == '') { //cas ou la requete comporte des erreurs |
$r = 'La requête SQL contributeurs formée comporte une erreur !!'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r); |
Debug::printr($requete); |
} elseif ($resultat) { |
$contributeur['general'] = ''; |
foreach ($resultat as $res) { |
$contributeur['general'] .= $res['prenom'].' '.$res['nom'].', '; |
foreach ($res as $cle => $valeur) { |
if ($valeur == "") { |
unset($res[$cle]); |
} |
} |
$type = ($res['prenom'] == '') ? 'o' : 'p'; |
$url = $this->ajouterHrefAutreProjet('ontologies', 'contactType:', $type, 'eflore'); |
$val = $this->consulterHref($url); |
$res['type'] = $val->nom; |
$res['type.code'] = $type; |
$res['type.href'] = $url; |
$contributeur['details'][] = $res; |
} |
} |
return $contributeur; |
} |
|
// prend en paramètre un champ comme createur, contributeur... sous forme p.prenom=ygggg,p.nom=fk;p.prenom=fdfs,p.nom=ek |
//retourne un tableau |
public function creerPointDetails($resultat) { |
$organismes = explode(';', $resultat); |
$num_org = 1; |
$general = ''; |
foreach ($organismes as $organisme) { |
$infos = explode(',', $organisme); |
$t = ''; |
$type = '.'; |
|
foreach ($infos as $info) { |
list($key, $val) = explode('=', $info); |
list($type, $champ) = explode('.', trim($key)); |
if ($type == 'p' && $champ == 'prenom') $general .= $val.' '; |
if (($type == 'p' || $type == 'o') && $champ == 'nom') $general .= $val.' '; |
$res[$num_org][$champ] = $val; |
$res[$num_org]['type'] = $type;// à modifier |
} |
$general = rtrim($general).', '; |
$num_org ++; |
} |
$this->table_retour['observateur'] = rtrim($general, ', '); |
$this->table_retour['observateur.details'] = $res; |
} |
/** |
* Recupère à partir de la valeur du champ les différentes informations séparées par ';' (stocke ds un tableau) |
* pour éditeurs, créateurs, contributeurs,... |
* (ex : nom=Tela Botanica,guid=urn:lsid:tela-botanica.org,courriel=accueil@tela-botanica.org,... |
*/ |
public function traiterChampFormateDCSV($val) { |
$tab = array(); |
$num_entite = 0; |
$type = ''; |
|
// découpe chaque participant |
$tab_entites = explode(';', $val); |
foreach ($tab_entites as $entite) { |
$tab[$num_entite] = array(); |
|
if ($entite != '') { |
// découpe les informations du participant |
$entite_detail = explode(',', $entite); |
foreach ($entite_detail as $detail) { |
|
if ($detail != '') { |
if (preg_match('/^([^=]*)\.([^=]+)=([^=]*)$/', $detail, $match)) { |
$tab[$num_entite][$match[2]] = $match[3]; |
if ($match[1] != $type) $type = $match[1]; |
} else { |
$tab[$num_entite][] = $detail; |
} |
} |
} |
if ($type != '') { |
if ($this->retour_format == 'max') { |
|
} |
} |
} |
$num_entite++; |
} |
return $tab; |
} |
|
public function chargerSources($dept) { |
$contributeur = array(); |
$requete = "SELECT biblio FROM chorodep_sources WHERE `$dept` = '1';"; |
$resultat = $this->getBdd()->recupererTous($requete); //Debug::printr($resultat); |
|
if ($resultat == '') { //cas ou la requete comporte des erreurs |
$r = 'La requête SQL sources formée comporte une erreur !!'; |
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $r); |
Debug::printr($requete); |
} elseif ($resultat) { |
foreach ($resultat as $cle=>$res) { |
if ($cle == 0) { |
$contributeur['general'] = $res['biblio']; |
} else { |
$contributeur['autres'][] = $res['biblio']; |
} |
} |
} |
return $contributeur; |
} |
|
|
/* public function formaterObservationsIdChamp($resultat) { |
|
//on recupère tous les resultats possibles |
$reponse = $this->formaterObservationsId($resultat); |
$this->table_retour = array(); |
|
//on recupère les résultats demandés à partir du tableau de résultat complet |
$this->table_retour['id'] = $reponse['id']; |
$champs = explode(' ', $this->table_ressources[1]); |
|
foreach ($champs as $champ) { |
|
if ($this->verifierValiditeChamp($champ, $reponse)) { |
|
if (strrpos($champ, '.*') !== false) { |
$this->afficherPointEtoile($champ, $reponse); |
|
} else { |
if (isset($reponse[$champ])) { |
$this->table_retour[$champ] = $reponse[$champ]; |
} else { |
$this->table_retour[$champ] = null; |
} |
} |
} |
} |
return $this->table_retour; |
}*/ |
|
// +-------------------------------------------------------------------------------------------------------------------+ |
/** |
* Description : |
* Est appelée pour former l'url complete des resultats precedants ou suivants. |
* @param int : Permet de connaitre le nombre de noms obtenus par la requete |
* @return string Retourne l'url complete des resultats precedents ou suivant sous la forme d'un tableau |
*/ |
public function formulerUrlObs($suivant, $total, $id = null) { |
$debut_url = Config::get('url_service').$id.'?'; |
//on recrée l'url sans les parametres de navigation qui seront rajouter ci-apres. On les enlève dc de la table des parametres |
$table_bis = $this->table_param; |
if (isset($table_bis['navigation.depart'] )) { |
unset($table_bis['navigation.depart']); |
} |
if (isset($table_bis['navigation.limite'])) { |
unset($table_bis['navigation.limite']); |
} |
$parametre_url = http_build_query($table_bis); |
//on recupere les limites |
$url['suivant'] = $this->recupererLesLimitesSuivantesObs($suivant, $total); |
$url['precedent'] = $this->recupererLesLimitesPrecedentesObs($suivant); |
//on reconstitue les deux urls avec leurs limites |
foreach ($url as $key => $limite) { |
if ($limite != '') { |
if ($parametre_url == '') { |
//si il n'y a aucun parametres, seules les limites sont à ajouter.On enleve dc le signe & du début |
$limite = str_replace('&navigation.depart=', 'navigation.depart=', $limite); |
if (strpos($limite, 'navigation.depart') === false) { |
$limite = str_replace('&navigation.limite=', 'navigation.limite=', $limite); |
} |
} |
$url_complete = $debut_url.$parametre_url.$limite; |
$url[$key] = $url_complete; |
} |
} |
return $url; |
} |
|
/** |
* Description : |
* Permet de former les limites de la requete retournant les résultats suivants. |
* Cette url sera afficher dans l'entete de la reponse retournée en format JSON (retour.format=defaut). |
* @param int : $nb_resultat : Permet de connaitre le nombre de résultats obtenus par la requete |
* @return string : la fin de l'url decrivant les limites des resultats suivants. Si aucun résultats ne suient, |
* une chaine de caractère vide est retournée |
*/ |
public function recupererLesLimitesSuivantesObs($suivant, $total) { |
if ($this->limite_requete['limite'] <= $total) { |
$url_suivante = '&navigation.depart='.$suivant.'&navigation.limite='.$this->limite_requete['limite']; |
} else { |
$url_suivante = ''; |
} |
return $url_suivante; |
} |
|
/** |
* Description : |
* Permet de former les limites de la requete retournant les résultats precedents. |
* Cette url sera afficher dans l'entete de la taxons/105reponse retournée en format JSON (retour.format=defaut) |
* @return string : la fin de l'url decrivant les limites des resultats precedents. |
* Si aucun résultats ne precedent, une chaine de caractère vide est retournée |
*/ |
public function recupererLesLimitesPrecedentesObs($suivant) { |
$url_precedente = ''; |
if (isset($this->table_param['navigation_depart'])) { // si on utilise un parametre de départ |
// si l'adresse d'appel de la page est inférieur au départ |
$regex = '/http:\/\/.*\/service:eflore:0.1\/chorodep\/observations\?.*navigation.depart=(.*\:[0-9]*).*/'; |
if (isset($_SERVER['HTTP_REFERER']) && preg_match($regex, $_SERVER['HTTP_REFERER'], $match)) { |
if ($match[1] != $this->table_param['navigation_depart'] && $match[1] != $suivant) { |
$url_precedente = '&navigation.depart='.$match[1].'&navigation.limite='.$this->limite_requete['limite']; |
} |
} else { |
$url_precedente = '&navigation.limite='.$this->limite_requete['limite']; |
} |
} |
return $url_precedente; |
} |
|
} |
?> |