Керований файл: файл, використаний у полі, може не посилатися


39

У мене виникають деякі проблеми з типом Managed_file . Кожен раз, коли я намагаюся редагувати та зберігати форму, в якій є елемент керованого_файлу, виникає помилка: На файл, використаний у полі Зображення, може не посилатися.

Це код, який я використовую:

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

  ...
}

Я простежив помилку до функції file_managed_file_validate у модулях / file / file.module, але нічого не знаю про посилання на файл.

Відповіді:


40

Рішення полягає в тому, щоб додати виклик до file_usage_add після збереження файлу. Цей виклик додає посилання на файл у базі даних. Функція file_managed_file_validate помітить посилання і не призведе до помилки.

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

Це не задокументовано в API форми у прикладі керованого_файлу .

Це питання обговорюється з питань документації щодо Drupal: посилання


3
+1 Я просто розірвав моє волосся над цим, і додавання запису про використання файлу негайно вирішує проблему. Дякую!
Клайв

На щастя, це тепер додано до прикладу Managed_file. Але це було не в якому прикладі, якого я наслідував, тому ця відповідь була рятівницею!
Джошуа Стюардсон

@Clive Що стосується збереження файлів із налаштувань шаблону ?! Немає модуля, який би виконував функцію параметра в цій функції!
SaidbakR

1
@ sêsêm просто використовувати назву теми - сама рядок не підтверджена, вона просто повинна бути чимось унікальним для речі, яка її відстежує - ім'я модуля використовується для простору імен по всьому Drupal, так що ця умова, яка застрягла
Clive

@Clive Чи можете ви подивіться на це питання: drupal.stackexchange.com/questions/124373/…
SaidbakR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.