drupal 7使用managed_file在form_state中预先输入数据

时间:2013-04-26 07:52:46

标签: forms file-upload drupal-7

我使用的是D7托管文件。

如果我的表单错误比表单丢失文件信息,我知道有一个错误,必须重新上传文件。

但是在表单验证器中我将文件保存在db中,所以我有文件的FId(来自file_load)

如果我可以在表单状态中预先设置值,我可以在表单提交中从db加载文件并使其保持不变。

形式:

$form['fileUpload'] = array(
        '#id'                => 'fileUploadId',
        //'#type'  => 'file',
        '#title' => t('upload a file: '),
        '#size'              => 22,
        '#type'              => 'managed_file',
        '#description'       => t('upload file: docx doc pdf'),
        '#upload_location' => 'public://',
        '#upload_validators' => array(
            'file_validate_extensions' => array('docx doc pdf'),
            // Pass the maximum file size in bytes
            'file_validate_size' => array(4*1024*1024),
        ),            
      ); 

我试过了:

  1. 我在表单验证器,提交和表单中通过引用传递& $ form_state

    $ form_state ['values'] ['FileInfo'] = $ form_state ['values'] ['fileUpload'];

  2. 如果有形式错误,form_state会丢失此值

    1. 我在表单验证器,提交和表单中通过引用传递& $ form_state

      $ file = file_load($ form_state ['values'] ['fileUpload']);

      $ form_state ['values'] ['FileInfo'] = $ form-> fid;

    2. 持久化form_state数据的
    3. form_set_value($ element,$ value,& $ form_state)

    4. 但使用它有点棘手。

1 个答案:

答案 0 :(得分:1)

我找到了答案。

  1. 我在表单中创建一个隐藏字段:

            $form['infoFile'] = array('#type' => 'hidden', '#value' => '');
    
  2. 表单验证器中的
  3.         $file = file_load($form_state['values']['candidateCvUpload']);
            $form['infoFile']['#parents'] = array('infoFile');
            form_set_value($form['infoFile'], $file->fid, $form_state);
    
  4. 提交

            $file->status   = FILE_STATUS_PERMANENT;
            $file = file_save($file);