Fichier géré: le fichier utilisé dans le champ ne peut pas être référencé

39

J'ai des problèmes avec le type managed_file . Une erreur se produit chaque fois que j'essaie de modifier et d'enregistrer un formulaire contenant un élément managed_file: le fichier utilisé dans le champ Image peut ne pas être référencé.

C'est le code que j'utilise:

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;
  }

  ...
}

Je traçais le dos d'erreur à la file_managed_file_validate fonction dans les modules / fichier / file.module mais ne sais pas quoi que ce soit sur les références de fichier.

Bart
la source

Réponses:

40

La solution consiste à ajouter un appel à file_usage_add après l'enregistrement du fichier. Cet appel ajoute une référence au fichier dans la base de données. La fonction file_managed_file_validate repérera la référence et ne déclenchera pas l'erreur.

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

Cela n'est pas documenté dans l' API de formulaire sous l'exemple de fichier géré .

Ce problème est en cours de discussion sur les problèmes de documentation Drupal: lien

Bart
la source
3
+1 Je viens de me déchirer les cheveux, l'ajout d'un enregistrement d'utilisation de fichier résout le problème immédiatement. Merci!
Clive
Heureusement, il est maintenant ajouté à l'exemple managed_file. Mais ce n'était pas dans l'exemple que j'avais suivi alors cette réponse a été une bouée de sauvetage!
Joshua Stewardson
@Clive Qu'en est-il de la sauvegarde des fichiers à partir des paramètres du modèle?! Il n'y a pas de module pour agir en paramètre dans cette fonction!
SaidbakR
1
@ sємsєм utilisez simplement le nom du thème - la chaîne elle-même n'est pas validée, elle doit être unique en son genre - le nom du module est utilisé pour le suivi des noms dans Drupal, c'est donc la convention qui reste en place
Clive
@Clive Pourriez-vous s'il vous plaît jeter un oeil à cette question: drupal.stackexchange.com/questions/124373/…
SaidbakR