1,18 → 1,9 |
<?php |
/** |
* Retourne des infos sur une espèce : noms vernaculaires français, statuts de |
* protection, num_nom, num_tax, nom_sci, et nombre de zones dans lesquelles elle |
* est présente. |
* Interrogeable par nn ou nt |
* |
* Il faudrait appeler les services correspondants pour obtenir les infos sur les |
* noms vernaculaires et les statuts de protection, mais c'est pas performant. |
* Néanmoins ce serait une arcitecture plus solide en cas de changement - pas le |
* temps d'y réfléchir mieux. |
* Retourne la liste des noms répertoriés par le projet chorodep |
* |
* @package chorodep |
* @author Mathias Chouet <mathias@tela-botanica.org> |
* @author Aurélien Perronnet <aurelien@tela-botanica.org> |
* @author Tela Botanica <equipe-dev@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 |
19,160 → 10,160 |
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org) |
*/ |
|
class InfosEspece extends Commun { |
class Noms extends Commun { |
|
protected $serviceNom = 'InfosEspece'; |
protected $serviceNom = 'noms'; |
protected $table; |
protected $masque; |
protected $navigation; |
protected $table; |
protected $tableNomsVernaculaires; |
protected $urlStatutsProtection; |
protected $depart; |
protected $limite; |
protected $tri; |
protected $tri_dir; |
|
public function init() { |
public function __construct($config = null) { |
parent::__construct($config); |
$this->masque = array(); |
$this->depart = 0; |
$this->limite = 20; |
$this->tri = 'nom_sci'; |
$this->tri_dir = 'ASC'; |
$this->init(); |
} |
|
protected function init() { |
$this->traiterVersionProjet(); |
$this->table = $this->table_version[0]; |
$this->tableNomsVernaculaires = $this->config['table_nv']; |
$this->urlStatutsProtection = $this->config['url_service_sptb']; |
} |
|
public function consulter($ressources, $parametres) { |
|
$retour = null; |
if(preg_match("/^(nt|nn):([0-9]+)$/", $ressources[0], $matches)) { |
$champ_nt_ou_nn = ($matches[1] == "nn") ? "num_nom" : "num_tax"; |
|
if(count($ressources) == 1) { |
// toutes les infos |
$infos_espece = $this->getInfosEspece($champ_nt_ou_nn, $matches[2]); |
$retour = array_merge($infos_espece, $this->getInfosPresence($champ_nt_ou_nn, $matches[2])); |
$statuts_protection = array( |
'statuts_protection' => $this->getStatutsProtection($champ_nt_ou_nn, $matches[2]) |
); |
$retour = array_merge($retour, $statuts_protection); |
$noms_vernaculaires = array( |
'noms_vernaculaires_fr' => $this->getNomsVernaculaires($champ_nt_ou_nn, $matches[2]) |
); |
$retour = array_merge($retour, $noms_vernaculaires); |
} else { |
// sous action du service |
$retour = array(); |
switch($ressources[1]) { |
case "noms-vernaculaires": |
$retour = array('noms_vernaculaires_fr' => $this->getNomsVernaculaires($champ_nt_ou_nn, $matches[2])); |
break; |
case "statuts-protection": |
$retour = array('statuts_protection' => $this->getStatutsProtection($champ_nt_ou_nn, $matches[2])); |
break; |
case "presence": |
$retour = $this->getInfosPresence($champ_nt_ou_nn, $matches[2]); |
break; |
default: |
$retour = "Actions possibles: noms-vernaculaires, statuts-protection, presence"; |
} |
} |
} else { |
// TODO : envoyer message erreur; |
/** |
* Récupère les paramètres de navigation |
* @param type $parametres |
*/ |
protected function setDepartLimite($parametres) { |
if(isset($parametres['navigation.depart']) && $parametres['navigation.depart'] != '') { |
$this->depart = max(0, intval($parametres['navigation.depart'])); |
} |
return $retour; |
if(isset($parametres['navigation.limite']) && $parametres['navigation.limite'] != '') { |
$this->limite = max(0, intval($parametres['navigation.limite'])); |
} |
} |
|
/** |
* Toutes les infos sauf noms vernaculaires et statuts de protection |
* Récupère les paramètres de filtrage |
* @param type $parametres |
*/ |
protected function getInfosEspece($champ_nt_ou_nn, $nt_ou_nn) { |
$req = "SELECT DISTINCT num_nom, num_tax, nom_sci" |
. " FROM " . $this->table |
. " WHERE $champ_nt_ou_nn = " . $this->getBdd()->proteger($nt_ou_nn); |
|
$resultat = $this->getBdd()->recuperer($req); |
|
return $resultat; |
protected function setMasque($parametres) { |
if(isset($parametres['masque.nom']) && $parametres['masque.nom'] != '') { |
$this->masque['nom'] = $parametres['masque.nom']; |
} |
if(isset($parametres['masque.zone-geo']) && $parametres['masque.zone-geo'] != '') { |
$zg = $parametres['masque.zone-geo']; |
// Tango Corse |
if ($zg == '2A' || $zg == '2B') { |
$zg = '20'; |
} |
$this->masque['zone-geo'] = $zg; |
} |
} |
|
/** |
* Construit une opération d'addition entre toutes les colonnes de la table |
* chorodep représentant un département |
* Récupère les paramètres de tri |
* @param type $parametres |
*/ |
protected function construireSommeColonnes() { |
$colonnes = array(); |
for ($i=1; $i <= 95; $i++) { |
$colonnes[] = '`' . ($i > 9 ? $i : "0$i") . '`'; |
protected function setTri($parametres) { |
if(isset($parametres['retour.tri']) && $parametres['retour.tri'] != '') { |
$this->tri = $parametres['retour.tri']; |
} |
$somme = implode('+', $colonnes); |
return $somme; |
if(isset($parametres['retour.ordre']) && in_array($parametres['retour.ordre'], array('ASC', 'DESC'))) { |
$this->tri_dir = $parametres['retour.ordre']; |
} |
} |
|
protected function getInfosPresence($champ_nt_ou_nn, $nt_ou_nn) { |
$req = "SELECT " . $this->construireSommeColonnes() . " as nb_presence_zones". |
" FROM ".$this->table. |
" WHERE ".$champ_nt_ou_nn." = ".$this->getBdd()->proteger($nt_ou_nn); |
public function consulter($ressources, $parametres) { |
$donnees = array(); |
|
$resultat = $this->getBdd()->recuperer($req); |
return $resultat; |
} |
$this->setDepartLimite($parametres); |
$this->setMasque($parametres); |
$this->setTri($parametres); |
$noms = $this->listeNoms(); |
$total = $this->compterNoms(); |
|
/** |
* Appelle le WS sptb car la table ne contient pas toutes les infos (il faut |
* agréger les taxons supérieurs) |
*/ |
protected function getStatutsProtection($champ_nt_ou_nn, $nt_ou_nn) { |
$num_noms = array(); |
if ($champ_nt_ou_nn == "num_tax") { |
// le service sptb n'accepte pas les nt (on croit que si mais en fait |
// non) alors on chope les nn associés à ce nt dans chorodep - c'est |
// moisi mais c'est toujours mieux que si c'était pire |
$numTaxP = $this->getBdd()->proteger($nt_ou_nn); |
$req = "SELECT DISTINCT num_nom" |
. " FROM " . $this->table |
. " WHERE num_tax = $numTaxP"; |
$url_base = Config::get('url_service'); |
|
$resultat = $this->getBdd()->recupererTous($req); |
foreach($resultat as $res) { |
$num_noms[] = $res['num_nom']; |
} |
} else { |
$num_noms[] = $nt_ou_nn; |
$masqueEnParams = array(); |
foreach ($this->masque as $k => $v) { |
$masqueEnParams[] = 'masque.' . $k . '=' . $v; |
} |
$masqueEnParams = implode('&', $masqueEnParams); |
|
$statuts = array(); |
// récupération des statuts pour chaque num_nom |
foreach ($num_noms as $nn) { |
$url = sprintf($this->urlStatutsProtection, $nn); |
$donnees = $this->getRestClient()->consulter($url); |
$donnees = json_decode($donnees, true); |
foreach ($donnees as $d) { |
$statuts[] = array( |
'zone' => $d['code_zone_application'], |
'lien' => $d['hyperlien_legifrance'] |
); |
} |
$donnees['entete'] = array( |
'masque' => $masqueEnParams, |
'total' => $total, |
'depart' => $this->depart, |
'limite' => $this->limite |
); |
if ($this->depart > 0) { |
$donnees['entete']['href.precedent'] = $url_base . '/' . $this->serviceNom . '?' |
. 'navigation.depart=' . max(0, ($this->depart - $this->limite)) . '&navigation.limite=' . $this->limite |
. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir |
. '&' . $masqueEnParams; |
} |
if (($this->depart + $this->limite) < $total ) { |
$donnees['entete']['href.suivant'] = $url_base . '/' . $this->serviceNom . '?' |
. 'navigation.depart=' . ($this->depart + $this->limite) . '&navigation.limite=' . $this->limite |
. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir |
. '&' . $masqueEnParams; |
} |
$donnees['resultat'] = $noms; |
|
return $statuts; |
return $donnees; |
} |
|
// @TODO faire un appel au WS nvjfl "for the sake of non-nodebagging" ? |
protected function getNomsVernaculaires($champ_nt_ou_nn, $nt_ou_nn) { |
$numP = $this->getBdd()->proteger($nt_ou_nn); |
$req = "SELECT DISTINCT nv.nom_vernaculaire" |
. " FROM " . $this->tableNomsVernaculaires . " nv"; |
if ($champ_nt_ou_nn == "num_nom") { |
$req .= " LEFT JOIN " . $this->table . " c ON nv.num_taxon = c.num_tax" |
. " WHERE c.num_nom = $numP"; |
} else { |
$req .= " WHERE nv.num_taxon = $numP"; |
/** |
* Renvoie la liste des noms répertoriés par chorodep; si un masque a été |
* défini sur une zone géographique, retourne aussi la présence sur cette zone |
*/ |
protected function listeNoms() { |
$req = "SELECT DISTINCT num_nom, nom_sci"; |
if (isset($this->masque['zone-geo']) && $this->masque['zone-geo'] != null) { |
$req .= ", `" . $this->masque['zone-geo'] . "` as presence"; |
} |
$req .= " AND nv.code_langue = 'fra'"; |
$req .= " FROM " . $this->table; |
$req .= $this->construireWhere(); |
$req .= " ORDER BY ".$this->tri." ".$this->tri_dir." "; |
$req .= " LIMIT " . $this->depart . ", " . $this->limite; |
|
$resultat = $this->getBdd()->recupererTous($req); |
|
$resultat_fmt = array(); |
foreach($resultat as $nv) { |
$resultat_fmt[] = $nv['nom_vernaculaire']; |
} |
return $resultat; |
} |
|
return $resultat_fmt; |
protected function compterNoms() { |
$req = "SELECT count(DISTINCT num_nom, nom_sci) AS compte FROM " . $this->table; |
$req .= $this->construireWhere(); |
$resultat = $this->getBdd()->recuperer($req); |
|
return $resultat['compte']; |
} |
|
protected function construireWhere() { |
$where = ""; |
$conditions = array(); |
// élimination des entrées sans nn valide |
$conditions[] = "CAST(num_nom AS decimal) != 0"; |
// masque |
if(!empty($this->masque)) { |
if(isset($this->masque['nom'])) { |
$masqueNom = $this->getBdd()->proteger($this->masque['nom']); |
$conditions[] = "nom_sci LIKE $masqueNom"; |
} |
if(isset($this->masque['zone-geo'])) { |
$masqueZg = $this->masque['zone-geo']; |
$conditions[] = "`$masqueZg` in ('1', '1?')"; |
} |
} |
$where = " WHERE " . implode(' AND ', $conditions); |
return $where; |
} |
} |
?> |