Migració a Drupal 7: Com vaig gestionar el problema del mòdul Webfm

Tinc un parell de llocs Drupal 6 que usen el mòdul Webfm (https://drupal.org/project/webfm). Aquest mòdul mai no es va migrar a Drupal 7 perquè a aquesta última versió de Drupal l'API de fitxers va canviar completament, cosa que implicava reescriure totalment el mòdul, i ningú no ho va fer.

La meva solució va ser substituir el mòdul webfm pel gestor de fitxers "Elfinder" i el corresponent mòdul de Drupal  (https://drupal.org/project/elfinder). Això no substitueix totes les funcionalitats de gestor de documents de webfm, és sols un gestor de fitxers i no té cap gestió de base de dades dels documents, però per una altra part és realment bo com a gestor de fitxers. Així que potser el complementaré en el futur amb algun mòdul de "gestor de coneixement" per buscar i posar etiquetes als meus documents.

En primer lloc òbviament heu de migrar el vostre lloc de Drupal 6 a Drupal 7. Habilitar tots els mòdul a Drupal 7, no podreu habilitar webfm perquè no hi ha una versió Drupal 7, però les taules de webfm romandran en la vostra base de dades migrada.

La instal·lació i configuració de l'Elfinder al vostre lloc Drupal 7 migrat és senzilla, i pot usar exactament la mateixa estructura de fitxers que el webfm va deixar. També haureu d'enllaçar el vostre editor, en el meu cas CKEditor, això també va ser fàcil.

El problema ve amb els enllaços que el webfm va crear (del tipus "/webfm_send/#", on # és un número arbitrari assignat per webfm.). Si no voleu acabar amb moltíssims enllaços trencats al vostre lloc heu d'arreglar aquests enllaços. Si teniu poc contingut podeu arreglar els enllaços trencats a mà, però en aquest cas no és massa probable que esteu usant webfm per a res, ja que un lloc petit pot treballar perfectament amb el sistema de fitxers pla sense cap gestió de documents especial.

La reparació dels enllaços, si teniu un lloc gran, involucra el treball directe amb la base de dades, així que atureu-vos aquí si no us animeu, en qualsevol case heu de fer còpia de seguretat i saber com restaurar la base de dades perquè amb tota probabilitat haureu d'iterar un parell de cops abans que tot funcioni. També se suposa que sabeu com treballar amb phpmyadmin i el teniu instal·lat, tot i que es pot fer tot des de la línia d'ordre de mysql, així que necessiteu almenys accés a la línia d'ordres del vostre servidor, o alguna manera de gestionar i executar scripts de sql a la instal·lació del mysql on viu el vostre drupal.

La reparació dels enllaços tampoc no va ser massa difícil, sols una mica de treball dur (en el meu cas 2 o 3 hores, depèn de la velocitat d'execució dels scripts de sota al vostre sistema). Tota la informació és a la taula "webfm_file", aquí teniu el número # que apareix a l'enllaç webfm_send, i el camí real al fitxer dins del sistema de fitxers del vostre servidor. Estan emmagatzemats als camps "fid" i "fpath" respectivament. Els enllaços webfm_send, però, estan per tot arreu a diferents tauls. Així que vaig fer el següent:

1) Ubiqueu primer totes les taules on teniu enllaços webfm_send: Això ho vaig fer anant a phpmyadmin, i fent una búsqueda a totes les taules amb el següent text: "%webfm_send%". Al meu lloc les taules i el nombre de cops que apareix l'enllaç van ser:

23 block_custom 26 content_field_descripcio 9 content_field_informaci_confidencial 1 content_field_resum_de_lacte_si_ha_esta 2 content_type_capsula 1478 field_data_body 4 field_data_comment_body 26 field_data_field_descripcio 9 field_data_field_informaci_confidencial 2 field_data_field_mes_info 1 field_data_field_resum_de_lacte_si_ha_esta 1488 field_revision_body 26 field_revision_field_descripcio 9 field_revision_field_informaci_confidencial 2 field_revision_field_mes_info 1 field_revision_field_resum_de_lacte_si_ha_esta 19 locales_source 1 menu_links 2 webform_component

2) A continuació heu d'executar un script a la pestanya SQL del phpmyadmin. Escolliu una de les taules afectades. Aneu a "Navegar" i intenteu esbrinar en quins camps poden aparèixer els enllaços webfm_send. Generalment són camps relacionats amb el "cos" i el "resum" de l'element de la taula afectada. En algunes altres taules poden aparèixer en altres camps, potser voldeu córrer algunes cerques, tot i que el més senzill és incloure tota els camps tipus text o varchar, sempre que no sigui evident que els enllaços no poden ser-hi (un camp amb el nom de "type" per exemple és molt poc probable que inclogui un enllaç). En tot case si s'inclou un camp sense enllaç tampoc passa res. Per exemple a les taules field_data_body i field_revision_data_body, que són les que tenen la major part dels enllaços trencats, els enllaços estan als camps "body_value" i "body_summary". Aquí està el meu script per a la taula field_data_body:

 

drop procedure if exists proc; delimiter // create procedure proc() begin declare done boolean default 0; declare path varchar(255); declare id int; declare cur cursor for select fpath, fid from webfm_file; declare continue handler for sqlstate '02000' set done = 1; open cur; block: loop fetch cur into path, id; if done then leave block; end if; set @from = concat('/webfm_send/', id, '"'); set @path = concat('/', path, '"'); update field_data_body set body_value = replace(body_value, @from, @path), body_summary = replace(body_summary, @from, @path); end loop; close cur; end//

L'scipt s'explica per si sol. Primer llegeix la parella fid/fpath. Després crea un bucle (d'una manera molt elegant que em van suggerir a Stackexchange, vaig aconseguir fer el mateix amb un bucle "while"), per a continuació convertir fid and fpath a la forma que anirà en la substitució real dels enllaçs. I finalment la proposició UPDATE fa la substitució. La cerca i substitució pot ser lenta, especialment si teniu molt de contingut, però al final es completarà.

3) Heu de córrer el mateix per a totes les taules afectades, simplement canviant el nom de la taula per a cada cas i incloent a la proposició UPDATE el camp o els camps que puguin estar afectats a la taula que esteu tractant. Aquest script es podria convertir a una funció o cosa semblant, però ja feia mandra.

4) Quan acabeu podeu tornar a fer la cerca a tota la base de dades del text %webfm_send%", potser encara us surten alguns enllaços trencats com em va passar a mi perquè ja estaven trencats al lloc original (trencats ja al mòdul webfm), però en el meu casi vaig acabar amb aproximadament 30 enllaços trencats i tenia més de 10.000 nodes.

Etiquetes: