Пользовательское поле в 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, он терпит неудачу, потому что значение, которое он пытается получить в эти целочисленные поля, является пустой строкой.
Из того, что я понимаю, они должны быть целыми числами, верно? (fid
s?) Но я предполагаю, что файлы не загружаются, хотя я получаю правильный интерфейс для загрузки файлов.
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 должен включать это автоматически, но без него поля файла не будут работать, что, похоже, и есть то, что вы испытываете.
Джеймс