Rev 1124 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Retourne la liste des noms de répertoriés par le projet chorodep, associés à la liste de* leurs statuts de protection, la liste de leurs noms vernaculaires, et leur présence, utile* surtout dans le cas où on filtre par zone géo.* Merci Monsieur Plus !* Paramètres :* - masque.nom : un LIKE sera effectué sur le nom* - masque.zone-geo : limite les résultats aux noms des espèces présentes dans le département (nombre à 2 chiffres) spécifié* - masque.proteges : si '0' retourne les protections NULL, si '1' les NOT NULL** @package chorodep* @author Mathias Chouet <mathias@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-2014 Tela Botanica (accueil@tela-botanica.org)*/class NomsPlus extends Noms {protected $tableNomsVernaculaires;protected $tableStatutsProtection;protected function init() {parent::init();$this->tableNomsVernaculaires = Config::get('table_chorologie_nv');$this->tableStatutsProtection = Config::get('table_chorologie_sp');$this->serviceNom = 'noms-plus';}protected function setMasque($parametres) {parent::setMasque($parametres);// masque sur protectionif(isset($parametres['masque.proteges']) && $parametres['masque.proteges'] != '') {$this->masque['proteges'] = $parametres['masque.proteges'];}}/*** Renvoie la liste des taxons, les noms vernaculaires et statuts de protacion associés; 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 c.num_nom, c.nom_sci, group_concat(DISTINCT nv.nom_vernaculaire) as noms_vernaculaires";if (isset($this->masque['zone-geo']) && $this->masque['zone-geo'] != null) {$req .= ", max(`" . $this->masque['zone-geo'] . "`) as presence";}$req .= ", sp.protection";$req .= " FROM " . $this->table . " c";$req .= " LEFT JOIN " . $this->tableNomsVernaculaires . " nv";$req .= " ON c.num_tax = nv.num_tax";$req .= " LEFT JOIN " . $this->tableStatutsProtection . " sp";$req .= " ON c.num_nom = sp.num_nom";$req .= $this->construireWhere();$req .= " GROUP BY c.num_nom";$req .= " ORDER BY " . $this->tri . " " . $this->tri_dir . " ";$req .= " LIMIT " . $this->depart. ", " . $this->limite;//echo "REQUETE: $req"; exit;$resultat = $this->getBdd()->recupererTous($req);// décodage des statuts de protectionforeach ($resultat as $k => $r) {$resultat[$k]['statuts_protection'] = json_decode($r['protection']);unset($resultat[$k]['protection']);}return $resultat;}protected function compterNoms() {$req = "SELECT count(DISTINCT c.num_nom, c.nom_sci) AS compte". " FROM " . $this->table . " c" // alias pour compatibilité avec le where. " LEFT JOIN " . $this->tableStatutsProtection . " sp" // jointure pour compatibilité avec le where. " ON c.num_nom = sp.num_nom";$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(c.num_nom AS decimal) != 0";// masqueif(!empty($this->masque)) {$masqueZg = null;if(isset($this->masque['nom'])) {$masqueNom = $this->getBdd()->proteger($this->masque['nom']);$conditions[] = "c.nom_sci LIKE $masqueNom";}if(isset($this->masque['zone-geo'])) {$masqueZg = $this->masque['zone-geo'];$conditions[] = "`$masqueZg` in ('1', '1?')";}if(isset($this->masque['proteges'])) {$masqueProteges = ($this->masque['proteges'] === '1');if ($masqueZg) { // protection sur les zones concernées seulement$sousConditions = array();$zonesProtegees = $this->zonesProtegeesParDepartement($masqueZg);foreach ($zonesProtegees as $zp) {// @ACHTUNG pas de $this->getBdd()->proteger() sinon ça foire les doubles quotes - danger !$zpP = "'%" . 'zone":"' . $zp . "%'"; // fouille dans le JSON à l'arrache$sousConditions[] = "sp.protection " . ($masqueProteges ? "" : "NOT ") . "LIKE $zpP";}// si clause négative, IS NULL OR (NOT LIKE [AND NOT LIKE]*) sinon LIKE [OR LIKE]*if ($masqueProteges) {$conditions[] = '(' . implode(" OR ", $sousConditions) . ')';} else {$conditions[] = '( sp.protection IS NULL OR (' . implode(" AND ", $sousConditions) . '))';}} else {$conditions[] = "sp.protection IS " . ($masqueProteges ? "NOT " : "") . "NULL ";}}}$where = " WHERE " . implode(' AND ', $conditions);return $where;}/*** Retourne la liste des codes de zones d'application de la protection concernant un département,* soit le code du département lui-même, le code de sa région, plus les codes "France" et "Europe"* @TODO déplacer dans sptb ?* @param string $dept une chaîne représentant le département, sur 2 chiffres*/protected function zonesProtegeesParDepartement($dept) {$zones = array('FX', 'EU');$zones[] = "Dpt-$dept";// Appel service insee-d pour connaître la région$url_tpl = Config::get('insee_d_url_tpl');$url = sprintf($url_tpl, $dept);$donnees = $this->getRestClient()->consulter($url);$donnees = json_decode($donnees, true);if (! empty($donnees['region.code'])) {$zones[] = 'Reg-' . $donnees['region.code'];}return $zones;}/*** Méthode permettant de faire appel à un client REST en fonction des besoins du service.*//*protected function getRestClient() {if (! isset($this->RestClient)) {$this->RestClient = new RestClient();}return $this->RestClient;}*/}