Archivo administrado: el archivo utilizado en el campo no puede ser referenciado

39

Tengo algunos problemas con el tipo managed_file . Cada vez que intento editar y guardar un formulario que tiene un elemento de archivo_administrado, se produce un error: el archivo utilizado en el campo Imagen puede no estar referenciado.

Este es el código que estoy usando:

function foo_form ($form, &$form_state, $foo) {  
  ...     
  $form['file'] = array(
    '#type' => 'managed_file',
    '#title' => t('Picture'),
    '#default_value' => (isset($foo->file->fid) ? $banner->foo->fid : ''),
    '#upload_location' => variable_get('foo_upload_location'),
  );

  if (isset($foo->file)) {
    $form['current_file'] = array(
      '#type' => 'hidden',
      '#value' => $foo->file->fid,
    );
  }
  ...
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
 }

function foo_form_submit ($form, &$form_state) {
  $foo = (object)$form_state['values'];

  $current_file_set = isset($form_state['values']['current_file']);

  if ($form_state['values']['file'] != 0 && !$current_file_set) {
    // Load the file uploaded in the form.
    $file = file_load($form_state['values']['file']);

    $file->status = FILE_STATUS_PERMANENT;

    file_save($file);

    $foo->file = $file->fid;
  } else if ($form_state['values']['file'] != 0 && $current_file_set) {

    // If we are uploading a different picture, delete the old one and save the
    // new one. If not, don't do anything.
    if ($form_state['values']['current_file'] != $form_state['values']['file']) {
      file_delete(file_load($form_state['values']['current_file']));
      // Load the file uploaded in the form.
      $file = file_load($form_state['values']['file']);

      $file->status = FILE_STATUS_PERMANENT;

      file_save($file);

      $foo->file = $file->fid;
    }
  } else {
    file_delete(file_load($form_state['values']['current_file']));
    $foo->file = null;
  }

  ...
}

Rastreé el error hasta la función file_managed_file_validate en modules / file / file.module pero no sé nada sobre las referencias de archivo.

Bart
fuente

Respuestas:

40

La solución es agregar una llamada a file_usage_add después de guardar el archivo. Esta llamada agrega una referencia al archivo en la base de datos. La función file_managed_file_validate detectará la referencia y no activará el error.

file_usage_add($file, 'foo', 'foo', $foo->id);

Esto no está documentado en la API de formulario en el ejemplo de archivo_gestionado .

Este problema se está discutiendo en los problemas de documentación de Drupal: enlace

Bart
fuente
3
+1 Solo me he roto el pelo por esto, agregar un registro de uso de archivos resuelve el problema de inmediato. ¡Gracias!
Clive
Afortunadamente, ahora se agrega al ejemplo managed_file. Pero no fue en el ejemplo que había seguido, ¡así que esta respuesta fue un salvavidas!
Joshua Stewardson
@Clive ¿Qué es guardar archivos desde la configuración de la plantilla? ¡No hay ningún módulo que actúe como parámetro en esa función!
SaidbakR
1
@ sємsєм solo usa el nombre del tema: la cadena en sí no está validada, solo debe ser algo único para lo que lo rastrea: el nombre del módulo se usa para el espacio de nombres en todo Drupal, así que esa es la convención que se quedó
Clive
@Clive ¿Podrían echar un vistazo a esta pregunta: drupal.stackexchange.com/questions/124373/…
SaidbakR