* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class InventoryTaxonPresent extends Cel { private $source = "chorologie"; /** * Renvoie les zones où le taxon a été observé * * uid[0] : référentiel * uid[1] : numéro nomenclatural */ public function getElement($uid) { // Référentiel et num nom obligatoires if(count($uid) < 2) { return null; } $referentiel = $uid[0]; $num_nom = intval($uid[1]); $this->source = !empty($_GET['source']) ? $_GET['source'] : $this->source; if(!empty($_GET['ce_zone_geo']) || !empty($_GET['pays'])) { $zone_geo = !empty($_GET['ce_zone_geo']) ? $_GET['ce_zone_geo'] : null; $pays = !empty($_GET['pays']) ? $_GET['pays'] : null; if($this->source == "chorologie") { $res = $this->taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo); } else if($this->source == "cel") { $res = $this->taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays, $zone_geo); } } else { $res = $this->obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom); } $this->envoyerJson($res); } private function taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo) { $res = ""; // Pour le moment on ne gère que bdtfx, il suffira d'ajouter l'appel à d'autres ws de chorologies // dès qu'on les obtiendra (on pourrait peut être déjà le faire avec les antilles) switch($referentiel) { case "bdtfx": $dpt = $this->convertirZoneGeoVersDepartement($zone_geo); $base_url_choro = $this->config['eflore']['url_service_chorologie_presence']; $url_choro = str_replace('{num_nom}', $num_nom, $base_url_choro).'/'.$dpt; $res = json_decode(file_get_contents($url_choro), true); // Renvoyer un int "stringé" est bien plus pratique pour le parsing $res = (string)intval(!empty($res) && $res['present']); break; default: $res = ""; } return $res; } private function convertirZoneGeoVersDepartement($zone_geo) { return substr(str_replace('INSEE-C:', '', $zone_geo), 0, 2); } private function taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays = null, $zone_geo = null) { $referentiel = Cel::db()->proteger($referentiel); $num_nom = Cel::db()->proteger($num_nom); $requete = "SELECT COUNT(id_observation) > 1 as present FROM cel_obs ". "WHERE nom_referentiel = ".$referentiel." AND ". "(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.") ". ($zone_geo != null ? " AND ce_zone_geo LIKE ".Cel::db()->proteger($zone_geo.'%') : ''). ($pays != null ? " AND pays = ".Cel::db()->proteger($pays) : ''); $res = Cel::db()->requeter($requete); return $res[0]['present']; } private function obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom) { $referentiel = Cel::db()->proteger($referentiel); $num_nom = Cel::db()->proteger($num_nom); $requete = "SELECT DISTINCT pays, ce_zone_geo FROM cel_obs WHERE nom_referentiel = ".$referentiel." AND ". "(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.")"; $res = Cel::db()->requeter($requete); return $this->formaterResultat($res); } private function formaterResultat($res) { $res_fmt = array(); foreach($res as &$r) { $pays = !empty($r['pays']) ? $r['pays'] : 'inconnu'; if($this->doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays)) { $res_fmt[$pays] = array(); } if($this->estUneZoneGeoBienFormee($r)) { $res_fmt[$pays][] = $r['ce_zone_geo']; } } return $res_fmt; } private function doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays) { return !isset($res_fmt[$pays]) && $this->estUneZoneGeoBienFormee($r); } private function estUneZoneGeoBienFormee($r) { return !empty($r['ce_zone_geo']) && $r['ce_zone_geo'] != "INSEE-C:"; } } ?>