* @license GPL v3 * @license CECILL v2 * @version 1.0 * @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org) */ class Noms extends Commun { protected $serviceNom = 'noms'; protected $table; protected $masque; protected $depart; protected $limite; protected $tri; protected $tri_dir; protected function init() { $this->masque = array(); $this->depart = 0; $this->limite = 20; $this->tri = 'nom_sci'; $this->tri_dir = 'ASC'; $this->traiterVersionProjet(); $this->table = $this->table_version[0]; } /** * 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'])); } if(isset($parametres['navigation.limite']) && $parametres['navigation.limite'] != '') { $this->limite = max(0, intval($parametres['navigation.limite'])); } } /** * Récupère les paramètres de filtrage * @param type $parametres */ 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; } } /** * Récupère les paramètres de tri * @param type $parametres */ protected function setTri($parametres) { if(isset($parametres['retour.tri']) && $parametres['retour.tri'] != '') { $this->tri = $parametres['retour.tri']; } if(isset($parametres['retour.ordre']) && in_array($parametres['retour.ordre'], array('ASC', 'DESC'))) { $this->tri_dir = $parametres['retour.ordre']; } } public function consulter($ressources, $parametres) { $donnees = array(); $this->setDepartLimite($parametres); $this->setMasque($parametres); $this->setTri($parametres); $noms = $this->listeNoms(); $total = $this->compterNoms(); $url_base = Config::get('url_service'); $masqueEnParams = array(); foreach ($this->masque as $k => $v) { $masqueEnParams[] = 'masque.' . $k . '=' . $v; } $masqueEnParams = implode('&', $masqueEnParams); $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 ? '&' . $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 ? '&' . $masqueEnParams : ''); } $donnees['resultat'] = $noms; return $donnees; } /** * 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 .= " 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); return $resultat; } 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; } } ?>