Gestion des zones géographiques du continent à la subdivision
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

216 lines
7.0 KiB

<?php
/**
* Ce fichier contient les fonctions d'API du plugin Territoires utilisées comme filtre dans les squelettes.
* Les autres fonctions de l'API sont dans les fichiers `inc/territoire` et `inc/territoires_services`.
*
* @package SPIP\TERRITOIRES\API
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fournit l'ascendance géographique d'un territoire, par consultation dans la base de données.
*
* @api
* @filtre
*
* @param string $iso_territoire Code ISO principal du territoire
* @param string|null $iso_parent Code ISO principal du parent direct du territoire concerné ou chaine vide sinon
* @param string $ordre Classement de la liste : `descendant`(défaut) ou `ascendant`.
*
* @return array Liste des territoires ascendants.
*/
function territoire_informer_ascendance($iso_territoire, $iso_parent = null, $ordre = 'descendant') {
$ascendance = array();
// Si on ne passe pas le parent correspondant au territoire pour lequel on cherche l'ascendance
// alors on le cherche en base de données.
// Le fait de passer le parent est uniquement une optimisation.
if (\is_null($iso_parent)) {
$iso_parent = sql_getfetsel('iso_parent', 'spip_territoires', 'iso_territoire=' . sql_quote($iso_territoire));
}
while ($iso_parent) {
$select = array('id_territoire', 'iso_parent', 'nom_usage', 'type', 'categorie');
$where = array('iso_territoire=' . sql_quote($iso_parent));
$territoire = sql_fetsel($select, 'spip_territoires', $where);
if ($territoire) {
$ascendance[] = $territoire;
$iso_parent = $territoire['iso_parent'];
} else {
// Le parent est d'un autre type qui n'est pas encore peuplé en base : on s'arrête.
$iso_parent = '';
}
}
if ($ascendance and ($ordre == 'descendant')) {
$ascendance = array_reverse($ascendance);
}
return $ascendance;
}
/**
* Fournit la liste des pays possédant des subdivisisions ou des infrasubdivisions en base de données.
* Il est aussi possible de renvoyer la liste des pays si ceux-ci sont aussi présents.
*
* @api
* @filtre
*
* @param string $type Type de territoires. Prends les valeurs `country`, `subdivision` ou `infrasubdivision`.
* La valeur par défaut est `country`.
* @param string $categorie Catégorie de territoire.
*
* @return array Liste des pays sous la forme [iso_pays] = nom usuel.
*/
function territoire_lister_pays($type = '', $categorie = '') {
// Initialisation de la sortie en erreur
$pays = array();
// Filtre sur la catégorie et le type si demandé
$where = array();
if ($categorie) {
$where[] = 't1.categorie=' . sql_quote($categorie);
}
if ($type) {
$where[] = 't1.type=' . sql_quote($type);
}
// On récupère :
// -- les pays possédant des subdivisions en base de donnés (type = subdivision ou infrasubdivision)
// -- ou simplement tous les pays (type = country).
if ($type === 'country') {
$select = array('t1.iso_territoire as pays', 't1.nom_usage');
$liste = sql_allfetsel($select, 'spip_territoires as t1', $where);
} else {
$from = array('spip_territoires as t1', 'spip_territoires as t2');
$select = array('t1.iso_pays as pays', 't2.nom_usage');
$where[] = 't1.iso_pays = t2.iso_territoire';
$group_by = array('t1.iso_pays');
$liste = sql_allfetsel($select, $from, $where, $group_by);
}
if ($liste) {
include_spip('inc/filtres');
foreach ($liste as $_pays) {
$pays[$_pays['pays']] = extraire_multi($_pays['nom_usage']);
}
}
return $pays;
}
/**
* Fournit la liste des catégories de territoire filtreé sur le type et/ou sur le pays.
*
* @api
* @filtre
*
* @param string $type Type de territoires. Prends les valeurs `zone`, `country`, `subdivision` ou `infrasubdivision`
* ou chaine vide pour ne pas tenir compte du type.
* @param string $pays Code ISO 3166-1 alpha2 du pays sinon une chaine vide.
*
* @return array Liste des identifiants de catégorie.
*/
function territoire_lister_categorie($type = '', $pays = '') {
// Initialisation de la sortie en erreur
$categories = array();
// On récupère les identifiants de catégorie d'un type donné, d'un pays donné, d'un couple (type, pays) ou de
// tous les territoires.
$select = array('categorie');
$where = array();
$group_by = array('categorie');
if ($type) {
$where[] = 'type=' . sql_quote($type);
}
if ($pays) {
$where[] = 'iso_pays=' . sql_quote($pays);
}
$liste = sql_allfetsel($select, 'spip_territoires', $where, $group_by);
if ($liste) {
foreach ($liste as $_categorie) {
$categorie = $_categorie['categorie'];
$categories[$categorie] = _T("territoire:categorie_${categorie}");
}
}
return $categories;
}
/**
* Fournit, pour un territoire donné, tout ou partie des informations extras disponibles dans la table
* spip_territoires_extras.
* Cette fonction ne renvoie pas les champs du territoire lui-même (table spip_territoires).
*
* @api
* @filtre
*
* @param string $iso_territoire Code ISO principal du territoire
* @param string $information Type d'information à renvoyer depuis la table spip_territoires_extras ou vide
* si on veut toutes les informations.
*
* @return string|array Information ou liste des informations.
*/
function territoire_extra_informer($iso_territoire, $information = '') {
// Traitement du cas particulier de l'ascendance
if ($information === 'ascendance') {
$informations = territoire_informer_ascendance($iso_territoire);
} else {
// Initialisation de la sortie en fonction de la demande
$informations = $information ? '' : array();
// Quelque soit la demande, on récupère toutes les informations du territoire.
$select = array('extra', 'valeur');
$where = array('iso_territoire=' . sql_quote($iso_territoire));
$extras = sql_allfetsel($select, 'spip_territoires_extras', $where);
if ($extras) {
$extras = array_column($extras, 'extra');
$informations = $information
? (isset($extras[$information]) ? $extras[$information] : '')
: $extras;
}
}
return $informations;
}
/**
* Compile la balise `#TERRITOIRE_EXTRAS` qui renvoie tout ou partie des informations extras d'un territoire donné.
* La signature de la balise est : `#TERRITOIRE_EXTRAS{iso_territoire[, information]}`.
*
* @balise
*
* @uses territoire_extra_informer()
*
* @param Champ $p Pile au niveau de la balise.
*
* @return Champ Pile complétée par le code à générer.
**/
function balise_TERRITOIRE_EXTRAS_dist($p) {
// Récupération des arguments.
// -- la balise utilise toujours le rangement par rang au sein du conteneur
// -- et ne permet pas de filtrer les noisettes autrement que sur le conteneur.
$iso_territoire = interprete_argument_balise(1, $p);
$iso_territoire = isset($iso_territoire) ? str_replace('\'', '"', $iso_territoire) : '""';
$information = interprete_argument_balise(2, $p);
$information = isset($information) ? str_replace('\'', '"', $information) : '""';
// On appelle la fonction de calcul de la liste des noisettes
$p->code = "territoire_extra_informer($iso_territoire, $information)";
return $p;
}