Migrazione da Drupal 5 a Drupal 7, Case Study

469 views
411 views

Published on

Migrazione da Drupal 5 a Drupal 7: un Case Study

Il caso UniJuris

(C) francescobrunetta.it - 2013

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
469
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Migrazione da Drupal 5 a Drupal 7, Case Study

  1. 1. Case study: migrazione daDrupal 5 a Drupal 7Il caso UniJuris© www.francescobrunetta.it
  2. 2. 30/05/2013 (c) francescobrunetta.it 2Antefatto www.unijuris.it Osservatorio sulla giurisprudenza fallimentare Sito nato nel 2009 Sviluppato con Drupal 5
  3. 3. 30/05/2013 (c) francescobrunetta.it 3Antefatto Sito complesso con: Funzioni di catalogazione provvedimenti Tribunali(Sentenze) – multi vocabolario – allegati – datariferimento Altre strutture informative (approfondimenti,notizie, info didattiche, ecc.) Funzioni di ricerca: per tassonomia, per parolachiave, per data Filtraggio per tassonomia Newsletter con iscrizione anonimi
  4. 4. 30/05/2013 (c) francescobrunetta.it 4Antefatto Ospitato su macchina virtuale (Aruba) Modificato nel tempo per soddisfare diverseesigenze Di conseguenza, alcune scelte tecnologichesi sono modificate nel tempo iniziale uso di “tag cloud” poi non più necessario tassonomie e tipi di contenuto variati nel tempo
  5. 5. 30/05/2013 (c) francescobrunetta.it 5Perché una migrazione Sito molto vecchio: Drupal 5 – non più supportato Uso di versione PHP obsoleta Rischi per la sicurezza Limitate funzionalità Impossibile aggiungere nuove funzionalità Hosting limitato Poco spazio disco Difficile gestione e aggiornamento sw di base
  6. 6. 30/05/2013 (c) francescobrunetta.it 6Requisiti nuovo sito Rispettare funzionalità esistenti(catalogazione, ricerca, strumenti) Riportare allegati (file pdf anche multipliallegati a molti documenti) Aggiungere funzionalità alla ricerca perparole chiave Aggiungere altre funzionalità non previste: Vendite competitive gestite dal pubblicatore Dati aggiuntivi (altre categorie, nr. sentenza,ecc…)
  7. 7. 30/05/2013 (c) francescobrunetta.it 7Criticità (1) Impossibile una migrazione tout court daDrupal 5 a Drupal 7 salto troppo grande: troppi cambiamenti nel core alcuni moduli usati non servono più (tag clouds,ecc.). Altri non esistono per D7. Scelta obbligata: Realizzare nuovo sito con corretta struttura Reimportare i dati
  8. 8. 30/05/2013 (c) francescobrunetta.it 8Criticità (2) Numero di documenti da migrare:relativamente elevato (circa 2000) Improbabile migrazione “manuale” uno per uno Necessario mantenere indirizzi originali giàregistrati su motori di ricerca www.unijuris.it/node/xxx Taxonomy/term/xxxx Mai implementato un meccanismo di autoalias Necessario non perdere informazioni su:nome del pubblicatore; data di pubblicazione!
  9. 9. 30/05/2013 (c) francescobrunetta.it 9Fasi dell’operazione E’ stato necessario lungo lavoro di analisi emessa a punto per la migrazione Una prima fase di sperimentazione (su:strumenti per l’indicizzazione e la ricerca;strumenti per la migrazione dei dati) Una seconda fase (Unijuris 2 Reloaded!) concreazione ex-novo del sito e migrazioneeffettiva dei contenuti
  10. 10. 30/05/2013 (c) francescobrunetta.it 10Prima fase: sperimentazione Creati tipi di contenuto necessari (Sentenze,Pagine informative) Creati vocabolari e importati i termini conmodulo: taxonomy_manager Primo problema: non consente di importare i TID i termini hanno un nuovo numero  non vabene Creati nodi “dummy” per sperimentazione
  11. 11. 30/05/2013 (c) francescobrunetta.it 11Prima fase: sperimentazione (2) Effettuato sperimentazione con: ricerca “core search”; ricerca con “search api”; strumenti di filtraggio “facets api”, applicati al coresearch e a search api Modulo “taxonomy filter” (ancora in versione -devma necessario per mantenere funzionalità pre-esistenti)
  12. 12. 30/05/2013 (c) francescobrunetta.it 12Prima fase: sperimentazione (3) Strumenti di importazione vari La scelta finale per l’importazione è stata: Feeds http://drupal.org/project/feeds Feeds tamper http://drupal.org/project/feeds_tamper Vantaggi: Molto elastico Consente di conservare informazioni di base (nid,tid, uid, autore….. Tutti gli id!)
  13. 13. 30/05/2013 (c) francescobrunetta.it 13Feeds e Feeds Tamper Modulo Feeds consente importazione di datida varie fonti: incluso http e file .csv Si creano diversi “importer”, associati a contenttype specifici; Si mappano i campi del file .csv con i campi delcontent type opportuno  con qualcheaccorgimento! Si importano effettivamente i dati
  14. 14. 30/05/2013 (c) francescobrunetta.it 14Feeds e Feeds Tamper Modulo Feeds_tamper consente di trattareogni singolo campo del file .csv PRIMAdell’importazione. Ad es: Conversioni formati data Trim Explode Molte altre possibilità già pronte
  15. 15. 30/05/2013 (c) francescobrunetta.it 15Seconda fase: Unijuris 2 Reloaded! Finite le sperimentazioni, è stato necessarioricreare sito da zero con: Tipi di contenuto completi (come in prima fase) NIENTE vocabolari, niente termini Conservato il vocabolario 1  tags NB: VID 1 non era usato sul sito “sorgente” Ruoli e permessi Niente utenti
  16. 16. 30/05/2013 (c) francescobrunetta.it 16Unijuris2 reloaded: importare tassonomia Problema: nessun modulo trovato consentedi importare categorie rispettando i tid  tuttili creano ex-novo Soluzione adottata: sporca ma funzionante Descritta in: http://drupal.org/node/1728672 Funziona! Niente effetti collaterali
  17. 17. 30/05/2013 (c) francescobrunetta.it 17Unijuris2 reloaded: importare tassonomia In sintesi: Accesso al db (usato phpmyadmin) Copiato db “sorgente” su stesso MySql server cheospita sito “target” Annotato (a mano) il VID (vocabulary id) di ognivocabolario Importazione “manuale” via comando SQL
  18. 18. 30/05/2013 (c) francescobrunetta.it 18 Esempio: per vocabolario con vid 2:INSERT INTO `db7target`.taxonomy_vocabularySELECT vid,name, LOWER(name),description,hierarchy,module,weightFROM `db5-source`.vocabulary v where v.vid =2Unijuris2 reloaded: importare vocabolari
  19. 19. 30/05/2013 (c) francescobrunetta.it 19 Esempio: per vocabolario con vid 2:INSERT INTO `db7target`.taxonomy_term_data(tid,vid,name,description,weight)SELECT tid,vid,name,description,weightFROM `db5-source`.term_data td WHERE td.vid = 2INSERT into `db7target`.taxonomy_term_hierarchySELECT t.*FROM `db5-source`.term_hierarchy tJOIN `db5-source`.term_data td on td.tid = t.tidwhere td.vid = 2 It works like a charm!Unijuris2 reloaded: importare termini
  20. 20. 30/05/2013 (c) francescobrunetta.it 20 Feeds consente di importare utenti Ma non abbiamo provato Nel nostro caso, pochi utenti  ricreati amano (più rapido) Importante: usare stesso indirizzo email degliutenti originali! Verificare ruoli e permessiUnijuris2 reloaded: importare utenti
  21. 21. 30/05/2013 (c) francescobrunetta.it 21Unijuris2 reloaded: importare nodi Procedura seguita: Creare nuovi content type sul sito “target” (con tutti i campinecessari, inclusi riferimenti tassonomia) Esportare nodi “originali” su file CSV Importare CSV con importer del modulo FEEDS Obbiettivi generali: Ottenere il CSV dal sito originale Rispettare HTML dei “body” Rispettare tassonomia Rispettare autori e date di creazione Importare attachment (anche multipli)
  22. 22. 30/05/2013 (c) francescobrunetta.it 22 Meglio: esportazione/importazione separate Una per ogni tipo di contenuto Ad es: Prima esportato/importato sentenze Poi “pagine informative” Poi “newsletter” EccUnijuris2 reloaded: importare nodi
  23. 23. 30/05/2013 (c) francescobrunetta.it 23 Primo problema: ottenere CSV (su Drupal 5) Usato: https://drupal.org/project/views_bonus (per D5) Views  esportazione su CSV dei field opportuni Funziona ma con qualche problema!Esportare i nodi da Drupal 5 (1)
  24. 24. 30/05/2013 (c) francescobrunetta.it 24Esportare i nodi da Drupal 5 (2) Per ogni esportazione create TRE viewsdiverse (3 views diverse per ogni contenttype diverso) 1) tutti i campi necessari MENO body eattachment 2) solo NID + BODY 3) solo NID + FILEPATH Importazione nodi in tre fasi! Ora vediamo perché!
  25. 25. 30/05/2013 (c) francescobrunetta.it 25Importare nodi – fase 1 su 3
  26. 26. 30/05/2013 (c) francescobrunetta.it 26Importare nodi fase 1 Importazione dei nodi SENZA body e SENZAallegati Procedura: Esportare su CSV da sito sorgente Predisporre importazione su sito target Importare  creazione automatica dei nodi conNID originale e TIDs originali
  27. 27. 30/05/2013 (c) francescobrunetta.it 27Fase 1.1 – Esportazione Prima views: esportato (su .csv): Nid Titolo Created time (as short date) User-email (dell’autore del documento) Taxonomy terms, uno per ogni vocabolarioutilizzato Tutti gli altri campi Ordine: Node ID ASCENDING
  28. 28. 30/05/2013 (c) francescobrunetta.it 28Fase 1.2 – Preparazione target Sul sito “target” nel tipo contenuto: I campi dei term referencedevono essere AUTOCOMPLETE!!! Creato importer con modulo feed; mappando NID Id del nodo (UNIQUE), createdPublisheddate; emailuser email; termini tassonomia neicorrispondenti campi; ecc. NON BASTA! 
  29. 29. 30/05/2013 (c) francescobrunetta.it 29 Nel .csv i termini di tassonomia sono separatida “ | “:"93", "xxxx","concordato | classi | transazione" Necessario “esplodere” la stringa in un array Si fa con: feeds tamper  explode  separatore“ | “ (notare spazio prima e dopo |) Uno per ogni campo term reference!Fase 1.3 – Preparazione target
  30. 30. 30/05/2013 (c) francescobrunetta.it 30 Importare i nodi dal csv: I nodi vengono creati con lo stesso NID del sitooriginale (sono sicuramente univoci) L’email viene usata per associare l’autore(funziona!) I termini vengono associati correttamente (in baseal nome grazie ad autocomplete!) con stesso TIDdel sito originale! Abbiamo avuto qualche problema con data dicreazione (vedremo dopo!)Fase 1.4 – Importazione
  31. 31. 30/05/2013 (c) francescobrunetta.it 31Importare nodi – fase 2 su 3
  32. 32. 30/05/2013 (c) francescobrunetta.it 32Importare nodi fase 2 Aggiornamento dei nodi con inserimento deiBODY completi di tags html Procedura: Esportare su CSV da sito sorgente (attenti!) Predisporre importazione su sito target Post-processing dei files csv! Importare  aggiornamento automatico dei nodicon inserimento del body
  33. 33. 30/05/2013 (c) francescobrunetta.it 33Fase 2.1 – Esportazione Seconda views: esportato (su .csv): Nid Body Ordine: Node ID ASCENDING
  34. 34. 30/05/2013 (c) francescobrunetta.it 34 Problema: l’esportazione del body su csvNON riporta i tag html originali  male, ciservono! Trucco: sul sito sorgente, piccola patch asitesallmodulesviews_bonusviews_bonus_export.module (linea 210)- $values[] = " . str_replace(", "",decode_entities(strip_tags($value))) . ";+ $values[] = " . str_replace(", "",decode_entities($value)) . ";Fase 2.2 – Esportazione
  35. 35. 30/05/2013 (c) francescobrunetta.it 35Fase 2.3 – Esportazione Da usare SOLO per esportazione body: Si modifica il file views_bonus_export.module Si esportano i dati con la view Si ripristina views_bonus_export.module originale Si ottiene Body con tutti i tag html originali!
  36. 36. 30/05/2013 (c) francescobrunetta.it 36 Secondo problema: Drupal 5 nel csvaggiunge al body informazioni inutili! Ad esempio: aggiunge una tabella in HTML congli attachment!! <table id=""attachments""><thead><tr><th>Allegato</th><th>Dimensione</th></tr></thead><tbody> <tr class=""odd""><td><ahref=""http://www.unijuris.it/files/giuris/esdebitazione21.12.2007 Trib. Udine.pdf"">esdebitazione 21.12.2007 Trib.Udine.pdf</a></td><td>46.15 KB</td> </tr></tbody></table>Fase 2.4 – trattare il file csv
  37. 37. 30/05/2013 (c) francescobrunetta.it 37 Soluzione: uno script che legge il .csvoriginale ed elimina testo inutile Noi usato: uno script php (altri linguaggiandavano anche bene)Fase 2.5 – trattare il file csv
  38. 38. 30/05/2013 (c) francescobrunetta.it 38<?php$myFile = "20130528-003-SENTENZE-body.csv";$count = 0;$cisiamo = false;$file = fopen($myFile, r);$primalinea = fgets($file);echo $primalinea;while(!feof($file)){$linea = fgets($file);if ($linea == "<table id=""attachments"">n") {$cisiamo = true;}if ($cisiamo) {if ($linea == "</table>n") {$cisiamo = false;$linea = fgets($file);}}if (!$cisiamo) { echo $linea;}}fclose($file);?> Legge il file riga perriga Riscrive in outputtutto meno latabella “inutile” Abbiamo un nuovofile “pulito”Fase 2.6 – trattare il file csv
  39. 39. 30/05/2013 (c) francescobrunetta.it 39 Simile problema con altre informazioni“intruse”:<div class=""field field-type-date field-field-data""><div class=""field-items""><div class=""field-item""><div class=""field-label-inline-first"">Data diriferimento: </div><span class=""date-display-single"">30/09/2006</span></div></div></div> Risolto con altrettanti script NB: c’era una soluzione più elegante ma cene siamo accorti dopo!Fase 2.7 – trattare il file csv
  40. 40. 30/05/2013 (c) francescobrunetta.it 40Fase 2.8 – importazione Creato nuovo importer con modulo Feed: Per AGGIORNARE i nodi Usando NID come campo univoco Inserendo BODY Ha funzionato bene! Nodi esistenti aggiornati con aggiunta di “body”completo di tags html NID originari ancora preservati!
  41. 41. 30/05/2013 (c) francescobrunetta.it 41Importare nodi – fase 3 su 3
  42. 42. 30/05/2013 (c) francescobrunetta.it 42Importare nodi fase 3 Aggiornamento dei nodi con aggiunta degliAllegati originali! Procedura: Esportare su CSV da sito sorgente Predisporre importazione su sito target Copia dei files originali Post-processing dei files csv! Importare  aggiornamento automatico dei nodicon creazione dei file allegati!
  43. 43. 30/05/2013 (c) francescobrunetta.it 43Fase 3.1 – Esportazione Terza views: esportato (su .csv): Nid File Path Ordine: Node ID ASCENDING
  44. 44. 30/05/2013 (c) francescobrunetta.it 44Fase 3.2 – copia dei file Copiato tutta la cartella “files” originale in unacartella provvisoria su sito target Ad esempio: private/fileoriginali Attenzione ai nomi dei files Su Unix sono case sensitive, su Windows no! Si rischia di perdere file: su windows Pippo.pdf coincidecon PIPPO.pdf, su U*X sono file diversi! Rispettare struttura di sottocartelle!
  45. 45. 30/05/2013 (c) francescobrunetta.it 45Fase 3.3 – trattare il file csv Primo problema: nel .csv c’è una riga perogni nodo e per ogni file allegato Se un nodo non ha allegati, è elencato lostesso  "194","" Se un nodo ha più allegati, è elencato piùvolte!"194","files/giuris/primofile.pdf""194","files/giuris/secondofile.pdf"
  46. 46. 30/05/2013 (c) francescobrunetta.it 46Fase 3.4 – trattare il file csv Soluzione: trattare il file csv con (ennesimo)script Se un nodo ha più allegati, dev’essereelencato una sola volta con allegaticoncatenati (ad es. da “|”) Poi useremo “tamper” per esplodere il nuovocampo! (separatore: “|”)"194","files/giuris/primofile.pdf|files/giuris/secondofile.pdf"
  47. 47. 30/05/2013 (c) francescobrunetta.it 47Fase 3.5 – trattare il file csv Altro problema: far capire al sito target DOVEprendere i file La sintassi corretta da usare nel file csvdev’essere:"194","private://fileoriginali/files/giuris/primofile.pdf|private://fileoriginali/files/giuris/secondofile.pdf“ Lo script deve aggiungere anche questo!
  48. 48. 30/05/2013 (c) francescobrunetta.it 48Fase 3.6 – importazione Il content type deve prevedere campo “file”con multiple occorrenze Si consiglia cartella specifica per ogni tipo dicontenuto Così teniamo d’occhio la situazionedell’importazione!
  49. 49. 30/05/2013 (c) francescobrunetta.it 49Fase 3.7 – importazione Creato nuovo importer con modulo Feed: Per AGGIORNARE i nodi Usando NID come campo univoco Mappando filepath campo allegati Usando un tamper su filepath  esplodi “|” (senza spazi!) Ha funzionato bene! Nodi esistenti aggiornati con aggiunta di file allegati anchemultipli I file vengono prelevati dalla cartellaprivate/fileoriginali/files… e copiati nella cartella files target!
  50. 50. 30/05/2013 (c) francescobrunetta.it 50Fase 3.8 – Considerazione Si poteva fare tutto con una singola fase(viewscsvtrattamentiimport) invece ditre? Probabilmente sì. Ma era più facile andare “perpassi” 
  51. 51. 30/05/2013 (c) francescobrunetta.it 51Un problema ulteriore: la data Ce ne siamo accorti dopo La data di creazione originale non venivarispettata! Nodi importati avevano tutti la nuova data dicreazione! MALE Perché?
  52. 52. 30/05/2013 (c) francescobrunetta.it 52Un problema ulteriore: la data Un banale problema di formato Nel csv:node_id,created"6", "22/01/2008 - 16:39“ Il sito target si aspettava:node_id,created"6", "01/22/2008 16:39“ mm/dd invece di dd/mm – e spazioseparatore delle ore invece di “-”!
  53. 53. 30/05/2013 (c) francescobrunetta.it 53Ancora uno script? Soluzione banale era: piccolo script pertrattare il file Ancora! Ma c’e’ strada più elegante: aggiungere unplugin a feeds_tamper! Possibile creare plugin personalizzati Basta creare un file .inc apposito
  54. 54. 30/05/2013 (c) francescobrunetta.it 54I plugin di feeds_tamper<?php$plugin = array(form => feeds_tamper_trattadata_form,callback => feeds_tamper_trattadata_callback,name => tratta la data come dico io,multi => loop,category => Date/time,);function feeds_tamper_trattadata_form($importer,$element_key, $settings) {$form = array();$form[html] = array(#markup => t(rigira un po la data come piace a me),);return $form;}function feeds_tamper_trattadata_callback($result, $item_key,$element_key, &$field, $settings, $source) {$data_ingresso = $field;$rimpiazzata = str_replace(" - ","/",$data_ingresso);$data_originale = explode("/",$rimpiazzata);$data_nuova = $data_originale[1] . "/" .$data_originale[0] . "/" .$data_originale[2] . " " .$data_originale[3];$unixtime = strtotime($data_nuova);$unixtime = $unixtime - 7200;$field = date("m/d/Y H:i",$unixtime);*/} Il plugin “trattadata” feeds_tamper/plugin/tratadata.inc Tratta la data come serviva anoi Anche correggendo problemidi “timezone” sul sitooriginale! Basta applicare questo“tamper” al primo importer eripetere l’importazione Attenti, non è detto che servao funzioni in ogni situazione!
  55. 55. 30/05/2013 (c) francescobrunetta.it 55Risultato finale I nodi originali sono tutti sul sito nuovo Gli indirizzi originali sono conservati:node/xxx, taxonomy/term/xxx Totale compatibilità col pre-esistente Gli allegati sono associati ai giusti documenti L’autore dei documenti è coerente, anche ledate!
  56. 56. 30/05/2013 (c) francescobrunetta.it 56Successo!  Per info:http://www.facebook.com/francescobrunettahttp://www.francescobrunetta.it/

×