Пользовательское поле в Drupal 7 с несколькими файловыми полями - PullRequest
2 голосов
/ 04 января 2012

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

Мой код в 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, он терпит неудачу, потому что значение, которое он пытается получить в эти целочисленные поля, является пустой строкой.

Из того, что я понимаю, они должны быть целыми числами, верно?(fid s?) Но я предполагаю, что файлы не загружаются, хотя я получаю правильный интерфейс для загрузки файлов.

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

Ответы [ 2 ]

3 голосов
/ 04 января 2012

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

Надеюсь, что поможет

EDIT

Основной модуль файла обрабатывает фактическую отправку для этого, используя 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 при внедрении нового хука, иначе он не будет зарегистрирован.

0 голосов
/ 04 января 2012

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

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

Джеймс

...