Т.к. этот процесс у меня получился не сразу, то я решил описать его, авось кому пригодится и поможет.
Чтобы было интереснее, опишу на создании модуля для random'ного отображения картинок.
Задача
Задачей является именно реализация возможности закачивать файлы в Drupal через Form API. А описанный ниже пример, является лишь примером этой реализации.Функционал
У нас будет админка, где можно будет добавлять, либо удалять картинки. А также будет функция, которая будет возвращать случайно выбранную картинку из админки. Все очень просто:)Реализация
Для начала необходимо создать страницу в админке, с нашими настройками.Copy Source | Copy HTML
- /**<br/> * Implementation of hook_menu().<br/> */
- function ivt_header_menu() {
- $items['admin/settings/ivt_header_settings'] = array(
- 'title' => t('IVT Header Settings'),
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('_ivt_header_settings_form'),
- 'access arguments' => array('access administration pages'),
- 'type' => MENU_NORMAL_ITEM,
- );
-
- return $items;
- }
Опишем саму форму со списком загруженных файлов для удаления, полем для загрузки файла, и кнопкой.
Copy Source | Copy HTML
- function _ivt_header_settings_form(){
- $form['#attributes']['enctype'] = 'multipart/form-data';
-
- $form['header_images_del'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Delete images'),
- '#options' => variable_get('ivt_header_images', array()),
- );
-
- $form['header_images_upload'] = array(
- '#type' => 'file',
- '#title' => t('Attach new image'),
- );
-
- $form['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Go!')
- );
-
- return $form;
- }
Выглядеть будет вот так:
Напишем валидатор для этой формы, в котором будем производить загрузку картинки на сайт.
Copy Source | Copy HTML
- function _ivt_header_settings_form_validate($form, &$form_state){
- if (isset($form['header_images_upload'])) {
- //валидация на расширение файла
- $validators = array('file_validate_extensions' => array('png'));
-
- //папка, куда будет загружаться файл
- $dir = file_directory_path() . '/headers';
-
- //проверяем существует ли директория. если ее нету, то она создастся
- if(file_check_directory($dir, 1)) {
- //загружаем файл
- $file = file_save_upload('header_images_upload', $validators, $dir);
-
- //добавляем в $form_state новое поле с файлом
- if ($file) $form_state['values']['header_image_file'] = $file;
- }
- }
- }
В сабмите будем удалять выбранные файлы и добавлять новые.
Copy Source | Copy HTML
- function _ivt_header_settings_form_submit($form, &$form_state){
- $image_file = $form_state['values']['header_image_file'];
- $images_del = $form_state['values']['header_images_del'];
- $images_del = array_filter($images_del);
-
- //получаем список уже загруженых файлов
- $header_images = variable_get('ivt_header_images', array());
-
- //если при сабмите был выбран файл для загрузки
- if ($image_file) {
- //добавляем его в наш список
- $header_images[$image_file->fid] = l($image_file->filename, $image_file->filepath);
- drupal_set_message(t('Image %filename has been uploaded!', array('%filename' => $image_file->filename)));
- }
-
- //если при сабмите были отмечены файлы для удаления
- if ($images_del){
- //пробегаемся по всем файлам
- foreach ($images_del as $fid){
- //загружаем файл из базы данных
- $sql_file = db_fetch_object(db_query("SELECT filepath, filename FROM files WHERE fid = '%s'", $fid));
-
- //удаляем файл из базы данных
- db_query('DELETE FROM {files} WHERE fid = %d', $fid);
- //удаляем файл
- file_delete($sql_file->filepath);
-
- //удаляем файл из нашего списка
- unset($header_images[$fid]);
- drupal_set_message(t('Image %filename has been removed!', array('%filename' => $sql_file->filename)));
- }
- }
- //сохраняем наш список
- variable_set('ivt_header_images', $header_images);
- }
Осталось только написать функцию, которая брала бы из нашего списка произвольную картинку, и возвращала бы ее.
Copy Source | Copy HTML
- function ivt_header_get_image($fid = null){
- global $base_url;
- //если аргумента нету, то берем произвольно
- if (!$fid){
- //загружаем список
- $header_images = variable_get('ivt_header_images', array());
- //берем случайную
- $fid = array_rand($header_images);
- }
-
- //получаем путь до картинки
- $sql_file = db_fetch_object(db_query("SELECT filepath FROM files WHERE fid = '%s'", $fid));
- $filepath = $sql_file->filepath;
-
- $image_html = "<img src='". $base_url .'/'. $filepath ."'/>";
-
- //возвращаем картинку
- return $header_images ? $image_html : '';
- }
Вот и все.