source: spip-zone/_plugins_/isocode/trunk/isocode_fonctions.php @ 100347

Last change on this file since 100347 was 100347, checked in by eric@…, 5 years ago

Renommage.
Refactoring des messages du formulaire.

  • Property svn:eol-style set to native
File size: 11.8 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 isocode_lister_tables()
20 * @uses isocode_trouver_service()
21 * @uses isocode_lire()
22 * @uses isocode_vider_tables()
23 *
24 * @param array $tables
25 *      Liste des tables à charger. Si le tableau est vide l'ensemble des tables
26 *      seront chargées.
27 *      Les tables doivent être libellées sans le préfixe `spip_`.
28 *
29 * @return array
30 *      Tableau associatif résultat de l'action de vidage:
31 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
32 *      - index `tables_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
33 *      - index `tables_nok` : liste des tables en erreur ou tableau vide sinon.
34 *      - index `tables_sha` : liste des tables inchangées (SHA identique) ou tableau vide sinon.
35 */
36function isocode_charger_tables($tables = array()) {
37
38        $retour = array(
39                'ok'         => true,
40                'tables_ok'  => array(),
41                'tables_nok' => array(),
42                'tables_sha' => array()
43        );
44
45        // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger.
46        // Le cas où le service existe mais que la liste de tables associées est vide est traité dans
47        // la boucle des services ci-après.
48        if (!$tables) {
49                // Le tableau est vide : il faut charger toutes les tables de tous les services supportés.
50                $tables = isocode_lister_tables();
51        } elseif (is_string($tables)) {
52                // L'argument n'est pas un tableau mais une chaine, on considère que l'appelant a demandé
53                // le chargement d'une table identifiée par cette chaine.
54                $tables = array($tables);
55        } elseif (!is_array($tables)) {
56                // L'argument n'est pas compréhensible, on met la liste à vide pour sortir sans traitement
57                // et on enregistre l'erreur.
58                $retour['ok'] = false;
59                $retour['tables_nok'][] = $tables;
60                $tables = array();
61        }
62
63        // On charge chacune des tables spécifiées en identifiant au préalable le service concerné.
64        // -- Pour éviter d'avoir une mise à jour bancale, il faudrait inclure les requêtes SQL dans
65        // une transaction ce qui n'est pas possible avec spip aujourd'hui.
66        // De fait, on ne peut pas assurer que si une erreur se produit le résultat soit cohérent et
67        // on renvoie juste l'erreur --
68        if ($tables) {
69                include_spip('inc/config');
70                foreach ($tables as $_table) {
71                        $erreur_table = true;
72                        $sha_identique = false;
73
74                        // On détermine le service qui supporte le chargement de la table
75                        $service = isocode_trouver_service($_table);
76                        if ($service) {
77                                // Lecture des données contenues soit dans un fichier soit dans une page web et renvoie d'une liste
78                                // d'éléments prêts à être enregistrés dans la table concernée.
79                                // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de
80                                // lecture ne renvoie aucun élément pour éviter des traitements inutiles mais renvoie un indicateur
81                                // sur le SHA.
82                                include_spip('inc/isocode_sourcer');
83                                list($records, $sha, $sha_identique) = isocode_lire($service, $_table);
84                                if ($records) {
85                                        // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur
86                                        // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit.
87                                        isocode_vider_tables($_table);
88
89                                        // Insertion dans la base de données des éléments extraits
90                                        $sql_ok = sql_insertq_multi("spip_${_table}", $records);
91                                        if ($sql_ok !== false) {
92                                                // On stocke les informations de chargement de la table dans une meta.
93                                                $meta = array(
94                                                        'service' => $service,
95                                                        'sha'     => $sha,
96                                                        'nbr'     => count($records),
97                                                        'maj'     => date('Y-m-d H:i:s')
98                                                );
99                                                ecrire_config("isocode/tables/${_table}", $meta);
100                                                $erreur_table = false;
101                                        }
102                                }
103                        }
104
105                        // Si la table est en erreur, on passe l'indicateur global à erreur et on stocke la table en nok
106                        // ou en sha identique suivant la cas.
107                        // Si le traitement est ok on stocke juste la table.
108                        if ($erreur_table) {
109                                $retour['ok'] = false;
110                                if ($sha_identique) {
111                                        $retour['tables_sha'][] = $_table;
112                                } else {
113                                        $retour['tables_nok'][] = $_table;
114                                }
115                        } else {
116                                $retour['tables_ok'][] = $_table;
117                        }
118                }
119        }
120
121        return $retour;
122}
123
124
125/**
126 * Supprime en base de données, le contenu des tables de codes ISO choisies.
127 * Si la liste des tables est vide la fonction considère que toutes les tables doivent être vidées.
128 * La meta concernant les informations de chargement de chaque table est aussi effacée.
129 *
130 * @api
131 * @filtre
132 *
133 * @uses isocode_lister_tables()
134 *
135 * @param array $tables
136 *      Liste des tables à vider. Si le tableau est vide l'ensemble des tables
137 *      seront vidées.
138 *      Les tables doivent être libellées sans le préfixe `spip_`.
139 *
140 * @return array
141 *      Tableau associatif résultat de l'action de vidage:
142 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
143 *      - index `tables_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
144 *      - index `tables_nok` : liste des tables en erreur ou tableau vide sinon.
145 */
146function isocode_vider_tables($tables = array()) {
147
148        $retour = array(
149                'ok'         => true,
150                'tables_ok'  => array(),
151                'tables_nok' => array()
152        );
153
154        // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger.
155        // Le cas où le service existe mais que la liste de tables associées est vide est traité dans
156        // la boucle des services ci-après.
157        if (!$tables) {
158                // Le tableau est vide : il faut charger toutes les tables de tous les services supportés.
159                $tables = isocode_lister_tables();
160        } elseif (is_string($tables)) {
161                // L'argument n'est pas un tableau mais une chaine, on considère que l'appelant a demandé
162                // le chargement d'une table identifiée par cette chaine.
163                $tables = array($tables);
164        } elseif (!is_array($tables)) {
165                // L'argument n'est pas compréhensible, on met la liste à vide pour sortir sans traitement
166                // et on enregistre l'erreur.
167                $retour['ok'] = false;
168                $retour['tables_nok'][] = $tables;
169                $tables = array();
170        }
171
172        // On boucle sur la liste des tables et on vide chaque table référencée.
173        if ($tables) {
174                include_spip('inc/config');
175                foreach ($tables as $_table) {
176                        $sql_ok = sql_delete("spip_${_table}");
177                        if ($sql_ok !== false) {
178                                // Supprimer la meta propre à la table.
179                                effacer_config("isocode/tables/${_table}");
180                                // Enregistrer le succès du déchargement de la table
181                                $retour['tables_ok'][] = $_table;
182                        } else {
183                                $retour['ok'] = false;
184                                $retour['tables_nok'][] = $_table;
185                        }
186                }
187        }
188
189        return $retour;
190}
191
192
193/**
194 * Détermine le service associé au chargement de la table de codes ISO choisie.
195 * Si la table est vide ou invalide, la fonction renvoie une chaine vide.
196 *
197 * @api
198 * @filtre
199 *
200 * @uses isocode_lister_services()
201 *
202 * @param $table
203 *      Nom d'une table sans le préfixe `spip_`.
204 *
205 * @return string
206 *      Nom du service permettant le chargement de la table ou chaine vide si aucun service n'est trouvé.
207 */
208function isocode_trouver_service($table) {
209
210        static $services = array();
211        static $tables = array();
212        $service = '';
213
214        if (is_string($table) and $table) {
215                if (!$services) {
216                        $services = isocode_lister_services();
217                }
218
219                foreach ($services as $_service) {
220                        if (!isset($tables[$_service])) {
221                                include_spip("services/${_service}/${_service}_api");
222                                $tables[$_service] = array_keys($GLOBALS['isocode'][$_service]['tables']);
223                        }
224                        if (in_array(strtolower($table), $tables[$_service])) {
225                                $service = $_service;
226                                break;
227                        }
228                }
229        }
230
231        return $service;
232}
233
234
235/**
236 * Retourne la liste des services disponibles pour le chargement des tables de codes ISO.
237 * La fonction lit les sous-répertoires du répertoire `services/` du plugin.
238 *
239 * @api
240 * @filtre
241 *
242 * @return array
243 *      La liste des services disponibles ou tableau vide aucun service n'est détecté.
244 */
245function isocode_lister_services() {
246
247        $services = array();
248
249        if ($dossiers = glob(_DIR_PLUGIN_ISOCODE . '/services/*', GLOB_ONLYDIR)) {
250                foreach ($dossiers as $_dossier) {
251                        $services[] = strtolower(basename($_dossier));
252                }
253        }
254
255        return $services;
256}
257
258
259/**
260 * Vérifie si le service demandé est fait bien partie de la liste des services disponibles.
261 *
262 * @api
263 * @filtre
264 *
265 * @uses isocode_lister_services()
266 *
267 * @param string $service
268 *      Nom du service à vérifier.
269 *
270 * @return bool
271 *      `true` si le service est disponible, `false` sinon.
272 */
273function isocode_service_disponible($service) {
274
275        $disponible = false;
276        if ($service and in_array(strtolower($service), isocode_lister_services())) {
277                $disponible = true;
278        }
279
280        return $disponible;
281}
282
283
284/**
285 * Retourne la liste de toutes les tables gérées par le plugin ou de celles associées à un ou plusieurs
286 * services donnés.
287 *
288 * @api
289 * @filtre
290 *
291 * @uses isocode_lister_services()
292 * @uses isocode_service_disponible()
293 *
294 * @param array $services
295 *      Liste des services pour lesquels la liste des tables associées est demandée.
296 *      Si la liste est vide la fonction renvoie les tables de tous les services disponibles.
297 *
298 * @return array
299 *      Liste des tables sans le préfixe `spip_`.
300 */
301function isocode_lister_tables($services = array()) {
302
303        $tables = array();
304
305        // Si le tableau des services est vide c'est que l'on veut toutes les tables de tous
306        // les services disponibles.
307        // On accepte tous les cas où l'argument est vide sans être un tableau.
308        if (!$services) {
309                $services = isocode_lister_services();
310        }
311
312        // Si l'argument est non vide et est une chaine on considère que c'est un service et on le
313        // transforme en un tableau à un élément.
314        // Sinon c'est une erreur.
315        if (!is_array($services)) {
316                $services = is_string($services) ? array($services) : array();
317        }
318
319        // On collecte pour chaque service, la liste des tables qu'il supporte.
320        foreach ($services as $_service) {
321                if (isocode_service_disponible($_service)) {
322                        include_spip("services/${_service}/${_service}_api");
323                        $tables = array_merge($tables, array_keys($GLOBALS['isocode'][$_service]['tables']));
324                }
325        }
326
327        return $tables;
328}
329
330
331/**
332 * Informe sur la liste des tables déjà chagées en base de données.
333 * Les informations de la meta de chaque table sont complétées et renvoyées.
334 *
335 * @api
336 * @filtre
337 *
338 * @return array
339 *      Liste des tables de codes ISO sans le préfixe `spip_` et leurs informations de chargement.
340 */
341function isocode_informer_tables_chargees() {
342
343        // On initialise la liste des tables en lisant la meta idoine.
344        include_spip('inc/config');
345        $tables = lire_config('isocode/tables', array());
346
347        // On complète chaque bloc d'informations par le nom de la table et son libéllé.
348        if ($tables) {
349                foreach ($tables as $_table => $_informations) {
350                        $tables[$_table]['nom'] = $_table;
351                        $tables[$_table]['libelle'] = _T("isocode:label_table_${_table}");
352                }
353        }
354
355        return $tables;
356}
357
358
359/**
360 * Indique si une table est déjà chargée ou pas en base de données.
361 * La fonction scrute la table `spip_${table}` et non la meta propre à la table.
362 *
363 * @api
364 * @filtre
365 *
366 * @param string $table
367 *      Nom de la table sans le préfixe `spip_`.
368 * @param array  $meta_table
369 *      Meta propre à la table, créée lors du chargement de celle-ci et retournée si la table
370 *      est déjà chargée.
371 *
372 * @return bool
373 *      `true` si la table est chargée, `false` sinon.
374 */
375function isocode_table_chargee($table, &$meta_table) {
376        $meta_table = array();
377        $table_chargee = false;
378
379        $retour = sql_countsel("spip_${table}");
380        if ($retour) {
381                // Récupérer la meta propre au règne afin de la retourner.
382                include_spip('inc/config');
383                $meta_table = lire_config("isocode/tables/${table}");
384                $table_chargee = true;
385        }
386
387        return $table_chargee;
388}
Note: See TracBrowser for help on using the repository browser.