Rev 2691 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Service vérifiant si un taxon a été signalé ou non dans une zone géographique donnée** @internal Mininum PHP version : 5.2* @category CEL* @package Services* @subpackage Observations* @version 0.1* @author Mathias CHOUET <mathias@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurelien PERONNET <aurelien@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>* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>*/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 obligatoiresif(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:";}}?>