Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1106 | Rev 1165 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1106 Rev 1111
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
* Retourne la liste des noms répertoriés par le projet chorodep
3
* Retourne des infos sur une espèce : noms vernaculaires français, statuts de
-
 
4
 * protection, num_nom, num_tax, nom_sci, et nombre de zones dans lesquelles elle
-
 
5
 * est présente.
-
 
6
 * Interrogeable par nn ou nt
-
 
7
 * 
-
 
8
 * Il faudrait appeler les services correspondants pour obtenir les infos sur les
-
 
9
 * noms vernaculaires et les statuts de protection, mais c'est pas performant.
-
 
10
 * Néanmoins ce serait une arcitecture plus solide en cas de changement - pas le
-
 
11
 * temps d'y réfléchir mieux.
4
* 
12
* 
5
* @package chorodep
13
* @package chorodep
-
 
14
* @author Mathias Chouet <mathias@tela-botanica.org>
6
* @author Tela Botanica <equipe-dev@tela-botanica.org>
15
* @author Aurélien Perronnet <aurelien@tela-botanica.org>
7
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
16
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
17
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
* @version 1.0
18
* @version 1.0
10
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
19
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
11
*/
20
*/
Line 12... Line 21...
12
 
21
 
Line 13... Line 22...
13
class Noms extends Commun {
22
class InfosEspece extends Commun {
14
 
-
 
15
	protected $serviceNom = 'noms';
23
 
16
	protected $table;
24
	protected $serviceNom = 'InfosEspece';
17
	protected $masque;
25
	protected $masque;
18
	protected $depart;
26
	protected $navigation;
19
	protected $limite;
27
	protected $table;
Line 20... Line 28...
20
	protected $tri;
28
	protected $tableNomsVernaculaires;
21
	protected $tri_dir;
-
 
22
 
29
	protected $urlStatutsProtection;
23
	public function __construct($config = null) {
-
 
24
		parent::__construct($config);
-
 
25
		$this->masque = array();
-
 
26
		$this->depart = 0;
-
 
27
		$this->limite = 20;
-
 
28
		$this->tri = 'nom_sci';
-
 
29
		$this->tri_dir = 'ASC';
-
 
30
		$this->init();
-
 
31
	}
30
 
32
 
31
	public function init() {
-
 
32
		$this->masque = array();
-
 
33
		$this->traiterVersionProjet();
33
	protected function init() {
34
		$this->table = $this->table_version[0];
-
 
35
		$this->tableNomsVernaculaires = $this->config['table_nv'];
-
 
36
		$this->urlStatutsProtection = $this->config['url_service_sptb'];
Line -... Line 37...
-
 
37
	}
-
 
38
	
-
 
39
	public function consulter($ressources, $parametres) {
-
 
40
 
-
 
41
		$retour = null;
-
 
42
		if(preg_match("/^(nt|nn):([0-9]+)$/", $ressources[0], $matches)) {
-
 
43
			$champ_nt_ou_nn = ($matches[1] == "nn") ? "num_nom" : "num_tax";
-
 
44
 
-
 
45
			if(count($ressources) == 1) {
-
 
46
				// toutes les infos
34
		$this->traiterVersionProjet();
47
				$infos_espece = $this->getInfosEspece($champ_nt_ou_nn, $matches[2]);
35
		$this->table = $this->table_version[0];
48
				$retour = array_merge($infos_espece, $this->getInfosPresence($champ_nt_ou_nn, $matches[2]));
36
	}
49
				$statuts_protection = array(
-
 
50
					'statuts_protection' => $this->getStatutsProtection($champ_nt_ou_nn, $matches[2])
37
 
51
				);
38
	/**
52
				$retour = array_merge($retour, $statuts_protection);
-
 
53
				$noms_vernaculaires = array(
-
 
54
					'noms_vernaculaires_fr' => $this->getNomsVernaculaires($champ_nt_ou_nn, $matches[2])
-
 
55
				);
-
 
56
				$retour = array_merge($retour, $noms_vernaculaires);
-
 
57
			} else {
-
 
58
				// sous action du service
-
 
59
				$retour = array();
-
 
60
				switch($ressources[1]) {
39
	 * Récupère les paramètres de navigation
61
					case "noms-vernaculaires":
-
 
62
						$retour = array('noms_vernaculaires_fr' => $this->getNomsVernaculaires($champ_nt_ou_nn, $matches[2]));
-
 
63
					break;
40
	 * @param type $parametres
64
					case "statuts-protection":
-
 
65
						$retour = array('statuts_protection' => $this->getStatutsProtection($champ_nt_ou_nn, $matches[2]));
-
 
66
					break;
-
 
67
					case "presence":
-
 
68
						$retour = $this->getInfosPresence($champ_nt_ou_nn, $matches[2]);
41
	 */
69
					break;
42
	protected function setDepartLimite($parametres) {
70
					default:
43
		if(isset($parametres['navigation.depart']) && $parametres['navigation.depart'] != '') {
71
						$retour = "Actions possibles: noms-vernaculaires, statuts-protection, presence";
44
			$this->depart = max(0, intval($parametres['navigation.depart']));
72
				} 	
-
 
73
			}
45
		}
74
		} else {
Line 46... Line 75...
46
		if(isset($parametres['navigation.limite']) && $parametres['navigation.limite'] != '') {
75
			// TODO : envoyer message erreur;
47
			$this->limite = max(0, intval($parametres['navigation.limite']));
76
		}
48
		}
-
 
49
	}
77
		return $retour;
50
 
78
	}
51
	/**
79
 
-
 
80
	/**
52
	 * Récupère les paramètres de filtrage
81
	 * Toutes les infos sauf noms vernaculaires et statuts de protection
53
	 * @param type $parametres
82
	 */
54
	 */
-
 
55
	protected function setMasque($parametres) {
83
	protected function getInfosEspece($champ_nt_ou_nn, $nt_ou_nn) {
56
		if(isset($parametres['masque.nom']) && $parametres['masque.nom'] != '') {
-
 
57
			$this->masque['nom'] = $parametres['masque.nom'];
-
 
58
		}
-
 
59
		if(isset($parametres['masque.zone-geo']) && $parametres['masque.zone-geo'] != '') {
84
		$req = "SELECT DISTINCT num_nom, num_tax, nom_sci"
60
			$zg = $parametres['masque.zone-geo'];
85
			. " FROM " . $this->table
61
			// Tango Corse
-
 
62
			if ($zg == '2A' || $zg == '2B') {
86
			. " WHERE $champ_nt_ou_nn = " . $this->getBdd()->proteger($nt_ou_nn);
Line 63... Line 87...
63
				$zg = '20';
87
 
64
			}
88
		$resultat = $this->getBdd()->recuperer($req);
65
			$this->masque['zone-geo'] = $zg;
89
 
66
		}
90
		return $resultat;
67
	}
91
	}
-
 
92
 
68
 
93
	/**
69
	/**
94
	 * Construit une opération d'addition entre toutes les colonnes de la table
70
	 * Récupère les paramètres de tri
95
	 * chorodep représentant un département
71
	 * @param type $parametres
-
 
72
	 */
96
	 */
73
	protected function setTri($parametres) {
97
	protected function construireSommeColonnes() {
74
		if(isset($parametres['retour.tri']) && $parametres['retour.tri'] != '') {
98
		$colonnes = array();
Line 75... Line 99...
75
			$this->tri = $parametres['retour.tri'];
99
		for ($i=1; $i <= 95; $i++) {
-
 
100
			$colonnes[] = '`' . ($i > 9 ? $i : "0$i") . '`';
76
		}
101
		}
-
 
102
		$somme = implode('+', $colonnes);
Line 77... Line -...
77
		if(isset($parametres['retour.ordre']) && in_array($parametres['retour.ordre'], array('ASC', 'DESC'))) {
-
 
78
			$this->tri_dir = $parametres['retour.ordre'];
-
 
79
		}
-
 
80
	}
-
 
81
 
103
		return $somme;
82
	public function consulter($ressources, $parametres) {
-
 
83
		$donnees = array();
-
 
84
 
-
 
85
		$this->setDepartLimite($parametres);
-
 
86
		$this->setMasque($parametres);
-
 
87
		$this->setTri($parametres);
-
 
88
		$noms = $this->listeNoms();
-
 
89
		$total = $this->compterNoms();
-
 
90
 
-
 
91
		$url_base = Config::get('url_service');
-
 
92
 
-
 
93
		$masqueEnParams = array();
-
 
94
		foreach ($this->masque as $k => $v) {
-
 
95
			$masqueEnParams[] = 'masque.' . $k . '=' . $v;
-
 
96
		}
-
 
97
		$masqueEnParams = implode('&', $masqueEnParams);
-
 
98
 
-
 
99
		$donnees['entete'] = array(
-
 
100
			'masque' => $masqueEnParams,
-
 
101
			'total' => $total,
-
 
102
			'depart' => $this->depart,
-
 
103
			'limite' => $this->limite
-
 
104
		);
-
 
105
		if ($this->depart > 0) {
-
 
106
			$donnees['entete']['href.precedent'] = $url_base . '/' . $this->serviceNom . '?'
-
 
107
					. 'navigation.depart=' . max(0, ($this->depart - $this->limite)) . '&navigation.limite=' . $this->limite
-
 
108
					. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir
-
 
109
					. '&' . $masqueEnParams;
-
 
110
		}
-
 
111
		if (($this->depart + $this->limite) < $total ) {
104
	}
112
			$donnees['entete']['href.suivant'] = $url_base . '/' . $this->serviceNom . '?'
105
 
Line 113... Line 106...
113
					. 'navigation.depart=' . ($this->depart + $this->limite) . '&navigation.limite=' . $this->limite
106
	protected function getInfosPresence($champ_nt_ou_nn, $nt_ou_nn) {
114
					. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir
107
		$req = "SELECT " . $this->construireSommeColonnes() . " as nb_presence_zones".
115
					. '&' . $masqueEnParams;
108
				" FROM ".$this->table.
116
		}
109
				" WHERE ".$champ_nt_ou_nn." = ".$this->getBdd()->proteger($nt_ou_nn);
117
		$donnees['resultat'] = $noms;
110
 
-
 
111
		$resultat = $this->getBdd()->recuperer($req);
118
 
112
		return $resultat;
119
		return $donnees;
113
	}
-
 
114
 
-
 
115
	/**
120
	}
116
	 * Appelle le WS sptb car la table ne contient pas toutes les infos (il faut
121
 
117
	 * agréger les taxons supérieurs)
122
	/**
118
	 */
123
	 * Renvoie la liste des noms répertoriés par chorodep; si un masque a été
119
	protected function getStatutsProtection($champ_nt_ou_nn, $nt_ou_nn) {
-
 
120
		$num_noms = array();
124
	 * défini sur une zone géographique, retourne aussi la présence sur cette zone
121
		if ($champ_nt_ou_nn == "num_tax") {
125
	 */
122
			// le service sptb n'accepte pas les nt (on croit que si mais en fait
-
 
123
			// non) alors on chope les nn associés à ce nt dans chorodep - c'est
-
 
124
			// moisi mais c'est toujours mieux que si c'était pire
-
 
125
			$numTaxP  = $this->getBdd()->proteger($nt_ou_nn);
-
 
126
			$req = "SELECT DISTINCT num_nom"
-
 
127
				. " FROM " . $this->table
Line -... Line 128...
-
 
128
				. " WHERE num_tax = $numTaxP";
-
 
129
 
-
 
130
			$resultat = $this->getBdd()->recupererTous($req);
-
 
131
			foreach($resultat as $res) {
126
	protected function listeNoms() {
132
				$num_noms[] = $res['num_nom'];
-
 
133
			}
-
 
134
		} else {
-
 
135
			$num_noms[] = $nt_ou_nn;
-
 
136
		}
-
 
137
 
-
 
138
		$statuts = array();
-
 
139
		// récupération des statuts pour chaque num_nom
-
 
140
		foreach ($num_noms as $nn) {
Line 127... Line 141...
127
		$req = "SELECT DISTINCT num_nom, nom_sci";
141
			$url = sprintf($this->urlStatutsProtection, $nn);
128
		if (isset($this->masque['zone-geo']) && $this->masque['zone-geo'] != null) {
142
			$donnees = $this->getRestClient()->consulter($url);
Line -... Line 143...
-
 
143
			$donnees = json_decode($donnees, true);
129
			$req .= ", `" . $this->masque['zone-geo'] . "` as presence";
144
			foreach ($donnees as $d) {
-
 
145
				$statuts[] = array(
130
		}
146
					'zone' => $d['code_zone_application'],
-
 
147
					'lien' => $d['hyperlien_legifrance']
-
 
148
				);
-
 
149
			}
-
 
150
		}
-
 
151
 
131
		$req .= " FROM " . $this->table;
152
		return $statuts;
-
 
153
	}
132
		$req .= $this->construireWhere();
154
 
Line 133... Line 155...
133
		$req .= " ORDER BY ".$this->tri." ".$this->tri_dir." ";
155
	// @TODO faire un appel au WS nvjfl "for the sake of non-nodebagging" ?
134
		$req .= " LIMIT " . $this->depart . ", " . $this->limite;
-
 
Line 135... Line -...
135
 
-
 
136
		$resultat = $this->getBdd()->recupererTous($req);
-
 
137
 
156
	protected function getNomsVernaculaires($champ_nt_ou_nn, $nt_ou_nn) {
138
		return $resultat;
-
 
139
	}
-
 
140
 
-
 
141
	protected function compterNoms() {
157
		$numP  = $this->getBdd()->proteger($nt_ou_nn);
142
		$req = "SELECT count(DISTINCT num_nom, nom_sci) AS compte FROM " . $this->table;
-
 
143
		$req .= $this->construireWhere();
-
 
144
		$resultat = $this->getBdd()->recuperer($req);
158
		$req = "SELECT DISTINCT nv.nom_vernaculaire"
145
 
-
 
146
		return $resultat['compte'];
-
 
147
	}
-
 
148
 
-
 
149
	protected function construireWhere() {
-
 
150
		$where = "";
159
			. " FROM " . $this->tableNomsVernaculaires . " nv";
151
		$conditions = array();
-
 
-
 
160
		if ($champ_nt_ou_nn == "num_nom") {
152
		// élimination des entrées sans nn valide
161
			$req .= " LEFT JOIN " . $this->table . " c ON nv.num_taxon = c.num_tax"
153
		$conditions[] = "CAST(num_nom AS decimal) != 0";
162
				. " WHERE c.num_nom = $numP";
154
		// masque
163
		} else {
155
		if(!empty($this->masque)) {
164
			$req .= " WHERE nv.num_taxon = $numP";
156
			if(isset($this->masque['nom'])) {
165
		}