Pregunta

I'm making a custom "video" field that is supposed to accept several files (for different video formats) and a caption. So far the schema is fine, but I can't get it to upload and store the actual files.

My code in hook_field_widget_form looks like this (only pasting relevant bits):

$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,
);

Also, in my .install file:

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

And the error I'm getting is when I try to store data. I get the form ok, and the database looks fine (the fields Drupal generates at least), but when it tries to do an INSERT, it fails because the value it tries to get into those integer fields is an empty string.

From what I understand, they have to be integers, right? (fids?) But I'm guessing the files are not being uploaded, even though I do get the right interface for uploading files.

Drupal shows you the INSERT query it tries to do, which is too long to post here, but I can see there that the value for the caption field (which is just a text field), is fine in the query, so it's only a problem with the file fields.

¿Fue útil?

Solución

You probably want to use the managed_file field type instead, it handles uploading the file and registering it in the managed_files table for you. Then you would just add a submit function to your widget form and put the following code (from the FAPI page linked to above):

// 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);

Hope that helps

EDIT

The core file module handles the actual submission for this using hook_field_presave(), my best guess is that this code would work:

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

That assumes the file ID column for your field is the one called mp4.

Remember to clear Drupal's caches when you implement the new hook or it won't be registered.

Otros consejos

I haven't tried file uploading in my Drupal modules yet, but can you check does your form tag have the attribute enctype ="multipart/form-data"?

I would expect Drupal ought to include this automatically, but without it the file fields won't work, which seems to be what you're experiencing.

James

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top