#drupal #file-upload #drupal-7 #form-api
#drupal #загрузка файлов #drupal-7 #форма-api
Вопрос:
У меня есть форма загрузки файла
как я могу сохранить этот файл при наличии других ошибок проверки, чтобы пользователю не приходилось загружать файл снова?
Я попробовал это в своей функции проверки, но она не работает:
function mymodule_someform_validate($form, amp;$form_state) {
$form_state["values"]["some_field"] = some_value;
}
переменная $form_state[«значения»] недоступна в моей функции определения формы — mymodule_someform($form, amp; $form_state)
Есть идеи?
Ответ №1:
Просто используйте managed_file
тип, он сделает это за вас:
$form['my_file_field'] = array(
'#type' => 'managed_file',
'#title' => 'File',
'#upload_location' => 'public://my-folder/'
);
А затем в вашем обработчике отправки:
// Load the file via file.fid.
$file = file_load($form_state['values']['my_file_field']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);
Если проверка завершится неудачно и пользователь покинет форму, файл будет автоматически удален через несколько часов (как и все файлы в file_managed
таблице без FILE_STATUS_PERMANENT
). Если проверка не завершится неудачей, будет запущен обработчик отправки, и файл будет помечен как постоянный в системе.
Комментарии:
1. да, я, вероятно, просто использую форму узла по умолчанию. Я хотел создать пользовательскую форму, потому что я не хотел использовать форму узла с загрузкой файла ajax. но я до сих пор не знаю, почему form_state, переданный функции определения формы, не имеет настроенных «значений»…
Ответ №2:
Пример формы администратора для других, которые могут искать:
function example_admin_form(){
$form = array();
$form['image'] = array(
'#type' => 'managed_file',
'#name' => 'image',
'#title' => t('upload your image here!'),
'#default_value' => variable_get('image', ''),
'#description' => t("Here you can upload an image"),
'#progress_indicator' => 'bar',
'#upload_location' => 'public://my_images/'
);
// Add your submit function to the #submit array
$form['#submit'][] = 'example_admin_form_submit';
return system_settings_form($form);
}
function example_admin_form_submit($form, amp;$form_state){
// Load the file
$file = file_load($form_state['values']['image']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);
}