Migración a Drupal 7: Como gestioné el problema del módulo Webfm

Tengo un par de sitios Drupal 6 que usan el módulo Webfm (https://drupal.org/project/webfm).  Este módulo no se migró nunca a Drupal 7 porque en esta última versión de Drupal, el API de archivos cambió completament, coa que implicaba reescribir totalment el módulo, y nadie lo hizo.

Mi solución fue substituir el módulo webfm por el gestor de archivos "Elfinder" i el correspondiente módulo de Drupal  (https://drupal.org/project/elfinder). Esto no substituye todas las funcionalidades del gestor de documentos webfm, es sólo un gestor de archivos y no tiene ninguna gestión de base de datos de los documentos, pero por otra parte es realmente bueno como gestor de archivos. Así que quizás lo complementaré en el futuro con algún módulo de "gestor de conocimiento" para buscar y poner etiquetes a mis documentos.

En primer lugar obviamente se tiene que migrar el sitio de Drupal 6 a Drupal 7. Se tienen que habiltar todos los módulos pero no se podrá habilitar webfm porque no hay una versión Drupal 7, pero las tablas de webfm se quedarán en la base de dades migrada.

La instalación y configuración de ElFinder en el sitio Drupal 7 migrado es sencilla, y puede usar exactamente la misma estructura de ficheros que dejó el webfm. También se tendrá que enlazar el editor, en mi caso CKEditor, pero eso también fue fácil.

El problema viene con los enlaces que el webfm creó (del tipo "/webfm_send/#", donde # es un número arbitrario asignado por webfm). Si no se quiere acabar con muchísimos enlaces rotos en el sitio se tienen que arreglar estos enlaces. Si hay poco contenido se pueden arreglar los enlaces rotos a mano, pero en este caso no es demasiado probable que se esté usando el webfm en primer lugar, ya que un sitio pequeño puede trabajar con el sistema de archivos plano sin niguna gestión especial de documentos.

La reparación de los enlaces, si el sitio es grande, involucra trabajar directamente con la base de datos, así que mejor pararse aquí si da miedo, en todo caso se tiene que hacer copia de seguridad y saber cómo restaurar la base de datos porque con toda probabilidad se tendrá que iterar un par de veces antes de que todo funcione. También se supone que se sabe cómo trabajar con phpmyadmin y que está instalado, aunque se puede hacer todo des de la línea de comando de mysql, así que al menos se necesita tener acceso a la línea de comandos del servidor, o alguna manera de gestionar y ejecutar programas de sql en la instalación de mysql donde vive el drupal.

La reparación de los enlaces tampoc fue demasiado difícil, solo un poco de trabajo duro (en mi caso 2 o 3 horas, depende de la velocidad de ejecución de los programas de sql en el sistema). Toda la información está en la tabla "webfm_file", aquí está el número # que aparece en el enlace webfm-send, y la ruta real al archivo dentro del sistema de archivos del servidor. Están guardados en los campos "fid" y "fpath" respectivamente.  Los enlaces webfm_send, no obstante, están por todos lados en diferentes tablas. Así que hice lo siguiente:

1) Ubiqué primero todas las table que tenían enlaces webfm_send: Esto lo hice yendo a phpmyadmin, y haciendo una búsqueda en todas las tablas con el texto siguiente: "%webfm_send%". En mi sitio las tablas y número de veces que aparece el enlace fueron:

 

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ón se tiene que ejecdtuar un programa en la pesteaña SQL de phpmyadmin. Primero se escoge una de las tablas afectadas. Se va a "Navegar" i se intenta saber en qué campos pueden aparecer los enlaces webfm_send. Generalmente son campos relacionados con el "cuerpo" y el "resumen" del elemento de la tabla afectada. En otras tablas puede aparecer en otros campos. quizás se quiere hacer otras búsquedas, aunque lo más sencillo es incluir todos los camps tipus texto o varchar, siempre que no sea evidente que los enlaces no pueden estar (un camp con el nombre "type" por ejemplo es muy poco factible que incluya un enlace). En todo caso si se incluye un campo sin enlace tampoco pasa nada. Por ejemplo en las  tablas field_data_body y field_revision_data_body, que son las que tienen la mayor parte de los enlaces rotos, los enlaces están en los campos "body_value" y "body_summary". Aquí está mi programa para la tabla 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//

El programa de explica por sí solo. Primero lee la pareja fid/fpath. Después crea un bucle (de una manera muy elegante que me sugirieron en Stackexchange, conseguí hacer lo mismo con un bucle "while"), para a continuación convertir fid y fpath en la forma que irá en la substitución real de los enlaces. Finalmente en la proposición UPDATE se hace la substitución. La búsqueda y substitución puede ser lenta, especialmente si hay mucho contenido, pero al final se completará.

3) Se tiene que correr lo ismo para todas la tablas afectadas, simplemente cambiando el nombre de la tabla para cada caso e incluyendo en la proposición UPDATE el campo o campos que puedan estar afectados en la tabla que se está tratando. Este program se podría convertir en una función o algo aís, pero ya tenía pereza.

4) Cuando se acaba se puede volver a hacer la búsqueda en la base de datos del texto "%webfm_send", puede ser que todavía salgan algunos enlaces rotos como me va pasar a mi porque ya estaban rotos en el sitio original (rotos ya en el módulo webfm), pero en mi caso acabé con aproximadamente 30 enlaces rotos y tenía más de 10.000 nodos.

Etiquetas: