Drupal → Использование виджета AJAX загрузки файлов в своих формах
Я как-то упустил из виду, что помимо стандартного способа загрузки файлов в своих формах можно использовать AJAX виджет поля File:
Пример использования:
/** * Form builder. */ function mymodule_myform($form) { $form['file'] = array( '#type' => 'managed_file', '#title' => 'Картинка', '#description' => 'Выберите файл с расширением jpg, jpeg, png или gif', '#upload_location' => 'public://', '#upload_validators' => array( 'file_validate_is_image' => array(), 'file_validate_extensions' => array('png gif jpg jpeg'), 'file_validate_size' => array(1 * 1024 * 1024), ), '#default_value' => variable_get('mymodule_myfilefid'), ); $form['submit'] = array( '#type' => 'submit', '#value' => 'Отправить', ); return $form; } /** * Form submit callback. */ function mymodule_myform_submit($form, &$form_state) { // Delete old file $old_file_fid = variable_get('mymodule_myfilefid'); if ($old_file_fid && $old_file_fid != $form_state['values']['file']) { $old_file = file_load($old_file_fid); file_usage_delete($old_file, 'mymodule'); file_delete($old_file); } // Save new file $file = file_load($form_state['values']['file']); $file->status = FILE_STATUS_PERMANENT; file_save($file); file_usage_add($file, 'mymodule', 'mymodule', 0); variable_set('mymodule_myfilefid', $file->fid); drupal_set_message('Картинка загружена'); }
Об удалении файла надо заботиться самостоятельно.
Документация.
Модуль для загрузки картинок и отображения их превьюшек.
Комментарии
Спасибо за пример!
Скажите как загрузить несколько файлов? т.е. при выборе одного файла появлялось форма для загрузки еще одного и т.д.
Спасибо за пример!
Не совсем понял для чего нужна функция mymodule_myform_submit? Файл и без нее загружается на сервер или файл при такой загрузке в друпале имеет состояние "временного" и ему нужно присвоить статус "постоянного".
А можно в этом виджете указать диалоговому окну маску разрешенных расширения для открытия или такое не предусмотрено?
Если файл уже был когда-то загружен, как передать виджету что файл уже есть и надо просто вывести имя файла и кнопку Remove (т.е. привести к состоянию как на 2-м скриншоте)?
заполнить
#default_value
Павел, FILE_STATUS_PERMANENT вам ни о чем не говорит?
А не подскажите как сделать, если мне необходимо загрузить больше одного изображения?
создайте больше одного элемента формы ;)
нее, мне необходима что-то вроде массовой загрузки файлов. Например если мне нужно загрузить 100 изображений - эт не вариант делать 100 элементов форм.
из коробки способов нет
http://drupal.stackexchange.com/questions/90637/does-multiupload-filefie...
Хотел написать на этой странице http://xandeadx.ru/blog/drupal/4, но там 6 ветка. Решил тут, хоть немного не в тему.
Может кто-то сталкивался с модулем AJAX Comments для семерки и добавлял к комментарию дополнительное поле типа file?
Добавил поле с возможностью добавления одного файла. После нажатия на кнопку ответить и после загрузки формы комментария, пытаюсь загрузить файл, Выскакивает ошибка и события не срабатывают. Начал разбираться и нашел причину - отсутствие уникального враппера для виджета, везде один id="edit-field-comment-image-und-0-ajax-wrapper" во всех раскрытых формах.
И выходит, что при аплоаде файла и отработки $commands[] = ajax_command_replace(NULL, $output, $settings); в функции file_ajax_upload(), данные вставляются во все формы.
Решил вопрос загрузки таким способом.
function MODULE_NAME_menu_alter(&$items) {
$items['file/ajax']['page callback'] = 'MODULE_NAME_file_ajax_upload_custom';
}
Т.е. переопределил callback и скопировал содержимое file_ajax_upload в свою функцию.
И немного изменил ретерн:
И все заработало! НО!!! Еще же есть кнопка удалить? И с ней та же проблема вышла. Только как ее оформить в враппер, не понял.
Буду благодарен за любой совет. Может я сильно "заморачиваюсь" и уже есть решение этой проблемы?
Насколько правильно, не знаю. Убрал решение выше.
В hook_form_alter:
Оставить комментарий