Changeset 100347 in spip-zone for _plugins_/isocode
- Timestamp:
- Nov 3, 2016, 8:10:52 PM (4 years ago)
- Location:
- _plugins_/isocode/trunk
- Files:
-
- 3 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/isocode/trunk/formulaires/isocode_gerer_table.php
r100330 r100347 14 14 * 15 15 * @return array 16 * 17 * 18 * 16 * Tableau des données à charger par le formulaire (affichage). Aucune donnée chargée n'est un 17 * champ de saisie, celle-ci sont systématiquement remises à zéro. 18 * - `_actions_tables` : (affichage) alias et libellés des actions possibles sur une table, `charger` et 19 19 * `vider` 20 * 21 * 22 * 20 * - `_actions_disable` : (affichage) liste des actions désactivées (`vider` si aucune table n`est chargée) 21 * - `_action_defaut` : (affichage) action sélectionnée par défaut, `charger` 22 * - `_tables` : (affichage) noms des tables sans le préfixe `spip_` 23 23 */ 24 24 function formulaires_isocode_gerer_table_charger() { … … 59 59 * 60 60 * @return array 61 * 61 * Tableau des erreurs sur l'action et/ou la table ou tableau vide si aucune erreur. 62 62 */ 63 63 function formulaires_isocode_gerer_table_verifier() { … … 78 78 * 79 79 * @uses isocode_charger_tables() 80 * @uses isocode_decharger_tables() 81 * 80 * @uses isocode_vider_tables() 81 * @uses formater_message() 82 * 82 83 * @return array 83 * 84 * 84 * Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou 85 * d'erreur. L'indicateur editable est toujours à vrai. 85 86 */ 86 87 function formulaires_isocode_gerer_table_traiter() { … … 93 94 $tables = _request('tables'); 94 95 95 // Pour chaque table, on génère l'action demandée 96 if ($action == 'vider') { 97 list($action_ok, $tables_nok) = isocode_decharger_tables($tables); 98 $message = $action_ok 99 ? _T('isocode:succes_vider_table') 100 : _T('isocode:erreur_vider_table', array('tables' => implode(', ', $tables_nok))); 101 } else { 102 // La fonction de chargement de la table lance un vidage préalable si la table 103 // demandé est déjà chargée. 104 list($action_ok, $tables_nok, $tables_inchangees) = isocode_charger_tables($tables); 105 if ($action_ok) { 106 $message = _T('isocode:succes_charger_table'); 107 } else { 108 $message = ''; 109 if ($tables_inchangees) { 110 $message .= _T('isocode:notice_charger_table', array('tables' => implode(', ', $tables_inchangees))); 111 } 112 if ($tables_nok) { 113 $message .= $message ? '<br/>' : ''; 114 $message .= _T('isocode:erreur_charger_table', array('tables' => implode(', ', $tables_nok))); 115 } 116 } 117 } 96 // Pour chaque table, on génère l'action demandée. 97 // (La fonction de chargement de la table lance un vidage préalable si la table demandé est déjà chargée) 98 $actionner = "isocode_${action}_tables"; 99 $statut = $actionner($tables); 118 100 119 $type_message = $action_ok ? 'message_ok' : 'message_erreur';120 $retour [$type_message] = $message;101 // Formatage du message avant renvoie au formulaire 102 $retour = formater_message($action, $statut); 121 103 $retour['editable'] = true; 122 104 123 105 return $retour; 124 106 } 107 108 109 /** 110 * Formate les messages de succès et d'erreur résultant des actions de chargement ou de vidage 111 * des tables de codes ISO. 112 * 113 * @param string $action 114 * Action venant d'être appliquée à certaines tables. Peut prendre les valeurs `charger` et 115 * `vider`. 116 * @param array $statut 117 * Tableau résultant de l'action sur les tables choisies: 118 * - `ok` : `true` si le vidage a réussi, `false` sinon. 119 * - `tables_ok` : liste des tables vidées avec succès ou tableau vide sinon. 120 * - `tables_nok` : liste des tables en erreur ou tableau vide sinon. 121 * - `tables_sha` : liste des tables inchangées (SHA identique) ou tableau vide sinon. 122 * Uniquement disponible pour l'action `charger`. 123 * 124 * @return array 125 * Tableau des messages à afficher sur le formulaire: 126 * - `message_ok` : message sur les tables ayant été traitées avec succès ou tableau vide sinon. 127 * - `message_erreur` : message sur les tables en erreur ou tableau vide sinon. 128 */ 129 function formater_message($action, $statut) { 130 131 $message = array( 132 'message_ok' => '', 133 'message_erreur' => '' 134 ); 135 136 // Traitement des succès 137 if (!empty($statut['tables_ok'])) { 138 $message['message_ok'] .= _T("isocode:succes_${action}_table", array('tables' => implode(', ', $statut['tables_ok']))); 139 } 140 141 // Traitement des erreurs 142 if (!empty($statut['tables_nok'])) { 143 $message['message_erreur'] .= _T("isocode:erreur_${action}_table", array('tables' => implode(', ', $statut['tables_nok']))); 144 } 145 if (!empty($statut['tables_sha'])) { 146 $message['message_erreur'] .= $message['message_erreur'] ? '<br />' : ''; 147 $message['message_erreur'] .= _T("isocode:notice_${action}_table", array('tables' => implode(', ', $statut['tables_sha']))); 148 } 149 150 return $message; 151 } -
_plugins_/isocode/trunk/inc/isocode_sourcer.php
r100346 r100347 1 1 <?php 2 2 /** 3 * Ce fichier contient la fonction générique de lecture d'un fichier CSV en un tableau d'éléments d'une4 * table de la base de données.5 * 6 * @package SPIP\ISOCODE\ OUTILS3 * Ce fichier contient la fonction générique de lecture d'un fichier ou d'une page HTML source 4 * en un tableau d'éléments prêt à être inséré dans une table de la base de données. 5 * 6 * @package SPIP\ISOCODE\LECTURE 7 7 */ 8 8 if (!defined('_ECRIRE_INC_VERSION')) { … … 19 19 * qui complète l'élément. 20 20 * 21 * @api 22 * 21 23 * @param string $service 22 * 24 * Nom du service associé à la lecture de la table. 23 25 * @param string $table 24 * 25 * 26 * @return array 27 * 28 * 29 * - index 1 : le sha256 du fichier CSVsource des éléments de la table30 */ 31 function i nc_isocode_read($service, $table) {26 * Nom de la table concernée par la lecture de la source. 27 * 28 * @return array 29 * Tableau à deux éléments: 30 * - index 0 : la liste des éléments à enregistrer dans la table concernée 31 * - index 1 : le sha256 de la source des éléments de la table 32 */ 33 function isocode_lire($service, $table) { 32 34 33 35 // Initialisations 34 36 $records = array(); 35 $sha_file = false;36 37 $f_complete_record = "${table}_complete_by_record"; 37 38 $f_complete_table = "${table}_complete_by_table"; 39 $sha_identique = true; 38 40 39 41 // Inclusion des configurations et des fonctions spécifiques au service qui fournit les données … … 44 46 $config = $GLOBALS['isocode'][$service]['tables'][$table]; 45 47 46 // Détermination de la clé primaire de la table 48 // Détermination de la clé primaire de la table. 47 49 $primary_key_table = get_primary_key($table); 48 50 49 // Initialisation d'un élément de la table par défaut (uniquement les champs de base) 51 // Initialisation d'un élément de la table par défaut (uniquement les champs de base). 50 52 // Cela permet de s'assurer que chaque élément du tableau de sortie aura la même structure 51 53 // quelque soit les données lues dans la source. … … 53 55 54 56 // Récupération du contenu du fichier ou de la page HTML source et du sha associé. Pour les fichiers CSV 55 // on renvoie aussi la liste des titres des colonnes .57 // on renvoie aussi la liste des titres des colonnes qui existe toujours. 56 58 list($content, $header, $sha) = get_source_content($service, $table, $config); 57 59 if ($content and $sha and $default_fields) { 58 60 // On n'analyse le contenu que si celui-ci a changé (sha différent de celui stocké). 59 include_spip('isocode_fonctions');60 61 if (!isocode_comparer_sha($sha, $table)) { 62 $sha_identique = false; 61 63 $primary_key_values = array(); 62 64 foreach ($content as $_element) { … … 70 72 $key = trim($_key); 71 73 // Seuls les champs identifiés dans la configuration sont récupérés dans le fichier 72 if (isset($ fields_config[$key])) {73 $fields[$ fields_config[$key]] = $_value ? trim($_value) : '';74 if (isset($config['basic_fields'][$key])) { 75 $fields[$config['basic_fields'][$key]] = $_value ? trim($_value) : ''; 74 76 // Vérifier si le champ en cours fait partie de la clé primaire et élaborer la clé 75 77 // primaire de l'élément en cours 76 if (in_array($ fields_config[$key], $primary_key_table['list'])) {77 $pkey_element[$ fields_config[$key]] = $_value;78 if (count($pkey_element) == $primary_key_table['count']) {78 if (in_array($config['basic_fields'][$key], $primary_key_table)) { 79 $pkey_element[$config['basic_fields'][$key]] = $_value; 80 if (count($pkey_element) == count($primary_key_table)) { 79 81 $pkey_element_exists = true; 80 82 } … … 111 113 } 112 114 113 return array($records, $sha _file);115 return array($records, $sha, $sha_identique); 114 116 } 115 117 … … 127 129 if ($id_key = id_table_objet($table)) { 128 130 // On stocke la clé sous forme de liste pour les tests d'appartenance. 129 $primary_key ['list']= explode(',', $id_key);131 $primary_key = explode(',', $id_key); 130 132 // On trie la liste et on recompose la clé sous forme de chaine pour la gestion des doublons. 131 sort($primary_key['list']); 132 $primary_key['name'] = implode(',', $primary_key['list']); 133 // On stocke le nombre de champs de la clé. 134 $primary_key['count'] = count($primary_key['list']); 133 sort($primary_key); 135 134 } 136 135 … … 144 143 * 145 144 * @param string $table 146 * 145 * Nom de la table concernée par la lecture sans le préfixe `spip_`. 147 146 * @param array $fields_config 148 * 149 * 147 * Configuration de la correspondance entre le nom de la donnée dans la source 148 * et celui du champ dans la table. 150 149 * 151 150 * @return array … … 211 210 * @param $table 212 211 * @param $config 213 * 212 * Configuration de la méthode de lecture de la source pour la table concernée. 214 213 * 215 214 * @return array … … 233 232 $content = explode($config['parsing']['element']['delimiter'], $flux['page']); 234 233 } else { 235 // TODO : C'est une regexp... à compléter234 // TODO : c'est une regexp... à compléter 236 235 } 237 236 } … … 304 303 return $values; 305 304 } 305 306 307 /** 308 * Compare le sha passé en argument pour la table concernée avec le sha stocké dans la meta 309 * pour cette même table. 310 * 311 * @api 312 * 313 * @param string $sha 314 * SHA à comparer à celui de la table. 315 * @param string $table 316 * Nom de la table de code ISO (sans préfixe `spip_`) dont il faut comparer le sha 317 * stoké dans sa meta de chargement. 318 * 319 * @return bool 320 * `true` si le sha passé en argument est identique au sha stocké pour la table choisie, `false` sinon. 321 */ 322 function isocode_comparer_sha($sha, $table) { 323 324 $sha_identique = false; 325 326 // On récupère le sha de la table dans les metas si il existe (ie. la table a été chargée) 327 include_spip('inc/config'); 328 $sha_stocke = lire_config("isocode/tables/${table}/sha", false); 329 330 if ($sha_stocke and ($sha == $sha_stocke)) { 331 $sha_identique = true; 332 } 333 334 return $sha_identique; 335 } -
_plugins_/isocode/trunk/isocode_fonctions.php
r100330 r100347 17 17 * @filtre 18 18 * 19 * @uses isocode_lister_tables() 19 20 * @uses isocode_trouver_service() 20 * @uses isocode_decharger_tables() 21 * @uses isocode_lire() 22 * @uses isocode_vider_tables() 21 23 * 22 24 * @param array $tables … … 26 28 * 27 29 * @return array 28 * Tableau résultat de l'action de vidage: 29 * - index 0 : `true` si le vidage a réussi, `false` sinon. 30 * - index 1 : liste des tables en erreur ou tableau vide sinon. 31 * - index 2 : liste des tables inchangées ou tableau vide sinon. 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. 32 35 */ 33 36 function isocode_charger_tables($tables = array()) { 34 37 35 $retour = array(true, array(), array()); 38 $retour = array( 39 'ok' => true, 40 'tables_ok' => array(), 41 'tables_nok' => array(), 42 'tables_sha' => array() 43 ); 36 44 37 45 // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger. … … 46 54 $tables = array($tables); 47 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; 48 60 $tables = array(); 49 61 } … … 57 69 include_spip('inc/config'); 58 70 foreach ($tables as $_table) { 59 $erreur_table = false;71 $erreur_table = true; 60 72 $sha_identique = false; 61 73 … … 63 75 $service = isocode_trouver_service($_table); 64 76 if ($service) { 65 // Détermination de la fonction de lecture de la table et lecture des données contenues66 // soit dans un fichier soit dans une page web.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. 67 79 // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de 68 // lecture ne renvoie aucun élément pour éviter des traitements inutiles. Il faut donc distinguer 69 // ce cas d'une erreur de lecture. 70 include_spip("services/${service}/${service}_api"); 71 $lire_table = charger_fonction('isocode_read', 'inc'); 72 list($records, $sha) = $lire_table($service, $_table); 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); 73 84 if ($records) { 74 85 // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur 75 // sur ce traitement car elle sera forcément détectée sur l'insertqui suit.76 isocode_ decharger_tables($_table);86 // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit. 87 isocode_vider_tables($_table); 77 88 78 89 // Insertion dans la base de données des éléments extraits … … 87 98 ); 88 99 ecrire_config("isocode/tables/${_table}", $meta); 89 } else { 90 $erreur_table = true; 91 } 92 } else { 93 // Si le sha n'a pas changé la fonction de lecture renvoie aucun enregistrement mais ce n'est pas 94 // une erreur à proprement parlé. 95 $erreur_table = true; 96 if (isocode_comparer_sha($sha, $_table)) { 97 $sha_identique = true; 100 $erreur_table = false; 98 101 } 99 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 } 100 115 } else { 101 $erreur_table = true; 102 } 103 104 if ($erreur_table) { 105 $retour[0] = false; 106 if ($sha_identique) { 107 $retour[2][] = $_table; 108 } else { 109 $retour[1][] = $_table; 110 } 116 $retour['tables_ok'][] = $_table; 111 117 } 112 118 } … … 125 131 * @filtre 126 132 * 133 * @uses isocode_lister_tables() 134 * 127 135 * @param array $tables 128 * Liste des noms de table sans le préfixe `spip_`. 129 * 130 * @return array 131 * Tableau résultat de l'action de vidage: 132 * - index 0 : `true` si le vidage a réussi, `false` sinon. 133 * - index 1 : liste des tables en erreur ou tableau vide sinon. 134 */ 135 function isocode_decharger_tables($tables = array()) { 136 137 $retour = array(true, array()); 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 */ 146 function isocode_vider_tables($tables = array()) { 147 148 $retour = array( 149 'ok' => true, 150 'tables_ok' => array(), 151 'tables_nok' => array() 152 ); 138 153 139 154 // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger. … … 148 163 $tables = array($tables); 149 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; 150 169 $tables = array(); 151 170 } … … 159 178 // Supprimer la meta propre à la table. 160 179 effacer_config("isocode/tables/${_table}"); 180 // Enregistrer le succès du déchargement de la table 181 $retour['tables_ok'][] = $_table; 161 182 } else { 162 $retour[ 0] = false;163 $retour[ 1][] = $_table;183 $retour['ok'] = false; 184 $retour['tables_nok'][] = $_table; 164 185 } 165 186 } … … 175 196 * 176 197 * @api 198 * @filtre 199 * 200 * @uses isocode_lister_services() 177 201 * 178 202 * @param $table 179 * Nom d'une table de codes ISOsans le préfixe `spip_`.203 * Nom d'une table sans le préfixe `spip_`. 180 204 * 181 205 * @return string 182 * 206 * Nom du service permettant le chargement de la table ou chaine vide si aucun service n'est trouvé. 183 207 */ 184 208 function isocode_trouver_service($table) { … … 214 238 * 215 239 * @api 216 * 217 * @return array 218 * La liste des services disponibles ou tableau vide aucun service n'est détecté. 240 * @filtre 241 * 242 * @return array 243 * La liste des services disponibles ou tableau vide aucun service n'est détecté. 219 244 */ 220 245 function isocode_lister_services() { … … 236 261 * 237 262 * @api 238 * 239 * @param $service 240 * Nom du service à vérifier. 263 * @filtre 264 * 265 * @uses isocode_lister_services() 266 * 267 * @param string $service 268 * Nom du service à vérifier. 241 269 * 242 270 * @return bool … … 258 286 * services donnés. 259 287 * 288 * @api 289 * @filtre 290 * 291 * @uses isocode_lister_services() 292 * @uses isocode_service_disponible() 293 * 260 294 * @param array $services 261 * 262 * Si la liste est vide la fonction renvoie les tables de tous les services dsponibles.263 * 264 * @return array 265 * Liste des tables de codes ISOsans le préfixe `spip_`.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_`. 266 300 */ 267 301 function isocode_lister_tables($services = array()) { … … 300 334 * 301 335 * @api 302 * 303 * @return array 304 * Liste des tables de codes ISO sans le préfixe `spip_` et leurs informations de chargement. 336 * @filtre 337 * 338 * @return array 339 * Liste des tables de codes ISO sans le préfixe `spip_` et leurs informations de chargement. 305 340 */ 306 341 function isocode_informer_tables_chargees() { … … 323 358 324 359 /** 325 * Indique si une table de codes ISOest déjà chargée ou pas en base de données.360 * Indique si une table est déjà chargée ou pas en base de données. 326 361 * La fonction scrute la table `spip_${table}` et non la meta propre à la table. 327 362 * … … 330 365 * 331 366 * @param string $table 332 * 367 * Nom de la table sans le préfixe `spip_`. 333 368 * @param array $meta_table 334 * 335 * 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. 336 371 * 337 372 * @return bool 338 * 373 * `true` si la table est chargée, `false` sinon. 339 374 */ 340 375 function isocode_table_chargee($table, &$meta_table) { … … 352 387 return $table_chargee; 353 388 } 354 355 356 /**357 * Compare le sha passé en argument pour la table concernée avec le sha stocké dans la meta358 * pour cette même table.359 *360 * @api361 *362 * @param string $sha363 * Sha à comparer à celui de la table.364 * @param string $table365 * Nom de la table de code ISO (sans préfixe `spip_`) dont il faut comparer le sha366 * stoké dans sa meta de chargement.367 *368 * @return bool369 * `true` si le sha passé en argument est identique au sha stocké pour la table choisie, `false` sinon.370 */371 function isocode_comparer_sha($sha, $table) {372 373 $sha_identique = false;374 375 // On récupère le sha de la table dans les metas si il existe (ie. la table a été chargée)376 include_spip('inc/config');377 $sha_stocke = lire_config("isocode/tables/${table}/sha", false);378 379 if ($sha_stocke and ($sha == $sha_stocke)) {380 $sha_identique = true;381 }382 383 return $sha_identique;384 } -
_plugins_/isocode/trunk/lang/isocode_fr.php
r100330 r100347 12 12 13 13 // E 14 'erreur_charger_table' => 'Une erreur s\'est produite lors du chargement de la ou des tables @tables@.',15 'erreur_vider_table' => 'Une erreur s\'est produite lors du vidage de la ou des tables @tables@.',14 'erreur_charger_table' => 'Une erreur s\'est produite lors du chargement de la ou des tables « @tables@ ».', 15 'erreur_vider_table' => 'Une erreur s\'est produite lors du vidage de la ou des tables « @tables@ ».', 16 16 'explication_action_table' => 'Si la table est déjà chargée en base de données elle sera vidée avant le chargement.', 17 17 … … 40 40 41 41 // N 42 'notice_charger_table' => 'Aucune mise à jour n\'est nécessaire sur la ou les tables @tables@.',42 'notice_charger_table' => 'Aucune mise à jour n\'est nécessaire sur la ou les tables « @tables@ ».', 43 43 'notice_liste_aucune_table' => 'Aucune table de codes ISO n\'a encore été chargée en base de données. Utiliser le formulaire ci-dessous pour y remédier.', 44 44 45 45 // S 46 'succes_charger_table' => 'L es tables choisiesont bien été chargées.',47 'succes_vider_table' => 'L es tables choisiesont bien été vidées.',46 'succes_charger_table' => 'La ou les tables « @tables@ » ont bien été chargées.', 47 'succes_vider_table' => 'La ou les tables « @tables@ » ont bien été vidées.', 48 48 49 49 // T
Note: See TracChangeset
for help on using the changeset viewer.