2

我正在制作一个自定义“视频”字段,该字段应该接受多个文件(用于不同的视频格式)和一个标题。到目前为止,架构很好,但我无法让它上​​传和存储实际文件。

我的代码hook_field_widget_form如下所示(仅粘贴相关位):

$element['mp4'] = array(
  '#type' => 'file',
  '#title' => 'MP4 file',
  '#delta' => $delta,
);
$element['ogg'] = ... /* similar to the mp4 one */
$element['caption'] = array(
  '#type' => 'textfield',
  '#title' => 'Caption',
  '#delta' => $delta,
);

另外,在我的.install文件中:

function customvideofield_field_schema($field) {
  return array(
    'columns' => array(
      'mp4' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
      ),
      'ogg' => ... /* similar to mp4 */
      'caption' => array(
        'type' => 'varchar',
        'length' => 255,
      ),
    )
  );
}

我得到的错误是当我尝试存储数据时。我得到的表格没问题,数据库看起来很好(至少是 Drupal 生成的字段),但是当它尝试执行 INSERT 时,它失败了,因为它尝试进入这些整数字段的值是一个空字符串。

据我了解,它们必须是整数,对吗?(fids?)但我猜这些文件没有被上传,即使我确实得到了上传文件的正确界面。

Drupal 向您展示了它尝试执行的 INSERT 查询,这里发布的时间太长,但我可以在那里看到该caption字段的值(它只是一个文本字段)在查询中很好,所以这只是一个问题与文件字段。

4

2 回答 2

3

您可能想改用managed_file字段类型,它会为您处理上传文件并将其注册到managed_files表中。然后,您只需将提交功能添加到您的小部件表单并输入以下代码(来自上面链接的 FAPI 页面):

// Load the file via file.fid.
$file = file_load($form_state['values']['mp4']);

// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;

// Save.
file_save($file);

// Record that the module (in this example, user module) is using the file. 
file_usage_add($file, 'customvideofield', 'customvideofield', $file->fid);

希望有帮助

编辑

核心文件模块使用 处理实际提交hook_field_presave(),我最好的猜测是这段代码可以工作:

function customvideofield_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
  // Make sure that each file which will be saved with this object has a
  // permanent status, so that it will not be removed when temporary files are
  // cleaned up.
  foreach ($items as $item) {
    $file = file_load($item['mp4']);
    if (!$file->status) {
      $file->status = FILE_STATUS_PERMANENT;
      file_save($file);
    }
  }
}

假设您的字段的文件 ID 列是名为mp4.

记得在实现新钩子时清除 Drupal 的缓存,否则它不会被注册。

于 2012-01-04T10:06:23.367 回答
0

我还没有尝试在我的 Drupal 模块中上传文件,但是您能检查一下您的表单标签是否具有属性 enctype =“multipart/form-data”?

我希望 Drupal 应该自动包含它,但没有它,文件字段将无法工作,这似乎是您正在经历的。

詹姆士

于 2012-01-04T09:10:15.237 回答