Tables de base de données personnalisées Importation de données

Dans le dernier tutoriel, nous avons examiné l’exportation de données à partir d’un tableau personnalisé. Bien sûr, ce n’est que la moitié de l’histoire - nous devons évidemment fournir un moyen d’importer ces données. Naturellement, WordPress ne gère pas cela - alors encore une fois, nous devons lancer notre propre.

Dans le précédent article de cette série, nous avions noté que si nos données contenaient des références à l'une des tables WordPress natives (un ID de publication, par exemple), nous rencontrions plutôt rapidement des difficultés. La raison en est que lors de l'importation de telles données, l'ID de publication référencé peut ne pas exister et, le cas échéant, peut ne pas être l'ID correct. En effet, lorsque les publications sont importées, leur identifiant peut changer pour éviter les collisions dans la base de données (identifiants). doit être unique).

Normalement, c’est acceptable: les données liées sont importées ensemble et les références sont mises à jour lors de la procédure d’importation afin de s’assurer que toutes les modifications se propagent dans l’ensemble du jeu de données. Cependant, comme indiqué dans l'article précédent, il est très difficile (sauf dans des cas particuliers) d'importer nos données personnalisées avec les données natives. Les mises en garde mentionnées dans cet article sont donc identiques à celles de cet article - et comme auparavant, bien que l'exemple ci-dessous fasse référence à des tableaux WordPress, il est utilisé simplement par souci de cohérence avec le reste de la série.


Le balisage

Nous souhaitons permettre à nos utilisateurs d'importer des données à partir du fichier d'exportation généré dans le dernier article de cette série. Commençons donc par ajouter un formulaire permettant à l'utilisateur de télécharger ce fichier. Nous ferons cela en modifiant la classe que nous avons définie dans le dernier tutoriel..

 class WPTuts_Log_Export_Admin_Page / ** * Le suffixe de crochet de page * / static $ hook_suffix = "; fonction statique load () add_action ('admin_menu', array (__CLASS__, 'add_submenu'));; add_action ('admin_init', array (__CLASS__ , 'Maybe_download')); add_action ('admin_init', array (__CLASS__, 'Maybe_upload')); add_action ('admin_notices', array (__CLASS__, 'admin_notices')); Fonction statique add_submenu () / * Défini dans article précédent * / fonction statique peut-être_download () / * Défini dans l'article précédent * / fonction statique display () / * Défini dans l'article précédent - mais nous allons faire quelques modifications * / fonction statique peut-être_upload ()  fonction statique admin_notices ()  fonction statique import ()  fonction statique parse ()  WPTuts_Log_Export_Admin_Page :: load ();

Ci-dessus, nous avons ajouté les méthodes suivantes

  • peut-être_upload () - qui agira en tant qu’auditeur pour un fichier soumis pour importation.
  • admin_notices () - qui affichera un avis de réussite ou d'erreur après avoir tenté d'importer un fichier.
  • importation() - qui recevra un fichier téléchargé et importera les données.
  • parse () - une fonction d'assistance appelée par importation() analyser le fichier téléchargé et extraire les journaux qu'il contient.

Mais d’abord, nous allons ajouter un formulaire permettant de télécharger un fichier. Nous ajouterons ceci au-dessous du bouton d'exportation que nous avons créé dans l'article précédent. Pour ce faire, nous devons apporter quelques modifications au afficher() méthode, responsable de la production du balisage de notre page d’administration. Comme ce second formulaire soumettra un fichier, nous devons définir le type de codage sur 'multipart / form-data'.

 '; screen_icon (); écho '

'. __ ('Exporter les journaux d'activité', 'wptuts-log'). '

'; ?>


Traitement de la soumission du formulaire

Ensuite, nous souhaitons savoir quand le formulaire ci-dessus est soumis et déclencher la routine d'importation. Avant de faire cela, il est important de lancer quelques vérifications:

  • L'utilisateur a-t-il autorisation télécharger des fichiers? Ici, nous n’avons accordé que ceux qui peuvent manage_options la possibilité de télécharger.
  • Est-ce que l'utilisateur l'intention télécharger les fichiers (nous vérifions cela en vérifiant le nonce)
  • Un fichier a-t-il été téléchargé? Et était-ce du type correct
  • Y at-il des erreurs dans le téléchargement?

