관리되는 파일 : 필드에 사용 된 파일이 참조되지 않을 수 있습니다


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의 함수 모듈 / 파일 / file.module을 하지만, 파일 참조에 대해 아무것도 몰라.

답변:


39

해결책은 파일이 저장된 후 file_usage_add 에 대한 호출을 추가하는 것 입니다. 이 호출은 데이터베이스의 파일에 대한 참조를 추가합니다. file_managed_file_validate의 기능은 참조를 발견하고 오류를 트리거하지 않습니다.

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

이것은 managed_file 예제 아래 Form API에 설명되어 있지 않습니다 .

이 문제는 Drupal 설명서 문제에 대해 논의 중입니다. 링크


3
+1 방금 머리 위로 머리를 찢고 파일 사용 레코드를 추가하면 문제가 즉시 해결됩니다. 감사합니다!
Clive

고맙게도 이제 managed_file 예제에 추가되었습니다. 그러나 그것은 내가 따르는 어떤 예도 아니 었 으므로이 답변은 생명의 은인이었습니다!
Joshua Stewardson

@Clive 템플릿 설정에서 파일을 저장하는 방법은 무엇입니까?! 해당 기능에서 파라미터로 작동 할 모듈이 없습니다!
SaidbakR

1
@ sємsєм는 단지 테마의 이름을 사용합니다-문자열 자체는 검증되지 않고 추적하는 것에 고유 한 것만 필요합니다-모듈 이름은 Drupal 전역의 네임 스페이스에 사용되므로 붙어있는 규칙입니다
Clive

@Clive이 질문을 좀 봐주세요
SaidbakR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.