Verwaltete Datei: Auf die im Feld verwendete Datei kann möglicherweise nicht verwiesen werden

39

Ich habe einige Probleme mit dem Typ managed_file . Wann immer ich versuche, ein Formular zu bearbeiten und zu speichern, das ein managed_file-Element enthält, tritt ein Fehler auf: Auf die im Picture-Feld verwendete Datei wird möglicherweise nicht verwiesen.

Dies ist der Code, den ich verwende:

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

  ...
}

Ich habe den Fehler auf die Funktion file_managed_file_validate in modules / file / file.module zurückgeführt , weiß aber nichts über die Dateireferenzen .

Bart
quelle

Antworten:

39

Die Lösung besteht darin, file_usage_add einen Aufruf hinzuzufügen, nachdem die Datei gespeichert wurde. Dieser Aufruf fügt einen Verweis auf die Datei in der Datenbank hinzu. Die Funktion file_managed_file_validate erkennt die Referenz und löst den Fehler nicht aus.

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

Dies ist in der Formular-API im Beispiel "managed_file" nicht dokumentiert .

Dieses Problem wird in der Drupal-Dokumentation unter dem folgenden Link behandelt

Bart
quelle
3
+1 Ich habe mir gerade die Haare darüber gerissen, und durch Hinzufügen eines Dateiverwendungsdatensatzes wird das Problem sofort behoben. Danke!
Clive
Zum Glück wurde es jetzt zum Beispiel managed_file hinzugefügt. Aber es war kein Beispiel, dem ich gefolgt war, also war diese Antwort ein Lebensretter!
Joshua Stewardson
@Clive Was ist mit dem Speichern von Dateien aus Vorlageneinstellungen ?! In dieser Funktion gibt es kein Modul, das als Parameter fungieren kann!
SaidbakR
1
@ sємsєм nur den Namen des Themas verwenden - die Zeichenfolge selbst nicht bestätigt ist, es braucht nur etwas einzigartig für die Sache zu sein , dass es Tracking ist - Modulnamen für Namensräume im ganzen Drupal verwendet werden , so dass die Konvention , dass Stucks
Clive
@Clive Könnten Sie bitte einen Blick auf diese Frage werfen
SaidbakR