Pull to refresh

Загрузка файлов через Form API

Reading time 5 min
Views 10K

Т.к. этот процесс у меня получился не сразу, то я решил описать его, авось кому пригодится и поможет.

Чтобы было интереснее, опишу на создании модуля для random'ного отображения картинок.

Задача
Задачей является именно реализация возможности закачивать файлы в Drupal через Form API. А описанный ниже пример, является лишь примером этой реализации.

Функционал
У нас будет админка, где можно будет добавлять, либо удалять картинки. А также будет функция, которая будет возвращать случайно выбранную картинку из админки. Все очень просто:)

Реализация
Для начала необходимо создать страницу в админке, с нашими настройками.
Copy Source | Copy HTML
  1. /**<br/> * Implementation of hook_menu().<br/> */
  2. function ivt_header_menu() {
  3.   $items['admin/settings/ivt_header_settings'] = array(
  4.     'title' => t('IVT Header Settings'),
  5.     'page callback' => 'drupal_get_form',
  6.     'page arguments' => array('_ivt_header_settings_form'),
  7.     'access arguments' => array('access administration pages'),
  8.     'type' => MENU_NORMAL_ITEM,
  9.   );
  10.  
  11.   return $items;
  12. }

Опишем саму форму со списком загруженных файлов для удаления, полем для загрузки файла, и кнопкой.
Copy Source | Copy HTML
  1. function _ivt_header_settings_form(){
  2.   $form['#attributes']['enctype'] = 'multipart/form-data';
  3.  
  4.   $form['header_images_del'] = array(
  5.     '#type' => 'checkboxes',
  6.     '#title' => t('Delete images'),
  7.     '#options' => variable_get('ivt_header_images', array()),
  8.   );
  9.  
  10.   $form['header_images_upload'] = array(
  11.     '#type' => 'file',
  12.     '#title' => t('Attach new image'),
  13.   );
  14.  
  15.   $form['submit'] = array(
  16.     '#type' => 'submit',
  17.     '#value' => t('Go!')
  18.   );
  19.  
  20.   return $form;
  21. }

Выглядеть будет вот так:


Напишем валидатор для этой формы, в котором будем производить загрузку картинки на сайт.
Copy Source | Copy HTML
  1. function _ivt_header_settings_form_validate($form, &$form_state){
  2.   if (isset($form['header_images_upload'])) {
  3.     //валидация на расширение файла
  4.     $validators = array('file_validate_extensions' => array('png'));
  5.  
  6.     //папка, куда будет загружаться файл
  7.     $dir = file_directory_path() . '/headers';
  8.  
  9.     //проверяем существует ли директория. если ее нету, то она создастся
  10.     if(file_check_directory($dir, 1)) {
  11.       //загружаем файл
  12.       $file = file_save_upload('header_images_upload', $validators, $dir);
  13.  
  14.       //добавляем в $form_state новое поле с файлом
  15.       if ($file) $form_state['values']['header_image_file'] = $file;
  16.     }
  17.   }
  18. }

В сабмите будем удалять выбранные файлы и добавлять новые.
Copy Source | Copy HTML
  1. function _ivt_header_settings_form_submit($form, &$form_state){
  2.   $image_file = $form_state['values']['header_image_file'];
  3.   $images_del = $form_state['values']['header_images_del'];
  4.   $images_del = array_filter($images_del);
  5.  
  6.   //получаем список уже загруженых файлов
  7.   $header_images = variable_get('ivt_header_images', array());
  8.  
  9.   //если при сабмите был выбран файл для загрузки
  10.   if ($image_file) {
  11.     //добавляем его в наш список
  12.     $header_images[$image_file->fid] = l($image_file->filename, $image_file->filepath);
  13.     drupal_set_message(t('Image %filename has been uploaded!', array('%filename' => $image_file->filename)));
  14.   }
  15.  
  16.   //если при сабмите были отмечены файлы для удаления
  17.   if ($images_del){
  18.     //пробегаемся по всем файлам
  19.     foreach ($images_del as $fid){
  20.       //загружаем файл из базы данных
  21.       $sql_file = db_fetch_object(db_query("SELECT filepath, filename FROM files WHERE fid = '%s'", $fid));
  22.  
  23.       //удаляем файл из базы данных
  24.       db_query('DELETE FROM {files} WHERE fid = %d', $fid);
  25.       //удаляем файл
  26.       file_delete($sql_file->filepath);
  27.  
  28.       //удаляем файл из нашего списка
  29.       unset($header_images[$fid]);
  30.       drupal_set_message(t('Image %filename has been removed!', array('%filename' => $sql_file->filename)));
  31.     }
  32.   }
  33.   //сохраняем наш список
  34.   variable_set('ivt_header_images', $header_images);
  35. }

Осталось только написать функцию, которая брала бы из нашего списка произвольную картинку, и возвращала бы ее.
Copy Source | Copy HTML
  1. function ivt_header_get_image($fid = null){
  2.   global $base_url;
  3.   //если аргумента нету, то берем произвольно
  4.   if (!$fid){
  5.     //загружаем список
  6.     $header_images = variable_get('ivt_header_images', array());
  7.     //берем случайную
  8.     $fid = array_rand($header_images);
  9.   }
  10.  
  11.   //получаем путь до картинки
  12.   $sql_file = db_fetch_object(db_query("SELECT filepath FROM files WHERE fid = '%s'", $fid));
  13.   $filepath = $sql_file->filepath;
  14.  
  15.   $image_html = "<img src='". $base_url .'/'. $filepath ."'/>";
  16.  
  17.   //возвращаем картинку
  18.   return $header_images ? $image_html : '';
  19. }

Вот и все.
Tags:
Hubs:
+25
Comments 15
Comments Comments 15

Articles