New file |
0,0 → 1,154 |
<?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 protection |
if(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 protection |
foreach ($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"; |
// masque |
if(!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; |
}*/ |
} |