托管文件:可能不会引用该字段中使用的文件


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

  ...
}

我将错误追溯到modules / file / file.module中file_managed_file_validate函数,但对文件引用一无所知。

Answers:


39

解决方法是在文件保存后添加对file_usage_add的调用。该调用将对数据库中的文件添加引用。该file_managed_file_validate功能将当场参考,并不会引发错误。

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

在Form_API实例下的Form API中未对此进行说明

正在就Drupal文档问题讨论此问题:链接


3
+1刚刚为此而努力,添加文件使用记录可立即解决问题。谢谢!
克莱夫(Clive)

幸运的是,现在它已添加到managed_file示例中。但这不是我要遵循的任何示例,因此此答案是救生员!
约书亚·史蒂文斯

@Clive从模板设置保存文件怎么办?该功能中没有模块可作为参数!
SaidbakR 2014年

1
@sємsєм仅使用主题名称-字符串本身未经验证,只需要与正在跟踪它的东西唯一-模块名称用于在Drupal各处进行命名间隔,因此这是约定俗成的
Clive

@Clive请你让一下这个问题:drupal.stackexchange.com/questions/124373/...
SaidbakR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.