File gestito: il file utilizzato nel campo potrebbe non essere referenziato


39

Sto riscontrando alcuni problemi con il tipo managed_file . Ogni volta che provo a modificare e salvare un modulo che contiene un elemento managed_file, si verifica un errore: il file utilizzato nel campo Immagine potrebbe non essere referenziato.

Questo è il codice che sto 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;
  }

  ...
}

Ho ricondotto l'errore alla funzione file_managed_file_validate in moduli / file / file.module ma non so nulla dei riferimenti ai file.

Risposte:


40

La soluzione è aggiungere una chiamata a file_usage_add dopo aver salvato il file. Questa chiamata aggiunge un riferimento al file nel database. La funzione file_managed_file_validate individuerà il riferimento e non attiverà l'errore.

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

Questo non è documentato nell'API del modulo nell'esempio managed_file .

Questo problema è in discussione sui problemi relativi alla documentazione di Drupal: link


3
+1 Mi sono appena strappato i capelli per questo, l'aggiunta di un record di utilizzo dei file risolve immediatamente il problema. Grazie!
Clive

Per fortuna ora viene aggiunto all'esempio managed_file. Ma non è stato nell'esempio che avevo seguito, quindi questa risposta è stata un vero toccasana!
Joshua Stewardson,

@Clive Cosa significa salvare i file dalle impostazioni del modello ?! Non esiste un modulo che funga da parametro in quella funzione!
SaidbakR,

1
@ sємsєм usa solo il nome del tema - la stringa stessa non è convalidata, deve solo essere qualcosa di unico per la cosa che lo sta monitorando - il nome del modulo viene usato per lo spazio dei nomi su Drupal, quindi questa è la convenzione che si è bloccata
Clive

@Clive Potresti dare un'occhiata a questa domanda: drupal.stackexchange.com/questions/124373/…
SaidbakR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.