Hero

Agregar archivo a un campo tipo Archivo via código en Drupal 7

Diciembre 31, 2012

enzo

Hola amig@s.

En algunas ocasiones se requiere remplazar o adjuntar nuevos archivos a nodos que tengas un campo tipo Archivo, ya sea usando el control por defecto o bien una Imagen como se muestra a continuación.

Campo tipo archivo 1

Esto representa mayor problema si son pocas imágenes, ya que podemos utilizar la interfaz administrativa, pero si no enfrentamos aun proceso de migración o migración fallida el numero de imágenes puede ser considerable y el realizarlo de manera manual ya no es una opción.

Obviamente lo primero que se nos viene a la mente es hacerlo vía código, pero este proceso puede ser un poco difícil ya que los archivos primero deben ser una entidad File en Drupal antes poder asociarlos a un nodo.

En el Listado de código # 1 les mostrare un código de ejemplo que cumple con el objetivo.

<pre title="Listado de código # 1">$assets = array(1 => 'hotel.jpg',2 => 'villa.jpg',3 => 'casa.jpeg');
 
foreach ($assets as $nid => $asset) {
  $source = new stdClass();
  $source->uri = file_stream_wrapper_uri_normalize(DRUPAL_ROOT . '/' . 
    drupal_get_path('module', 'para_llevar_receta_2') . '/images/' . $asset);
  $source->filename = $asset;
  $source->name = pathinfo($source->filename, PATHINFO_FILENAME);
 
  $dest = '../assets/' . $asset;
  $file = file_copy($source, $dest);
  $property = node_load($nid);
 
  $property->field_imagen[LANGUAGE_NONE][0] = array(
    'fid' => $file->fid,
    'display' => 1,
    'description' => '',
    'uid' => $property->uid,
    'filename' => $file->filename,
    'uri' => $file->uri,
    'filemime' => $file->filemime,
    'filesize' => $file->filesize,
    'status' => $file->status,
    'timestamp' => $file->timestamp,
  );
 
  // Save new node.
  node_save($property);
}

Ahora déjenme explicar un poco la lógica.

Primero creamos un vector de valores donde la llave es el identificador del nodo que vamos a actualizar y el valor es el nombre del archivo que se desea adjuntar al nodo*.*

Se crea un ciclo para procesar cada imagen, lo primero que se debe hacer es definir un objeto para la imagen original, con las propiedades que Drupal espera de un archivo, en el código indicamos cual es la ruta de las imágenes, las cuales se asume que están dentro del folder de un modulo de migración llamado migrate_module.

Posteriormente se define el destino usando el identificador ../assets/ el cual drupal traducirá al valor apropiado definido como la carpeta publica definida en la página /admin/config/media/file-system.

Para simplificar las cosas hacemos uso de la función de Drupal file_copy, esta función copia el archivo al destino y realiza las operación para la creación de un registro tipo File dentro de Drupal y retorna un objeto File que puede ser usado para referenciarlo en cualquier entidad de Drupal.

Asumiento que tenemos un tipo de contenido llamado Property y dentro de este existe un campo de tipo Imagen, se procede a vincularlo como la primera imagen.

El ultimo paso es usar la función node_save, para guardar todas las referencias en el nodo para que la imagen quede vinculada al nodo de forma permanente.

Hasta pronto.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.