Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1124 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
}