source: spip-zone/_plugins_/isocode/trunk/inc/isocode.php @ 125379

Last change on this file since 125379 was 125379, checked in by Eric Lupinacci, 6 months ago

Ajout d'un bloc crédits poiur la collection contours uniquement

  • Property svn:eol-style set to native
File size: 11.9 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des fonctions implémentant l'API du plugin.
4 *
5 * @package SPIP\ISOCODE\API
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Charge en base de données une liste de tables de codes ISO donnée.
14 * Si la liste est vide, la fonction charge toutes les tables disponibles.
15 *
16 * @api
17 * @filtre
18 *
19 * @uses consigner_chargement()
20 * @uses lire_source()
21 * @uses isocode_decharger_tables()
22 *
23 * @param string $type Type de service. Prend les valeurs `nomenclature` ou `geometrie`.
24 * @param array $services
25 *      Liste des tables (nomenclature) ou des contours (geometrie) à charger.
26 *      Si le tableau est vide l'ensemble des éléments du type choisi seront chargés.
27 *
28 * @return array
29 *      Tableau associatif résultat de l'action de vidage:
30 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
31 *      - index `elements_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
32 *      - index `elements_nok` : liste des tables en erreur ou tableau vide sinon.
33 *      - index `elements_sha` : liste des tables inchangées (SHA identique) ou tableau vide sinon.
34 */
35function isocode_charger($type, $service, $table) {
36
37        $retour = array(
38                'erreur'  => '',
39                'type'    => $type,
40                'service' => $service,
41                'table'   => $table,
42        );
43
44        // Lecture des données contenues soit dans un fichier, soit dans une page web, soit dans le retour d'une API REST
45        // et renvoie une liste d'éléments prêts à être enregistrés dans la table concernée.
46        // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de
47        // lecture ne renvoie aucun élément pour éviter des traitements inutiles mais renvoie un indicateur
48        // sur le SHA.
49        $erreur = true;
50
51        spip_timer('lire');
52        include_spip('inc/isocode_utils');
53        list($enregistrements, $sha, $source_identique) = lire_source($type, $service, $table);
54        $duree_lire = spip_timer('lire');
55        if ($enregistrements) {
56                spip_timer('ecrire');
57                // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur
58                // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit.
59                isocode_decharger($type, $service, $table);
60
61                // Insertion dans la base de données des éléments extraits
62                if (inserer_enregistrements($type, $enregistrements, $table)) {
63                        // On stocke les informations de chargement de la table dans une meta.
64                        $meta = array(
65                                'sha'     => $sha,
66                                'nbr'     => count($enregistrements),
67                                'maj'     => date('Y-m-d H:i:s')
68                        );
69                        consigner_chargement($meta, $type, $service, $table);
70                        $erreur = false;
71                }
72                $duree_ecrire = spip_timer('ecrire');
73                spip_log("La table <${table}> a été chargée via le service <${service}> (lecture source: ${duree_lire} - insertion BD: ${duree_ecrire})", 'isocode' . _LOG_DEBUG);
74        }
75
76        // Si la table est en erreur, on passe l'indicateur global à erreur et on stocke la table en nok
77        // ou en sha identique suivant la cas.
78        // Si le traitement est ok on stocke juste la table.
79        if ($erreur) {
80                if ($source_identique) {
81                        $retour['erreur'] = 'sha';
82                } else {
83                        $retour['erreur'] = 'nok';
84                }
85        }
86
87        return $retour;
88}
89
90
91/**
92 * Supprime en base de données, le contenu des tables de codes ISO choisies.
93 * Si la liste des tables est vide la fonction considère que toutes les tables doivent être vidées.
94 * La meta concernant les informations de chargement de chaque table est aussi effacée.
95 *
96 * @api
97 * @filtre
98 *
99 * @uses isocode_lister_tables()
100 *
101 * @param string $type
102 * @param string $service
103 * @param string $table
104 *      Liste des tables à vider. Si le tableau est vide l'ensemble des tables
105 *      seront vidées.
106 *      Les tables doivent être libellées sans le préfixe `spip_`.
107 *
108 * @return array
109 *      Tableau associatif résultat de l'action de vidage:
110 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
111 *      - index `elements_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
112 *      - index `elements_nok` : liste des tables en erreur ou tableau vide sinon.
113 */
114function isocode_decharger($type, $service, $table) {
115
116        $retour = array(
117                'erreur'  => '',
118                'type'    => $type,
119                'service' => $service,
120                'table'   => $table,
121        );
122
123        $where = ($type === 'nomenclature')
124                ? array()
125                : array('service=' . sql_quote($service));
126        $sql_ok = sql_delete("spip_${table}", $where);
127        if ($sql_ok !== false) {
128                // Supprimer la meta propre à la table.
129                include_spip('inc/isocode_utils');
130                deconsigner_chargement($type, $service, $table);
131        } else {
132                $retour['erreur'] = 'nok';
133        }
134
135        return $retour;
136}
137
138
139/**
140 * Retourne la liste des services disponibles pour le chargement des tables de codes ISO.
141 * La fonction lit les sous-répertoires du répertoire `services/` du plugin et vérifie qu'un fichier
142 * d'API existe.
143 *
144 * @api
145 * @filtre
146 *
147 * @return array
148 *      La liste des services disponibles ou tableau vide aucun service n'est détecté.
149 */
150function isocode_lister_types_service() {
151
152        static $types = array();
153
154        if (!$types) {
155                if ($dossiers = glob(_DIR_PLUGIN_ISOCODE . 'services/*', GLOB_ONLYDIR)) {
156                        foreach ($dossiers as $_dossier) {
157                                $types[] = strtolower(basename($_dossier));
158                        }
159                }
160        }
161        return $types;
162}
163
164
165/**
166 * Retourne la liste des services disponibles pour le chargement des tables de codes ISO.
167 * La fonction lit les sous-répertoires du répertoire `services/` du plugin et vérifie qu'un fichier
168 * d'API existe.
169 *
170 * @api
171 * @filtre
172 *
173 * @return array
174 *      La liste des services disponibles ou tableau vide aucun service n'est détecté.
175 */
176function isocode_lister_services($type) {
177
178        static $services = array();
179
180        if (
181                $type
182                and !isset($services[$type])
183        ) {
184                if ($type === 'nomenclature') {
185                        if ($dossiers = glob(_DIR_PLUGIN_ISOCODE . "services/${type}/*", GLOB_ONLYDIR)) {
186                                foreach ($dossiers as $_dossier) {
187                                        $service = strtolower(basename($_dossier));
188                                        if (file_exists($f = _DIR_PLUGIN_ISOCODE . "services/${type}/${service}/${service}_api.php")) {
189                                                $services[$type][] = $service;
190                                        }
191                                }
192                        }
193                } elseif ($type === 'geometrie') {
194                        // Contours géométriques : les services sont décrits dans la configuration incluse dans le fichier
195                        // geometrie_api.php
196                        include_spip("services/${type}/${type}_api");
197                        $services[$type] = array_keys($GLOBALS['isocode']['geometrie']);
198                }
199        }
200
201        return isset($services[$type]) ? $services[$type] : array();
202}
203
204
205/**
206 * Détermine le service associé au chargement de la table de codes ISO choisie.
207 * Si la table est vide ou invalide, la fonction renvoie une chaîne vide.
208 *
209 * @api
210 * @filtre
211 *
212 * @uses isocode_lister_services()
213 *
214 * @param $table
215 *      Nom d'une table sans le préfixe `spip_`.
216 *
217 * @return string|array
218 *      Le ou les services associés à la table fournie suivant le type de service.
219 *      - nomenclature : service unique permettant le chargement de la table ou chaîne vide.
220 *      - geometrie    : tableau des services permettant le chargement de la table ou tableau vide.
221 */
222function isocode_trouver_service($type, $table) {
223
224        static $tables = array();
225        static $services = array();
226        $services_trouves = ($type === 'nomenclature') ? '' : array();
227
228        if ($type) {
229                if (!isset($services[$type])) {
230                        $services[$type] = isocode_lister_services($type);
231                }
232                if (!isset($tables[$type])) {
233                        $tables[$type] = isocode_lister_tables($type);
234                }
235
236                if (in_array($table, $tables[$type])) {
237                        if ($type === 'nomenclature') {
238                                foreach ($services[$type] as $_service) {
239                                        include_spip("services/${type}/${_service}/${_service}_api");
240                                        if (isset($GLOBALS['isocode'][$_service][$table])) {
241                                                $services_trouves = $_service;
242                                                break;
243                                        }
244                                }
245                        } elseif ($type === 'geometrie') {
246                                // Détermination du ou des services pour le type géométrie
247                                include_spip("services/${type}/${type}_api");
248                                foreach ($services[$type] as $_service) {
249                                        if ($GLOBALS['isocode'][$type][$_service]['table'] === $table) {
250                                                $services_trouves[] = $_service;
251                                        }
252                                }
253                        }
254                }
255        }
256
257        return $services_trouves;
258}
259
260
261/**
262 * Retourne la liste de toutes les tables gérées par le plugin ou de celles associées à un ou plusieurs
263 * services donnés.
264 *
265 * @api
266 * @filtre
267 *
268 * @uses isocode_lister_services()
269 * @uses service_est_disponible()
270 *
271 * @param array $services
272 *      Liste des services pour lesquels la liste des tables associées est demandée.
273 *      Si la liste est vide la fonction renvoie les tables de tous les services disponibles.
274 *
275 * @return array
276 *      Liste des tables sans le préfixe `spip_`.
277 */
278function isocode_lister_tables($type, $avec_groupes = false) {
279
280        $tables = array();
281
282        // On vérifie l'argument type de service qui est vide si tous les types sont requis.
283        if ($type) {
284                $services = isocode_lister_services($type);
285                if ($type === 'nomenclature') {
286                        // On collecte pour chaque service, la liste des tables qu'il supporte.
287                        foreach ($services as $_service) {
288                                include_spip("services/${type}/${_service}/${_service}_api");
289                                if (!$avec_groupes) {
290                                        $tables = array_merge($tables, array_keys($GLOBALS['isocode'][$_service]));
291                                } else {
292                                        foreach ($GLOBALS['isocode'][$_service] as $_table => $_config) {
293                                                $groupe = $_config['groupe'];
294                                                $tables[$groupe][] = $_table;
295                                        }
296                                }
297                        }
298                } elseif ($type === 'geometrie') {
299                        // Un service ne concerne qu'une seule table
300                        include_spip("services/${type}/${type}_api");
301                        foreach ($services as $_service) {
302                                $tables[] = $GLOBALS['isocode'][$type][$_service]['table'];
303                        }
304                        $tables = array_unique($tables);
305                }
306        }
307
308        return $tables;
309}
310
311
312/**
313 * Détermine le service associé au chargement de la table de codes ISO choisie.
314 * Si la table est vide ou invalide, la fonction renvoie une chaîne vide.
315 *
316 * @api
317 * @filtre
318 *
319 * @uses isocode_lister_services()
320 *
321 * @param $table
322 *      Nom d'une table sans le préfixe `spip_`.
323 *
324 * @return string|array
325 *      Le ou les tables associées au service fourni suivant le type de service.
326 *      - nomenclature : tableau des tables pouvant être chargées par le service ou tableau vide.
327 *      - geometrie    : table unique pouvant être chargée par le service ou chaine vide.
328 */
329function isocode_trouver_table($type, $service) {
330
331        static $services = array();
332        $tables_trouvees = ($type === 'nomenclature') ? array() : '';
333
334        if ($type) {
335                if (!isset($services[$type])) {
336                        $services[$type] = isocode_lister_services($type);
337                }
338
339                if (in_array($service, $services[$type])) {
340                        if ($type === 'nomenclature') {
341                                include_spip("services/${type}/${service}/${service}_api");
342                                $tables_trouvees = array_keys($GLOBALS['isocode'][$service]);
343                        } else {
344                                include_spip("services/${type}/${type}_api");
345                                $tables_trouvees = $GLOBALS['isocode'][$type][$service]['table'];
346                        }
347                }
348        }
349
350        return $tables_trouvees;
351}
352
353
354/**
355 * Renvoie la configuration d'un service.
356 *
357 * @api
358 * @filtre
359 *
360 * @param string $type
361 * @param string $service
362 * @param string $table   Nom de la table sans le préfixe `spip_`.
363 *
364 * @return bool
365 *      `true` si la table est chargée, `false` sinon.
366 */
367function isocode_crediter($type, $service, $table = '') {
368
369        // Récupérer la configuration propre au service / table.
370        include_spip('inc/isocode_utils');
371        $credits = configuration_lire($type, $service, $table, 'credits');
372
373        return $credits;
374}
375
376
377/**
378 * Indique si une table est déjà chargée ou pas en base de données.
379 * La fonction scrute la table `spip_${table}` et non la meta propre à la table.
380 *
381 * @api
382 * @filtre
383 *
384 * @param string $table
385 *      Nom de la table sans le préfixe `spip_`.
386 * @param array  $meta_table
387 *      Meta propre à la table, créée lors du chargement de celle-ci et retournée si la table
388 *      est déjà chargée.
389 *
390 * @return bool
391 *      `true` si la table est chargée, `false` sinon.
392 */
393function isocode_lire_consignation($type, $service, $table) {
394
395        // Récupérer la meta propre au règne afin de la retourner.
396        include_spip('inc/config');
397        $meta = ($type === 'nomenclature')
398                ? lire_config("isocode/${type}/${table}")
399                : lire_config("isocode/${type}/${service}");
400
401        return $meta;
402}
Note: See TracBrowser for help on using the repository browser.