ไฟล์ที่มีการจัดการ: ไฟล์ที่ใช้ในฟิลด์อาจไม่สามารถอ้างอิงได้


39

ฉันมีปัญหากับประเภทmanaged_file เมื่อใดก็ตามที่ฉันพยายามแก้ไขและบันทึกฟอร์มที่มีองค์ประกอบ 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ในmodules / file / file.moduleแต่ไม่ทราบอะไรเกี่ยวกับการอ้างอิงไฟล์

คำตอบ:


39

วิธีแก้ไขคือเพิ่มการเรียกไปยังfile_usage_addหลังจากบันทึกไฟล์ การเรียกนี้เพิ่มการอ้างอิงไปยังไฟล์ในฐานข้อมูล file_managed_file_validateฟังก์ชั่นจะจุดอ้างอิงและจะไม่เรียกข้อผิดพลาด

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

นี้ไม่ได้มีการบันทึกไว้ในแบบฟอร์ม API ภายใต้ตัวอย่าง

ปัญหานี้กำลังถูกกล่าวถึงในปัญหาเอกสารประกอบของ Drupal: ลิงก์


3
+1 เพิ่งทำผมของฉันฉีกขาดเพิ่มบันทึกการใช้ไฟล์แก้ปัญหาได้ทันที ขอขอบคุณ!
Clive

โชคดีที่มันถูกเพิ่มเข้าไปในตัวอย่าง managed_file แต่มันก็ไม่ได้เป็นตัวอย่างอะไรเลยที่ฉันทำตามดังนั้นคำตอบนี้เป็นผู้ช่วยชีวิต!
Joshua Stewardson

@Clive การบันทึกไฟล์จากการตั้งค่าเทมเพลตคืออะไร! ไม่มีโมดูลที่จะทำหน้าที่เป็นพารามิเตอร์ในฟังก์ชั่นนั้น!
SaidbakR

1
@ sємsємเพียงแค่ใช้ชื่อของชุดรูปแบบ - สตริงตัวเองไม่ได้รับการตรวจสอบก็แค่ต้องเป็นสิ่งที่ไม่ซ้ำกันกับสิ่งที่ติดตามมัน - ชื่อโมดูลที่ใช้สำหรับการกำหนดชื่อทั่ว Drupal เพื่อให้เป็นแบบแผนที่ติดอยู่
Clive

@Clive คุณช่วยโปรดดูคำถามนี้ได้ที่: drupal.stackexchange.com/questions/124373/…
SaidbakR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.