xandeadx.ru Блог музицирующего веб-девелопера

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('Картинка загружена');
}

Об удалении файла надо заботиться самостоятельно.

Документация.
Модуль для загрузки картинок и отображения их превьюшек.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Спасибо за пример!
Скажите как загрузить несколько файлов? т.е. при выборе одного файла появлялось форма для загрузки еще одного и т.д.

Спасибо за пример!
Не совсем понял для чего нужна функция mymodule_myform_submit? Файл и без нее загружается на сервер или файл при такой загрузке в друпале имеет состояние "временного" и ему нужно присвоить статус "постоянного".

А можно в этом виджете указать диалоговому окну маску разрешенных расширения для открытия или такое не предусмотрено?

Если файл уже был когда-то загружен, как передать виджету что файл уже есть и надо просто вывести имя файла и кнопку Remove (т.е. привести к состоянию как на 2-м скриншоте)?

заполнить #default_value

Павел, FILE_STATUS_PERMANENT вам ни о чем не говорит?

А не подскажите как сделать, если мне необходимо загрузить больше одного изображения?

создайте больше одного элемента формы ;)

нее, мне необходима что-то вроде массовой загрузки файлов. Например если мне нужно загрузить 100 изображений - эт не вариант делать 100 элементов форм.

из коробки способов нет

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании