Tabele de baze de date personalizate Importarea datelor

În ultimul tutorial am analizat exportul de date dintr-o tabelă personalizată. Desigur, aceasta este doar jumătate din poveste - evident, trebuie să furnizăm o modalitate de a importa aceste date. Bineînțeles, WordPress nu se ocupă de acest lucru - deci încă o dată trebuie să ne rănim pe noi.

În articolul precedent din această serie am notat că, dacă datele noastre conțin referințe la unul dintre tabelele WordPress native (un ID post, de exemplu), atunci am greșit destul de repede. Motivul este că atunci când importați astfel de date, este posibil ca ID-ul postat la care se face referire să nu existe și, dacă este cazul, poate să nu fie codul corect. Acest lucru se datorează faptului că, atunci când postările sunt importate, ID-ul lor se poate schimba pentru a evita coliziunile în baza de date (ID-uri trebuie sa fi unic).

În mod normal, acest lucru este bine: datele legate sunt importate împreună și referințele sunt actualizate în timpul rutinei de import, pentru a se asigura că orice modificări se propagă în întregul set de date. Cu toate acestea, după cum sa discutat în articolul precedent, este foarte dificil (cu excepția cazurilor speciale) de a importa datele personalizate împreună cu datele native. Așadar, avertismentele menționate în acel articol merg mai departe către aceasta - și, ca și mai înainte, deși exemplul de mai jos face referire la tabelele WordPress, este folosit pur și simplu pentru a asigura coerența cu restul seriei.


Mark-Up

Vrem să permitem utilizatorilor noștri să importe date din fișierul de export generat în ultimul articol din această serie - deci, să începem cu adăugarea unui formular care permite utilizatorului să încarce acel fișier. Vom face acest lucru modificând clasa pe care am definit-o în ultimul tutorial.

 class = WPTuts_Log_Export_Admin_Page / ** * Suportul de hârtie pentru pagină * / static $ hook_suffix = "; încărcarea funcției statice () add_action ('admin_menu', array (__CLASS__, 'add_submenu' , "add_action ('admin_notices')); add_action ('admin_init', array (__CLASS__, 'maybe_upload')); articolul precedent * / funcția statică may_download () / * Definiți în articolul precedent * / afișarea funcției statice () / * Definiți în articolul precedent - dar vom face unele modificări * / funcția statică maybe_upload funcția statică admin_notices ()  funcția statică import ()  funcția statică parse ()  WPTuts_Log_Export_Admin_Page :: load ();

Mai sus, am adăugat următoarele metode

  • maybe_upload () - care va acționa în calitate de ascultător pentru depunerea unui fișier pentru import.
  • admin_notices () - care va afișa o notificare de succes sau eroare după ce a încercat să importe un fișier.
  • import() - care va primi un fișier încărcat și va importa datele.
  • analiza() - o funcție de ajutor numită de import() pentru a analiza fișierul încărcat și pentru a extrage jurnalele pe care le conține.

Dar, mai întâi, vom adăuga un formular prin care putem încărca un fișier. Vom adăuga acest lucru sub butonul de export pe care l-am creat în articolul precedent. Pentru a face acest lucru vom avea nevoie de unele modificări la afişa() metodă, responsabilă de producerea marcajului paginii noastre de administrare. Din moment ce acest al doilea formular va trimite un fișier, trebuie să setăm tipul de codificare la 'multipart / form-data'.

 „; screen_icon (); echo "

". __ ("Jurnal de activitate de export", "wptuts-log"). '

„; ?>


Manipularea trimiterii formularului

Apoi, dorim să ascultăm când se trimite formularul de mai sus și să declanșeze rutina de import. Înainte de a face acest lucru este important să executați câteva verificări:

  • Are un utilizator permisiune pentru a încărca fișiere? Aici am acordat doar celor care pot manage_options capacitatea de încărcare.
  • A fost utilizatorul intenționează pentru a încărca fișierele (verificăm acest lucru verificând nonce)
  • A fost încărcat un fișier de fapt? Și era de tip corect
  • Au existat erori la încărcare?

Opțional, puteți plasa o limită a mărimii fișierului încărcat ca un fel de "control sanitar". În acest exemplu am limitat la 2MB. (Funcția utilă pentru formatarea dimensiunilor fișierelor într-un mod "ușor de citit de om" este funcția size_format).

 funcția statică may_upload () / * Ascultă pentru trimiterea formularului * / if (empty $ _POST ['action']) || import-logs! == $ _POST ['action'] return; / * Verificați permisiunile și nonces * / if (! Current_user_can ('manage_options')) wp_die ("); check_admin_referer ('wptuts-import-logs', '_wplnonce' verificați dacă ($ _FILES ["wptuts_import"])) wp_die ('Nu sa găsit niciun fișier'); $ file = $ _FILES ["wptuts_import" "] / =" text / xml ") wp_die (sprintf (__ (" ($ file ["size"]> 2097152) $ size = size_format ($ file ['size')) '], 2); wp_die (sprintf (__ (' Dimensiunea fișierului prea mare (% s). ) wp_die (sprintf (__ ("Eroare întâmpinată:% d", "wptuts-import"), $ file ["error"]);) / * $ import = auto :: import ($ file ['tmp_name']); / * Totul este complet, acum re directe înapoi la pagina * / wp_redirect (add_query_arg ('importat', $ importat)); Ieșire(); 

Importarea fișierului

Apoi trebuie să importați fișierul. Mai întâi va trebui să extragem jurnalele din fișierul încărcat - și vom delega acea slujbă la analiza() (vom ajunge la această metodă puțin).

Odată ce avem aceste jurnale, vom verifica mai întâi dacă acestea există deja (pentru a evita duplicarea accidentală), înainte de a le introduce. Când verificăm jurnalele, vom verifica ID-ul utilizatorului și data activității. Am putea, dacă vrem, să fim mai stricți (activitatea de verificare, ID-ul și tipul obiectului etc.), dar ar trebui să ne întoarcem și să extindem API-ul wptuts_get_logs ()).

Odată ce am importat jurnalele, redirecționăm utilizatorul înapoi la pagina noastră de administrare. Vom adăuga o variabilă de interogare la adresa URL (importate) pentru a stoca numărul de jurnale importate (dacă există). În acest fel, putem afișa un mesaj de administrare corespunzător.

 funcția de import ($ file) // Parse fișier $ logs = auto :: parse (fișier $); // Nu s-a găsit niciun jurnal? - apoi aborted. dacă (! $ logs) returnează 0; // Initializează o variabilă care stochează numărul de jurnale importate cu succes. $ imported = 0; / / * Verificați dacă jurnalul există deja: * Vom verifica doar data și ID-ul utilizatorului, dar am putea verifica alte detalii * dacă am extins wptuts_get_logs () API * / $ exists = wptuts_get_logs (array ('user_id' => $ log ['user_id'], 'since' mysql2date (' , 'până la' => mysql2date ('G', $ log ['activity_date'], false);)); // Dacă există, nu-l importați dacă ($ există) continuă; // Introduceți jurnalul $ successful = wptuts_insert_log (array ('user_id' => $ log ['user_id'], 'date' => mysql2date ('G', $ log ['activity_date' => $ log ['object_id'], 'object_type' => $ log ['object_type'], 'activity' => $ log ['activity'], ); dacă ($ reușit) $ importat ++;  return $ importat; 

Parsarea fișierului

Trebuie să definim în continuare analiza() care, dat fiind fișierul încărcat, ar trebui să extragă datele și să le returneze ca o serie de jurnale. Din fericire, cu ajutorul unui handler XML construit în PHP, aceasta este o sarcină destul de simplă.

 funcția parse (fișier $) // Încărcați fișierul xml $ xml = simplexml_load_file ($ file); // stop dacă încărcarea produce o eroare dacă (! $ xml) return false; // Arborele inițial al logurilor $ logs = array (); foreach ($ xml-> xpath ('/ logs / item') ca $ log_obj) $ log = $ log_obj-> copii (); $ log_id = (int) $ log-> log_id; $ log_id] = array ('user_id' => int) $ log-> user_id, 'object_id' => (int) $ log-> object_id, 'object_type' => , 'activty' => (șir) $ log-> activity, 'activity_date' => (șir) $ log-> activity_date,);  returnează jurnalele $; 

Afișarea Notificării de administrator

În cele din urmă, vrem să ne definim admin_notices () pentru a afișa un mesaj corespunzător după încărcarea fișierului. Amintiți-vă că odată ce rutina de import a fost terminată, redirecționăm utilizatorul înapoi la pagina noastră de administrare, cu variabila de interogare importate adăugat, stocând numărul de jurnale importate. Folosim acest lucru pentru a determina dacă ar trebui să afișăm o eroare sau un mesaj de succes.

De asemenea, verificăm ID-ul ecranului astfel încât să afișăm anunțul numai pe pagina noastră de administrare. Dacă nu sunteți sigur care este ID-ul ecranului pentru pagina de administrare, consultați acest articol.

 funcția admin_notices () // A fost încercat un import și suntem pe pagina corectă de administrare? dacă isset ($ _GET ['importat]] ||' tools_page_wptuts-export '! == get_current_screen () -> id) retur; $ import = intval ($ _GET ['importat']); dacă (1 == $ importat) printf ('

% s

', __ (' 1 log importat cu succes ',' wptuts-import ')); elseif (intval ($ _GET ['importat'])) printf ('

% s

', sprintf (__ ('% d jurnale importate cu succes ',' wptuts-import '), $ imported)); altfel printf ('

% s

", __ (" Nu au fost importate buletine "," wptuts-import "));
Cod