1124 |
mathias |
1 |
<?php
|
|
|
2 |
/**
|
|
|
3 |
* Retourne la liste des noms de répertoriés par le projet chorodep, associés à la liste de
|
|
|
4 |
* leurs statuts de protection, la liste de leurs noms vernaculaires, et leur présence, utile
|
|
|
5 |
* surtout dans le cas où on filtre par zone géo.
|
|
|
6 |
* Merci Monsieur Plus !
|
|
|
7 |
* Paramètres :
|
|
|
8 |
* - masque.nom : un LIKE sera effectué sur le nom
|
|
|
9 |
* - masque.zone-geo : limite les résultats aux noms des espèces présentes dans le département (nombre à 2 chiffres) spécifié
|
|
|
10 |
* - masque.proteges : si '0' retourne les protections NULL, si '1' les NOT NULL
|
|
|
11 |
*
|
|
|
12 |
* @package chorodep
|
|
|
13 |
* @author Mathias Chouet <mathias@tela-botanica.org>
|
|
|
14 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
|
|
15 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
|
|
16 |
* @version 1.0
|
|
|
17 |
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
|
|
|
18 |
*/
|
|
|
19 |
|
|
|
20 |
class NomsPlus extends Noms {
|
|
|
21 |
|
|
|
22 |
protected $tableNomsVernaculaires;
|
|
|
23 |
protected $tableStatutsProtection;
|
|
|
24 |
|
|
|
25 |
protected function init() {
|
|
|
26 |
parent::init();
|
|
|
27 |
$this->tableNomsVernaculaires = Config::get('table_chorologie_nv');
|
|
|
28 |
$this->tableStatutsProtection = Config::get('table_chorologie_sp');
|
|
|
29 |
$this->serviceNom = 'noms-plus';
|
|
|
30 |
}
|
|
|
31 |
|
|
|
32 |
protected function setMasque($parametres) {
|
|
|
33 |
parent::setMasque($parametres);
|
|
|
34 |
// masque sur protection
|
|
|
35 |
if(isset($parametres['masque.proteges']) && $parametres['masque.proteges'] != '') {
|
|
|
36 |
$this->masque['proteges'] = $parametres['masque.proteges'];
|
|
|
37 |
}
|
|
|
38 |
}
|
|
|
39 |
|
|
|
40 |
/**
|
|
|
41 |
* Renvoie la liste des taxons, les noms vernaculaires et statuts de protacion associés; si
|
|
|
42 |
* un masque a été défini sur une zone géographique, retourne aussi la présence sur cette zone
|
|
|
43 |
*/
|
|
|
44 |
protected function listeNoms() {
|
|
|
45 |
$req = "SELECT DISTINCT c.num_nom, c.nom_sci, group_concat(DISTINCT nv.nom_vernaculaire) as noms_vernaculaires";
|
|
|
46 |
if (isset($this->masque['zone-geo']) && $this->masque['zone-geo'] != null) {
|
|
|
47 |
$req .= ", max(`" . $this->masque['zone-geo'] . "`) as presence";
|
|
|
48 |
}
|
|
|
49 |
$req .= ", sp.protection";
|
|
|
50 |
$req .= " FROM " . $this->table . " c";
|
|
|
51 |
$req .= " LEFT JOIN " . $this->tableNomsVernaculaires . " nv";
|
|
|
52 |
$req .= " ON c.num_tax = nv.num_tax";
|
|
|
53 |
$req .= " LEFT JOIN " . $this->tableStatutsProtection . " sp";
|
|
|
54 |
$req .= " ON c.num_nom = sp.num_nom";
|
|
|
55 |
$req .= $this->construireWhere();
|
|
|
56 |
$req .= " GROUP BY c.num_nom";
|
|
|
57 |
$req .= " ORDER BY " . $this->tri . " " . $this->tri_dir . " ";
|
|
|
58 |
$req .= " LIMIT " . $this->depart. ", " . $this->limite;
|
|
|
59 |
|
|
|
60 |
//echo "REQUETE: $req"; exit;
|
|
|
61 |
$resultat = $this->getBdd()->recupererTous($req);
|
|
|
62 |
// décodage des statuts de protection
|
|
|
63 |
foreach ($resultat as $k => $r) {
|
|
|
64 |
$resultat[$k]['statuts_protection'] = json_decode($r['protection']);
|
|
|
65 |
unset($resultat[$k]['protection']);
|
|
|
66 |
}
|
|
|
67 |
|
|
|
68 |
return $resultat;
|
|
|
69 |
}
|
|
|
70 |
|
|
|
71 |
protected function compterNoms() {
|
|
|
72 |
$req = "SELECT count(DISTINCT c.num_nom, c.nom_sci) AS compte"
|
|
|
73 |
. " FROM " . $this->table . " c" // alias pour compatibilité avec le where
|
|
|
74 |
. " LEFT JOIN " . $this->tableStatutsProtection . " sp" // jointure pour compatibilité avec le where
|
|
|
75 |
. " ON c.num_nom = sp.num_nom";
|
|
|
76 |
$req .= $this->construireWhere();
|
|
|
77 |
$resultat = $this->getBdd()->recuperer($req);
|
|
|
78 |
|
|
|
79 |
return $resultat['compte'];
|
|
|
80 |
}
|
|
|
81 |
|
|
|
82 |
protected function construireWhere() {
|
|
|
83 |
$where = "";
|
|
|
84 |
$conditions = array();
|
|
|
85 |
// élimination des entrées sans nn valide
|
|
|
86 |
$conditions[] = "CAST(c.num_nom AS decimal) != 0";
|
|
|
87 |
// masque
|
|
|
88 |
if(!empty($this->masque)) {
|
|
|
89 |
$masqueZg = null;
|
|
|
90 |
if(isset($this->masque['nom'])) {
|
|
|
91 |
$masqueNom = $this->getBdd()->proteger($this->masque['nom']);
|
|
|
92 |
$conditions[] = "c.nom_sci LIKE $masqueNom";
|
|
|
93 |
}
|
|
|
94 |
if(isset($this->masque['zone-geo'])) {
|
|
|
95 |
$masqueZg = $this->masque['zone-geo'];
|
|
|
96 |
$conditions[] = "`$masqueZg` in ('1', '1?')";
|
|
|
97 |
}
|
|
|
98 |
if(isset($this->masque['proteges'])) {
|
|
|
99 |
$masqueProteges = ($this->masque['proteges'] === '1');
|
|
|
100 |
if ($masqueZg) { // protection sur les zones concernées seulement
|
|
|
101 |
$sousConditions = array();
|
|
|
102 |
$zonesProtegees = $this->zonesProtegeesParDepartement($masqueZg);
|
|
|
103 |
foreach ($zonesProtegees as $zp) {
|
|
|
104 |
// @ACHTUNG pas de $this->getBdd()->proteger() sinon ça foire les doubles quotes - danger !
|
|
|
105 |
$zpP = "'%" . 'zone":"' . $zp . "%'"; // fouille dans le JSON à l'arrache
|
|
|
106 |
$sousConditions[] = "sp.protection " . ($masqueProteges ? "" : "NOT ") . "LIKE $zpP";
|
|
|
107 |
}
|
|
|
108 |
// si clause négative, IS NULL OR (NOT LIKE [AND NOT LIKE]*) sinon LIKE [OR LIKE]*
|
|
|
109 |
if ($masqueProteges) {
|
|
|
110 |
$conditions[] = '(' . implode(" OR ", $sousConditions) . ')';
|
|
|
111 |
} else {
|
|
|
112 |
$conditions[] = '( sp.protection IS NULL OR (' . implode(" AND ", $sousConditions) . '))';
|
|
|
113 |
}
|
|
|
114 |
} else {
|
|
|
115 |
$conditions[] = "sp.protection IS " . ($masqueProteges ? "NOT " : "") . "NULL ";
|
|
|
116 |
}
|
|
|
117 |
}
|
|
|
118 |
}
|
|
|
119 |
$where = " WHERE " . implode(' AND ', $conditions);
|
|
|
120 |
return $where;
|
|
|
121 |
}
|
|
|
122 |
|
|
|
123 |
/**
|
|
|
124 |
* Retourne la liste des codes de zones d'application de la protection concernant un département,
|
|
|
125 |
* soit le code du département lui-même, le code de sa région, plus les codes "France" et "Europe"
|
|
|
126 |
* @TODO déplacer dans sptb ?
|
|
|
127 |
* @param string $dept une chaîne représentant le département, sur 2 chiffres
|
|
|
128 |
*/
|
|
|
129 |
protected function zonesProtegeesParDepartement($dept) {
|
|
|
130 |
$zones = array('FX', 'EU');
|
|
|
131 |
$zones[] = "Dpt-$dept";
|
|
|
132 |
|
|
|
133 |
// Appel service insee-d pour connaître la région
|
|
|
134 |
$url_tpl = Config::get('insee_d_url_tpl');
|
|
|
135 |
$url = sprintf($url_tpl, $dept);
|
|
|
136 |
$donnees = $this->getRestClient()->consulter($url);
|
|
|
137 |
$donnees = json_decode($donnees, true);
|
|
|
138 |
if (! empty($donnees['region.code'])) {
|
|
|
139 |
$zones[] = 'Reg-' . $donnees['region.code'];
|
|
|
140 |
}
|
|
|
141 |
|
|
|
142 |
return $zones;
|
|
|
143 |
}
|
|
|
144 |
|
|
|
145 |
/**
|
|
|
146 |
* Méthode permettant de faire appel à un client REST en fonction des besoins du service.
|
|
|
147 |
*/
|
|
|
148 |
/*protected function getRestClient() {
|
|
|
149 |
if (! isset($this->RestClient)) {
|
|
|
150 |
$this->RestClient = new RestClient();
|
|
|
151 |
}
|
|
|
152 |
return $this->RestClient;
|
|
|
153 |
}*/
|
|
|
154 |
}
|