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
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; |
|
}
|
|
|