Пользовательское поле в Drupal 7 с несколькими файловыми полями

Я делаю пользовательское поле "видео", которое должно принимать несколько файлов (для разных форматов видео) и подпись. Пока что схема в порядке, но я не могу загрузить и сохранить реальные файлы.

Мой код в 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 поле (которое является просто текстовым полем), хорошо в запросе, так что это только проблема с полями файла.

2 ответа

Решение

Вы, вероятно, хотите использовать 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);
    }
  }
}

Это предполагает, что столбец идентификатора файла для вашего поля называется mp4,

Не забудьте очистить кеш Drupal, когда вы реализуете новый хук, иначе он не будет зарегистрирован.

Я еще не пробовал загружать файлы в моих модулях Drupal, но можете ли вы проверить, имеет ли ваш тег формы атрибут enctype ="multipart/form-data"?

Я ожидаю, что Drupal должен включать это автоматически, но без него поля файла не будут работать, что, похоже, и есть то, что вы испытываете.

Джеймс

Другие вопросы по тегам