Pull to refresh

Comments 15

Задача стояла просто загружать файлы, делая их доступными по http, без привязки к нодам?

PS Приятный комментированный код! Но не хватает до ката внятной формулировки цели, а после — чайниковых пояснений, какие куски кода куда пишутся.
Задача ведь описана: создание модуля для random'ного отображения картинок. Уровень — для новичков.
Случайную картинку можно выводить базовыми средствами Views. Зачем программировать?
Чтобы хоть что-то уметь делать без views и cck.
А вообще, пост про загрузку файлов через forms api, а не вывод случайной картинки.
дальше несложно, хук на node_save и сохраняем связь куда хотим. Чем больше кода, тем меньше его будут читать, его и так в посте немало, имхо.
//папка, куда будет загружаться файл
$dir = variable_get('file_directory_path', 'files') . '/headers';


Должно быть

$dir = file_directory_path() . '/headers';

А вобще — то же самое можно было бы более гибко реализовать через ноды и вьюхи — можно было бы без особых проблем накладывать на изображения пресеты imagecache и прочие полезные штуки.
это то понятно. задачей было залить файл в drupal через form api.
а это просто наглядный пример реализации.
Пару комментариев

1. FILE_CREATE_DIRECTORY. file_check_directory($dir, 1) — не совсем понятно. file_check_directory($dir, FILE_CREATE_DIRECTORY) — понятнее.
2. После аплоада файла и успешной валидации, нужно обязательно сделать $file->status = FILE_STATUS_PERMANENT; т.к. после запуска крона файл удалится. Ф-я file_save_upload() ставит статус файлу — FILE_STATUS_TEMPORARY по умолчанию.
Если Вы хотели объяснить изпользование form API для загрузки файлов, то можно было бы ограничиться куда меньшим количеством кода.
Там ведь хитрости совсем мало.

1. Делаете стандартную форму, так чтобы в ней был элемент типа «file» api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#file

2. Обязательно укажите для формы $form['#attributes'] = array('enctype' => «multipart/form-data»)
кстати это написано по ссылке выше прям во второй строчке

3. Валидатором проверяете, что это картинка, еще можно проверить максимально допустимый размер.
У Вас, кстати, идет проверка по расширению. Я бы советовал проверять по типу mime. Обходите массив foreach($_FILES as $file) и проверяете $file['type']['название_поля']
там же можно проверить размер $file['size']['название_поля']

4. Сохраняете файл в сабмит-функции.
я использовал: move_uploaded_file($file['tmp_name']['название_поля'], "/путь/имя.картинки";

Кстати и проверку и сохранение я делал прямо в сабмите прямо в обходе массива foreach($_FILES as $file)

Просто когда так много кода, то достаточно сложно вычленить основную мысль.
В пух и прах :)

Только foreach($_FILES as $file) — лучше ограничить.
3. Drupal имеет специальние функции валидации файлов -> file_validate_extensions, file_validate_image_resolution, file_validate_is_image, file_validate_name_length, file_validate_size — покрывают 98% нужных проверок.

4. Для того чтобы Drupal правильно сохранил fileId нужно использовать Drupal функцию file_save_upload (как автор). В друпале не принято напрямую использовать $_FILES (как и $_POST впрочем). И не забить file_set_status.

А вот где лутше сохранять файл в валидаторе или в сабмите не всегда так ясно. Например если сохранять в сабмите, то, когда есть ошибка при валидации другого поля пользователю прийдеться аплоадить файл 2ий раз. Хотя если на форме только одно поле з файлом то нужно сохранять в сабмите.

Файл нужно аплоадить в валидации. А вот статус ПЕРМАНЕНТ ставить в сабмите. Таким образом, если при валидации произошла ошибка и файл зааплоадился, то он удалится при следующем запуске крона.
Спасибо за статью. Как раз сейчас одному заказчику требуется из обычного проигрывателя на сайте, сделать плеер с плейлистом и этот туториал отлично подойдет для бэк-енда.
а валидируется ли $images_del->fid встроенным валидатором, чтобы случаем не тот файлик удалить?
Sign up to leave a comment.

Articles