* @license GPL v3 * @license CECILL v2 * @version 1.0 * @copyright 1999-${year} Tela Botanica (accueil@tela-botanica.org) */ class Taxons extends CommunNomsTaxons { /** Permet de stocker la requete formulée taxons | taxons/#id | taxons/#id/#champ+#champ ...*/ protected $format_reponse = 'taxons'; protected $service = 'taxons'; protected $requete_champ = 'num_nom, nom_sci, num_nom_retenu, num_taxonomique, rang '; protected $requete_condition = null; protected $requete_group_by = ' '; /** Permet de stocker les limite de la requete SQL (par défaut seul les 100 premiers résultats seront retournés).*/ protected $limite_requete = array('depart' => 0, 'limite' => 100); protected $num_nom_taxon; //Stocke le num_nom du nom retenu du num_nom recherché protected $presence_num_tax = true; public function consulter($ressources, $parametres) { return parent::consulter($ressources, $parametres); } public function traiterParametresSpecifiques() { $this->requete_condition[] = 'num_nom = num_nom_retenu'; foreach ($this->parametres as $param => $val) { switch ($param) { case 'masque' : $this->ajouterFiltreMasque('nom_sci', $val); break; case 'masque.nt' : $this->requete_condition[] = "num_taxonomique IN ($val)"; $this->masque[] = "num_taxonomique=$val"; break; case 'masque.rg': $this->requete_condition[] = 'rang = '.$this->getBdd()->proteger($val); $this->masque[] = "rang=$val"; break; case 'masque.ref' : $this->ajouterFiltreMasque('referentiel', $val); break; } } } //------------------------------------------Fonction ressources--------------------------------------------------------------------- public function gererNumTax() { if (!in_array('num_taxonomique', $this->champs_table)) { $this->presence_num_tax = false; $this->requete_champ = str_replace(', num_taxonomique ', '', $this->requete_champ); } else { $this->presence_num_tax = true; } } public function traiterRessourcesIdentifiant() { $this->format_reponse = 'taxons/id'; $this->traiterRessourceNtId(); $this->num_nom_taxon = $this->recupererNumNomTaxon(); //on recupere le taxon correspondant au num_nom recherché if ($this->entete_http == '') { $this->requete_condition[0] = 'num_nom = '.$this->getBdd()->proteger($this->num_nom_taxon); if (isset($this->ressources[1]) && !empty($this->ressources[1])) { //---------------- requete de type taxons/#id/#champ+#champ-------------------------------------- if ($this->ressources[1] != 'relations') { // SELECT *, nom_sci FROM bftfx_v2_00 WHERE num_nom = X; $this->requete_champ = ' *, nom_sci '; $this->format_reponse .= '/champ'; //---------------- requete de type taxons/#id/relations/#relation-------------------------------- } elseif ($this->ressources[1] == 'relations') { $this->traiterRessourceIdRelations(); } else { $e = 'Erreur dans votre requête
Ressources disponibles :
  • #id/relations
  • #id/#champ+#champ
  • #id/relations
  • #id/relations/inferieurs
  • #id/relations/superieurs
  • '; $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e); } } else { //--------------- requete de type taxons/#id----------------------------------------------------- $this->requete_champ = ' *, nom_sci '; } } } public function traiterRessourceNtId() { if (strrpos($this->ressources[0], 'nt:') !== false) { if ($this->presence_num_tax) { // SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = num_nom_retenu AND num_taxonomique = X; $this->requete_condition[0] = ' num_taxonomique = ' .str_replace('nt:', '', $this->ressources[0]).' '; } else { $e = 'Erreur dans votre requête :
    Le numéro taxonomique n\'existe pas dans ce projet'; $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e); } } else { // SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = (SELECT num_nom_retenu FROM bdtfx_v2_00 WHERE num_nom = X); $this->requete_condition[0] = 'num_nom = '.$this->ressources[0]; } } /** Permet de récupérer le num_nom du taxon recherché. Soit le numéro taxonomique est demandé (avec nt: ) * soit un num_nom dont on recherche le num_nom_retenu */ public function recupererNumNomTaxon() { $identifiant = ''; if ($this->entete_http == '') { //on récupere l'identifiant du taxon correspondant au num_nom ou num_taxonomique demandé pour pouvoir l'afficher $req_tax = 'SELECT num_nom_retenu FROM '.$this->table.' WHERE '.$this->requete_condition[0]; $res_tax = $this->getBdd()->recuperer($req_tax); //on recherche ensuite les identifiants des taxons supérieurs ou inférieurs if ($res_tax && $res_tax != '') { $identifiant = $res_tax['num_nom_retenu']; } else { $e = 'Le numéro de taxon ou l\'identifiant de nom correspondant au num_nom ' .$this->ressources[0].' n\'existe pas dans la base.'; $this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e); Debug::printr($req_tax); } } return $identifiant; } public function traiterRessourceIdRelations() { //----------------- requete de type taxons/#id/relations------------------------------------------- // SELECT *, nom_sci FROM bftfx_v2_00 WHERE num_nom = X; $this->format_reponse .= '/relations'; if (isset($this->ressources[2]) && !empty($this->ressources[2])) { //------------- requete de type taxons/#id/relations/#relation-------------------------------- switch ($this->ressources[2]) { case 'superieurs' : $rel = 'recupererIdSup'; $this->format_reponse .= '/superieurs'; $this->traiterRessourceIdRelationInfSup($rel); break; case 'inferieurs' : $rel = 'recupererIdInf'; $this->format_reponse .= '/inferieurs'; $this->traiterRessourceIdRelationInfSup($rel); break; case 'hierarchie' : $rel = 'recupererIdHierarchie'; $this->format_reponse .= '/hierarchie'; $this->traiterRessourceIdRelationHierarchie($rel); break; default : $e = 'Erreur dans votre requête
    Ressources disponibles :
  • taxons/#id/relations
  • #id/relations/inferieurs
  • #id/relations/superieurs
  • '; $this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e); break; } } } public function traiterRessourceIdRelationHierarchie($rel) { //Appel de la fct récupérerIdSup ou recupererIdInf : retourne les num_nom des noms inferieurs ou superieurs $res_relation = $this->$rel(); //analyse du résultat retourné par la requete de recherche des identifiants correspondant aux taxons inf|sup : if ($res_relation == '') { //dans le cas ou la requete comporte des erreurs $e = 'Fct traiterRessourceIdRelationInfSup : La requête forme comporte une erreur!'; $this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e); } elseif ($res_relation) { //dans le cas ou une ou plusieurs relations est retournée, on récupère les identifiants ss la forme (id, id, id) foreach ($res_relation as $ligne) $res[] = $ligne['num_nom']; $res = implode(',',$res); $this->requete_condition[0] = "num_nom IN ($res)"; $this->requete_champ .= ', rang, num_tax_sup '; } else { //dans le cas ou aucune relation n'existe $res = array($this->num_nom_taxon => null); $this->corps_http = json_encode($res); $this->entete_http = RestServeur::HTTP_CODE_OK; } } public function recupererIdHierarchie() { $req_relation = 'SELECT num_nom FROM '.$this->table.' '. ' WHERE hierarchie LIKE CONCAT('. '(SELECT hierarchie FROM '. $this->table.' '. 'WHERE num_nom = '.$this->getBdd()->proteger($this->num_nom_taxon).')'. ', '.$this->getBdd()->proteger($this->num_nom_taxon.'-%'). ')'; $res_relation = $this->getBdd()->recupererTous($req_relation); return $res_relation; } public function traiterRessourceIdRelationInfSup($rel) { //Appel de la fct récupérerIdSup ou recupererIdInf : retourne les num_nom des noms inferieurs ou superieurs $res_relation = $this->$rel(); //analyse du résultat retourné par la requete de recherche des identifiants correspondant aux taxons inf|sup : if ($res_relation == '') { //dans le cas ou la requete comporte des erreurs $e = 'Fct traiterRessourceIdRelationInfSup : La requête forme comporte une erreur!'; $this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e); } elseif ($res_relation) { //dans le cas ou une ou plusieurs relations est retournée, on récupère les identifiants ss la forme (id, id, id) foreach ($res_relation as $ligne) $res[] = $ligne['num_nom']; $res = implode(',',$res); $this->requete_condition[0] = "num_nom IN ($res)"; $this->requete_champ .= ', rang, num_tax_sup '; } else { //dans le cas ou aucune relation n'existe $res = array($this->num_nom_taxon => null); $this->corps_http = json_encode($res); $this->entete_http = RestServeur::HTTP_CODE_OK; } } public function recupererIdInf() { //SELECT num_nom FROM bfdtx_v2_00 WHERE num_tax_sup = (SELECT num_nom FROM bdtfx_v2_00 WHERE num_nom = X); $req_relation = 'SELECT num_nom FROM '.$this->table .' WHERE num_nom = num_nom_retenu AND num_tax_sup = (SELECT num_nom FROM ' .$this->table .' WHERE '.implode(' AND ', $this->requete_condition).')'; $res_relation = $this->getBdd()->recupererTous($req_relation); return $res_relation; } public function recupererIdSup() { //SELECT num_nom FROM bfdtx_v2_00 WHERE num_nom = (SELECT num_tax_sup FROM bdtfx_v2_00 WHERE num_nom = X); $this->requete_condition[] = "num_nom = num_nom_retenu" ; $req_relation = 'SELECT num_tax_sup as num_nom FROM '.$this->table .' WHERE '.implode(' AND ', $this->requete_condition); $res_relation = $this->getBdd()->recupererTous($req_relation); return $res_relation; } public function traiterRessourceStatsInitiales() { // SELECT count(nom_sci) as nb, rang, left(nom_sci, 2) as lettre FROM bdtfx_v2_00 GROUP BY rang, left(nom_sci, 2); $this->format_reponse = 'taxons/stats/initiales'; $this->requete_champ = 'count(nom_sci) as nb, rang, left(nom_sci, 2) as lettre '; $this->requete_group_by = ' GROUP BY rang, left(nom_sci, 2) '; } public function traiterRessourceStatsRangs() { // SELECT count(*) as nombre, rang FROM bdtfx_v2_00 [WHERE rang = 290] GROUP BY rang ORDER BY rang; $this->format_reponse = 'taxons/stats/rangs'; $this->requete_champ = 'count(*) as nombre, rang '; $this->requete_group_by = ' GROUP BY rang ORDER BY rang '; } public function traiterRessourceStatsAnnees() { // SELECT count(*) as nombre, annee FROM bdtfx_v2_00 GROUP BY annee ORDER BY annee; $this->format_reponse = 'taxons/stats/annees'; $this->requete_champ = 'count(*) as nombre, annee '; $this->requete_group_by = ' GROUP BY annee ORDER BY annee '; } //-----------------------------FONCTIONS DASSEMBLAGE DE LA REQUETE----------------------------------------------------- public function assemblerLaRequete() { if ($this->format_reponse != 'taxons/stats/initiales') { $this->mettreAuFormat(); //on remplace les nom_sci par les nom_sci_html } $requete = ' SELECT '.$this->requete_champ. ' FROM '.$this->table .$this->retournerRequeteCondition() .$this->requete_group_by .$this->formerRequeteLimite(); return $requete; } public function formerRequeteLimite() { if ($this->format_reponse != 'taxons' && $this->format_reponse != 'taxons/id/relations/homonymie') { $this->requete_limite = ''; } elseif (($depart = $this->limite_requete['depart']) > ($this->total_resultat = $this->recupererTotalResultat())) { $this->limite_requete['depart'] = (($this->total_resultat - $this->limite_requete['limite']) < 0) ? 0 : ($this->total_resultat - $this->limite_requete['limite']); $this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite']; } else { $this->requete_limite = ' LIMIT '.$this->limite_requete['depart'].', '.$this->limite_requete['limite']; } return $this->requete_limite; } public function retournerRequeteCondition() { $condition = ''; if ($this->requete_condition) { $condition = ' WHERE '.implode(' AND ', $this->requete_condition); } return $condition; } public function recupererTotalResultat() { $requete = 'SELECT count(*) as nombre FROM '.$this->table.$this->retournerRequeteCondition().$this->requete_group_by; $res = $this->getBdd()->recuperer($requete); if ($res) { $total = $res['nombre']; } return $total; } //-------------------------FONCTIONS DE FORMATION DU RESULTAT----------------------------------------------------------- /** Permet de récupérer le résultat à retourner propre à chaque requete et de l'encoder en json*/ public function retournerResultatFormate($resultat, $version) { switch ($this->format_reponse) { case 'taxons/id' ://ds CommunNomsTaxons $reponse = $this->formaterId($resultat[0]); break; case 'taxons/id/champ' ://ds CommunNomsTaxons $reponse = $this->formaterIdChamp($resultat[0]); break; case 'taxons/id/relations' : $reponse = $this->formaterIdRelations($resultat[0],$version); break; case 'taxons/id/relations/superieurs' : $reponse = $this->formaterIdSuperieur($resultat, $version); break; case 'taxons/id/relations/inferieurs' : $reponse = $this->formaterIdInferieur($resultat); break; case 'taxons/id/relations/hierarchie' : // le formatage de la hiérarchie est identique aux relations inférieures $reponse = $this->formaterIdInferieur($resultat); break; case 'taxons/stats/annees' : //ds CommunNomsTaxons $reponse = $this->formaterStatsAnnee($resultat); break; case 'taxons/stats/rangs' ://ds CommunNomsTaxons $reponse = $this->formaterStatsRang($resultat); break; case 'taxons/stats/initiales' ://ds CommunNomsTaxons $reponse = $this->formaterStatsInitiales($resultat); break; case 'taxons' : $reponse = $this->formatertaxons($resultat); break; } return $reponse; } //----------------------concerne les resultats pour des requetes de type /noms avec ou sans paramètres-------------- public function formaterTaxons($resultat) { if ($this->parametres['retour.format'] == 'oss') { $reponse = $this->formaterEnOss($resultat); } else { $reponse = $this->formaterEnJsonMax($resultat); } return $reponse; } public function formaterEnJsonMax($resultat) { //print_r($resultat); $this->recupererTableSignification('correspondance_champs,champs_api,champs_comp'); $masque = $this->recupererMasquePrincipal(); if (isset($masque)) $resultat = $this->trierRechercheFloue($this->parametres[$masque[0]], $resultat, $masque[1]); if (isset($this->masque)) $this->table_retour['masque'] = implode('&', $this->masque); $this->afficherEnteteResultat('/'.$this->service); $table_retour_json['entete'] = $this->table_retour; $this->table_retour = array(); //on remplit la table $table_retour_json['resultat'] $tab_tax_inf = $this->recupererListeTaxonInf($resultat); foreach ($resultat as $tab) { $num = $tab['num_nom']; if (isset($this->parametres['masque.nt'])) $this->afficherDonnees('num_taxonomique', $tab['num_taxonomique']); $this->afficherNomHrefRetenu($tab, $num); $this->afficherTaxonInfNb($num, $tab_tax_inf); $resultat_json[$num] = $this->table_retour; $this->table_retour = array(); //on vide le tableau table_retour } $table_retour_json['resultat'] = $resultat_json; return $table_retour_json; } //--------------------concerne les resultats pour des requetes de type noms/id---------------------------------------- public function formaterIdRelations($resultat, $version) { $this->recupererTableSignification('correspondance_champs,champs_api,champs_comp'); $this->resultat_req = $resultat; $retour_id_rel = array ('entete' => array()); //on initialise pr que l'entete apparaisse en premier $superieurs = $this->ajouterRelations('superieurs'); //, $version); if (isset($superieurs)) $retour_id_rel['resultat']['superieurs'] = $superieurs; $inferieurs = $this->ajouterRelations('inferieurs', $version); if (isset($inferieurs)) $retour_id_rel['resultat']['inferieurs'] = $inferieurs; if (!isset($retour_id_rel['resultat'])) { //on renvoit un tableau null si il n'existe aucune relations $retour_id_rel = 'null'; } else { //on rajoute l'entete si des relations existent $this->afficherDonnees('num_nom', $this->num_nom_taxon); //$this->afficherEnteteResultat($resultat, '/'.$this->service.'/'.$this->ressources[0].'/relations/synonymie'); $retour_id_rel['entete'] = $this->table_retour; $this->table_retour = array(); } return $retour_id_rel; } public function ajouterRelations($relation, $version) { $version = str_replace(Config::get('bdd_table').'_', '', $version); $res = null; $taxon = $this->num_nom_taxon; $parametres_url = ''; if ($this->parametres != array()) $parametres_url = '?'.http_build_query($this->parametres, '', '&'); $url = Config::get('url_service').'/' .$this->service.'/'.$version.'/' .$this->ressources[0].'/relations/' .$relation.$parametres_url; $relation = $this->consulterHref($url); if (isset($relation->resultat)) { $res = $relation->resultat; } elseif (isset($relation->$taxon)) { //pour les relations inf et sup $res = $relation->$taxon; } return $res; } public function formaterIdSuperieur($resultat, $version) { $this->recupererTableSignification('correspondance_champs,champs_api,champs_comp'); $tab_relation = null; //si il n'existe aucune relation $taxon_sup_traites = array(); if (($resultat) != '' ) { //on recupere d'abord les rangs supérieurs $sup = $resultat[0]; do { $sup = $this->recupererIdSuperieur($sup['num_tax_sup'], $version); if(!in_array($sup['num_nom'], $taxon_sup_traites)) { $taxon_sup_traites[] = $sup['num_nom']; } else { $sup = null; } if ($sup['rang'] == '0') $sup['rang'] = '10'; //erreur dans la base if (isset($sup)) $resultat[] = $sup; } while ($sup != null); krsort($resultat); //on les affiche ensuite foreach ($resultat as $tab) { $this->resultat_req = $tab; $num = $tab['num_nom']; $this->afficherNomHrefRetenu($tab, $num); $this->afficherDonnees('rang', $tab['rang']); $tab_inf[$num] = $this->table_retour; $tab_inf[$num]['num_nom'] = $tab['num_nom']; $this->table_retour = array(); } $tab_relation[$this->num_nom_taxon] = $tab_inf; } return $tab_relation; } public function recupererIdSuperieur($id, $version) { $req = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci FROM ' .$version.' WHERE num_nom = '.$this->getBdd()->proteger($id); $res = $this->getBdd()->recupererTous($req); if ($res) { $resultat = $res[0]; } else { $resultat = null; //on return null si il n'y a pas de taxon superieur } return $resultat; } public function formaterIdInferieur($resultat) { // Attention à l'ordre, on doit d'abord récupérer correpondance_champs avant champs_api $this->recupererTableSignification('correspondance_champs,champs_api,champs_comp'); $tab_relation = null; if (($resultat) != array()) { foreach ($resultat as $tab) { $this->resultat_req = $tab; $num = $tab['num_nom']; $this->afficherNomHrefRetenu($tab, $num); $this->afficherDonnees('rang', $tab['rang']); $tab_inf[$num] = $this->table_retour; $tab_inf[$num]['nom_sci'] = $tab['nom_sci']; $tab_inf[$num]['num_nom'] = $tab['num_nom']; $this->table_retour = array(); } $tab_relation[$this->num_nom_taxon] = $tab_inf; } return $tab_relation; } public function afficherTaxonInfNb($num, $tab_tax_inf) { foreach ($tab_tax_inf as $taxNb) { if ($taxNb['num_tax_sup'] == $num) { $this->table_retour['taxon_inferieur_nbre'] = $taxNb['nb']; } } if (!isset($this->table_retour['taxon_inferieur_nbre'])) { $this->table_retour['taxon_inferieur_nbre'] = '0'; } } public function recupererListeTaxonInf($resultat) { // SELECT num_tax_sup, count(*) as nb FROM bdtfx_v2_00 WHERE num_tax_sup IN (id, id, id) AND num_nom = num_nom_retenu GROUP BY num_tax_sup'; foreach ($resultat as $tab) { $tab_num[] = $tab['num_nom']; //on regroupe ici les id des taxons dont on cherche le nb de taxon inf } $req = 'SELECT num_tax_sup, count(*) as nb FROM '.$this->table .' WHERE num_tax_sup IN ('.implode(',',$tab_num) .') AND num_nom = num_nom_retenu GROUP BY num_tax_sup'; $res = $this->getBdd()->recupererTous($req); if ($res) { $resultat = $res; } else { $resultat = array(); //on retourne un tableau vide s'il n'y a pas de taxon inférieurs } return $resultat; } } ?>