Drupal field file, image: Como cambiar de directorio los archivos ya subidos

  • 12 Abr 2014
  • Drupal 7

Que tenemos?

Imaginemos un tipo de contenido llamado "book" que tiene un campo llamado "image" que guarda sus archivos en la carpeta "". Un día X queremos cambiar esta ubicación a "book/image/". Los archivos de los contenidos que se crearán en futuro se guardarán en book/image/ (siempre dentro el correspondiente directorio del "site/...") pero los artículos ya creados, mantienen su ubicación original.

Cómo mover los archivos de los contenidos ya creados?

Es necesario realizar dos operaciones. La primera, mover los archivos "físicamente" y la segunda, modificar la dirección en la base de datos de Drupal. Dependiendo de la instalación de Drupal, es probable que sea necesario trabajar en más tablas de las que nombro en este artículo.

1. Mover los archivos

Esto es fácil. Los que están en sites/dominio/files/* van a sites/dominio/files/book/image/*

2. Modificar el campo "uri" (Uniform resource identifier) en las tablas de la base de datos de Drupal

Esto es menos fácil. Tenemos que actualizar la ubicación de cada imagen. Y de los campos donde esté.. por ejemplo: body. Pero antes, hay que modificar la tabla donde se "guarda" cada imagen: file_managed

Tabla: file_managed. Campo: uri

UPDATE file_managed file, 
(
  SELECT 
    file.fid as fid2, file.uri as uri, INSERT(file.uri, 10, 0, "book/image/") as uri2
  FROM 
    field_data_field_image AS field LEFT JOIN  file_managed AS file ON file.fid = field.field_image_fid  
  WHERE
    field.bundle = 'book' AND file.uri NOT LIKE 'public://book/image/%'
) AS file2
SET 
  file.uri = file2.uri2 
WHERE 
  file.fid = file2.fid2;

Tabla: field_revision_body. Campo: body_value

UPDATE field_revision_body field,  
(
  SELECT 
    revision_id AS id2, body_value as value1, REPLACE(body_value, "public://FreePBX", "public://book/image/FreePBX") AS value2
  FROM 
    field_revision_body as field 
  WHERE  
    field.bundle = 'book' AND body_value LIKE '%public://FreePBX%'
) AS field2
SET 
  field.body_value = field2.value2 
WHERE 
  field.revision_id = field2.id2;

Y lo mismo habría que hacer para la tabla field_data_body