Tệp được quản lý: tệp được sử dụng trong trường có thể không được tham chiếu


39

Tôi đang gặp một số vấn đề với loại Managed_file . Bất cứ khi nào tôi cố gắng chỉnh sửa và lưu một biểu mẫu có phần tử Managed_file thì sẽ xảy ra lỗi: Tệp được sử dụng trong trường Ảnh có thể không được tham chiếu.

Đây là mã tôi đang sử dụng:

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

  ...
}

Tôi đã truy tìm lỗi trở lại hàm file_managed_file_validate trong các mô-đun / file / file.module nhưng không biết gì về các tham chiếu tệp.

Câu trả lời:


40

Giải pháp là thêm một cuộc gọi đến file_usage_add sau khi tệp được lưu. Cuộc gọi này thêm một tham chiếu đến tệp trong cơ sở dữ liệu. Hàm file_managed_file_validate sẽ phát hiện tham chiếu và sẽ không gây ra lỗi.

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

Điều này không được ghi lại trong API biểu mẫu trong ví dụ Managed_file .

Vấn đề này đang được thảo luận về các vấn đề tài liệu Drupal: liên kết


3
+1 Chỉ cần xé tóc của tôi về điều này, thêm một bản ghi sử dụng tệp sẽ giải quyết vấn đề ngay lập tức. Cảm ơn bạn!
Clive

Rất may, bây giờ nó đã được thêm vào ví dụ Managed_file. Nhưng đó không phải là bất cứ ví dụ nào tôi đã làm theo vì vậy câu trả lời này là cứu cánh!
Joshua Stewardson

@Clive Điều gì về việc lưu tệp từ cài đặt mẫu?! Không có mô-đun để hoạt động như tham số trong chức năng đó!
SaidbakR

1
@ sємsєм chỉ sử dụng tên của chủ đề - chuỗi bản thân không được xác nhận, nó chỉ cần có một cái gì đó độc đáo để điều đó là theo dõi nó - tên mô-đun được sử dụng cho namespacing khắp nơi trên Drupal vì vậy đó là quy ước mà bị mắc kẹt
Clive

@Clive bạn có thể hài lòng có được một cái nhìn tại câu hỏi này: drupal.stackexchange.com/questions/124373/...
SaidbakR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.