Vous pouvez éventuellement limiter la taille du fichier téléchargé comme une sorte de "vérification de l'intégrité". Dans cet exemple, je l'ai plafonné à 2 Mo. (Une fonction utile pour formater les tailles de fichiers de manière "lisible par l'homme" est la fonction size_format).

 fonction statique Maybe_upload () / * Écouter la soumission du formulaire * / if (vide ($ _POST ['action']) || 'import-logs'! == $ _POST ['action']) return; / * Vérifier les autorisations et nonces * / if (! Current_user_can ('manage_options')) wp_die ("); check_admin_referer ('wptuts-import-logs', '_wplnonce'); / * Effectuer des vérifications sur le fichier: * / // Sanity vérifier si (vide ($ _FILES ["wptuts_import"])) wp_die ('Aucun fichier trouvé'); $ file = $ _FILES ["wptuts_import"]; // Est-ce du type attendu? if ($ type [type "]! =" text / xml ") wp_die (sprintf (__ (" Une erreur est survenue lors de l'importation des journaux. Type de fichier détecté: '% s'. 'text' xml 'attendu', 'wptuts-log'), $ file ['type'])); // Impose une limite à la taille du fichier téléchargé. Maximum 2097152 octets = 2 Mo si ($ file ["taille"]> 2097152) $ taille = taille_format ($ fichier ['taille '], 2); wp_die (sprintf (__ (' Taille du fichier trop grande (% s). Maximum 2 Mo ',' Import-logs '), $ taille)); ((file file ["error"]> 0 ) wp_die (sprintf (__ ("Une erreur est survenue:% d", 'wptuts-import'), $ file ["erreur"])); / * Si nous en sommes arrivés là, nous pouvons importer les données * / $ imports = self :: import ($ file ['nom_mpT']]); / * Tout est terminé, maintenant retour direct à la page * / wp_redirect (add_query_arg ('importé', $ importé)); sortie(); 

Importer le fichier

Ensuite, nous devons importer le fichier. Nous devons d’abord extraire les journaux du fichier téléchargé - et nous allons déléguer ce travail au parse () méthode (nous arriverons à cette méthode dans un peu).

Une fois que nous avons ces journaux, nous allons d’abord vérifier s’ils existent déjà (pour éviter toute duplication accidentelle), avant de les insérer. Lors de la vérification des journaux, nous ne ferons que vérifier l'ID utilisateur et la date d'activité. Nous pourrions, si nous le voulions, être plus stricts (activité de contrôle, ID d'objet et type, etc.), mais nous aurions besoin de revenir en arrière et d'étendre notre API (spécifiquement wptuts_get_logs ()).

Une fois les journaux importés, nous redirigeons l'utilisateur vers notre page d'administration. Nous allons ajouter une variable de requête à l'URL (importé) pour stocker le nombre de journaux importés (le cas échéant). De cette façon, nous pouvons afficher un message administrateur approprié.

 function import ($ file) // fichier d'analyse $ logs = self :: parse ($ fichier); // Aucun journal trouvé? - puis avorté. if (! $ logs) renvoie 0; // Initialise une variable stockant le nombre de journaux importés avec succès. $ importé = 0; // Parcourez chaque journal pour chaque journal ($ logs comme $ log_id => $ log) / * * Vérifiez si le journal existe déjà: * Nous allons simplement vérifier la date et l'ID utilisateur, mais nous pourrions vérifier d'autres détails * si nous avons étendu notre API wptuts_get_logs () * / $ existe = wptuts_get_logs (array ('user_id' => $ log ['user_id'], 'since' => mysql2date ('G', $ log ['activity_date'], false) , jusqu'à ce que = = mysql2date ('G', $ log ['date_activité'], false),)); // S'il existe, ne l'importez pas si ($ existe) continue; // Insère le log $ success = wptuts_insert_log (array ('user_id' => $ log ['user_id'], 'date' => mysql2date ('G', $ log ['date_activité'], false), 'object_id' => $ log ['object_id'], 'object_type' => $ log ['type_objet'], 'activity' => $ log ['activity'], 'activity_date' => $ log ['activity_date'],) ) si ($ réussie) $ importé ++;  return $ importé; 

Analyser le fichier

Nous devons encore définir le parse () méthode qui, étant donné le fichier téléchargé, doit extraire les données et les renvoyer sous forme de tableau de journaux. Heureusement, avec le gestionnaire XML intégré de PHP, cette tâche est relativement simple..

 function parse ($ file) // Charge le fichier XML $ xml = simplexml_load_file ($ file); // stop si le chargement génère une erreur if (! $ xml) return false; // Journaux initiaux array $ logs = array (); foreach ($ xml-> xpath ('/ logs / item') sous la forme $ log_obj) $ log = $ log_obj-> children (); $ log_id = (int) $ log-> log_id; $ logs [$ log_id] = array ('utilisateur_id' => (int) $ log-> utilisateur_id, 'object_id' => (int) $ log-> object_id, 'type_objet' => (chaîne) $ log-> type_objet , 'activty' => (chaîne) $ log-> activité, 'date_activité' => (chaîne) $ log-> date_activité,);  return $ logs; 

Affichage de la notification de l'administrateur

Enfin, nous voulons définir notre admin_notices () méthode pour afficher un message approprié après le téléchargement du fichier. Rappelons qu'une fois la routine d'importation terminée, nous redirigeons l'utilisateur vers notre page d'administration, avec la variable de requête. importé ajouté, stockant le nombre de journaux importés. Nous l'utilisons pour déterminer si nous devons afficher un message d'erreur ou de succès..

Nous vérifions également l’identifiant de l’écran afin d’afficher uniquement l’avis sur notre page d’administration. Si vous n'êtes pas sûr de l'identifiant d'écran de votre page d'administration, consultez cet article..

 function admin_notices () // Une importation a-t-elle été tentée et sommes-nous sur la page d'administration correcte? if (! isset ($ _GET ['importé'])) || 'tools_page_wptuts-export'! == get_current_screen () -> id) return; $ importer = intval ($ _GET ['importé']); if (1 == $ importé) printf ('

% s

', __ (' 1 journal importé avec succès ',' wptuts-import ')); elseif (intval ($ _GET ['importé'])) printf ('

% s

', sprintf (__ ('% d journaux ont été importés avec succès ',' wptuts-import '), $ importé)); else printf ('

% s

', __ (' Aucune grume n'a été importée ',' wptuts-import '));