yii2-start icon indicating copy to clipboard operation
yii2-start copied to clipboard

Создать модуль FileAPI

Open vova07 opened this issue 11 years ago • 40 comments

https://github.com/vova07/yii2-fileapi-widget Осталось доработать процесс мултизагрузки.

vova07 avatar May 26 '14 16:05 vova07

Классный модуль, жаль не получается прикрутить к своему проекту, жду отдельным модулем

psych88 avatar Jul 30 '14 15:07 psych88

Почти готов. На днях будет.

vova07 avatar Jul 30 '14 15:07 vova07

Хм, а что не получается? У меня вроде как работает в моем проекте. Но если будет отдельно, да еще и с документацией - великолепно!

astappiev avatar Jul 31 '14 22:07 astappiev

Спасибо за работу, очень хочется мультизагрузку.

pol-den avatar Aug 29 '14 22:08 pol-den

Помогите разобраться, все сделал как в мануале На странице регистрации выбираю файл, превьюшка появляется на странице, но в папке которая указана 'path' => '@web/upload/images/' файл не появился, дальше отправляю форму делаю вардамп [preview_url] => null

вот лог http://www.govnokod.com/7910

что не так?

psych88 avatar Oct 01 '14 18:10 psych88

Вы в экшен который загружает временное изображение указали @web/upload/images/ ? JS ошибок никаких нет?

vova07 avatar Oct 02 '14 06:10 vova07

да, указан 'path' => '@web/upload/images' , пробовал и в корень / и в другие папки ошибок нет а зачем вообще нужен этот tmp зачем мне лишние опции которые не нужны, почему не грузить в upload_tmp_dir

psych88 avatar Oct 02 '14 06:10 psych88

вот этот код public function behaviors() { return [ 'uploadBehavior' => [ 'class' => UploadBehavior::className(), 'attributes' => [ 'preview_url' => [ 'path' => '@web/upload/images', 'tempPath' => '@web/upload/images', 'url' => '@web/upload/images' ], 'image_url' => [ 'path' => '@web/upload/images', 'tempPath' => '@web/upload/images', 'url' => '@web/upload/images' ] ] ] ]; }

я это в модель вставляю, правильно?

psych88 avatar Oct 02 '14 07:10 psych88

вы сами попробуйте на дефолтном приложение сделать по реадми, там точно обо всем написано? нельзя как-нибудь упростить установку . я не понимаю зачем нужны 'preview_url' => [ 'path' => '@web/upload/images', 'tempPath' => '@web/upload/images', 'url' => '@web/upload/images' ], 'image_url' => [ 'path' => '@web/upload/images', 'tempPath' => '@web/upload/images', 'url' => '@web/upload/images' ] все что мне надо это просто закачать аватарку юзеру ) приложение базовое

psych88 avatar Oct 02 '14 07:10 psych88

зачем мне лишние опции которые не нужны

Одним это нужно другим нет. Вы легко можете указать нужный вам путь без проблем. Попробую по возможности упростить этот момент.

я это в модель вставляю, правильно?

Правильно.

нельзя как-нибудь упростить установку

Нельзя. Если посмотрите код, то вы поймете что я сделал все чтобы настройка была как можно проще.

По сути: в случае если вы загружаете только одно изображение вам нужна только одна запись:

'avatar_url' => [
    'path' => 'Тут пишем путь постоянной папки где хранятся аватарки',
    'tempPath' => 'Это путь к папке где был загружен временный аватар. Скрипт проверяет наличие аватара в этой папке',
    'url' => 'Это УРЛ по которому будет доступен аватар'
],

Это обязательные параметры, которые невозможно убрать. Я не думаю что кто-то сможет без них обойтись.

приложение базовое

Подразумевается basic ? Или базовое Yii2-Start ?

Рабочий пример с аватаром уже есть в моем модуле пользователей. Возможно это вам поможет понять логику:

  • Добавляем экшен для загрузки аватара: пример тут.
  • Добавляем виджет для загрузки аватара в нужную форму: пример тут
  • В модели подключаем поведение загрузки: пример тут

Готово!

Рабочий пример смотрим тут.

vova07 avatar Oct 02 '14 08:10 vova07

приложение да basic
скачал ваш модуль, все работает, переношу на свой проект, нет превью на странице есть, физически файла нет. после отправки формы файл тоже не появляется, перепроверил код сто раз, все в точности как у вас, только у меня <?php echo $form->field($model, 'avatar')->widget( FileAPI::className(), а у вас Widget::className(),

Есть идеи как еще потестить и найти где ошибка?

psych88 avatar Oct 02 '14 09:10 psych88

Мой модуль заточен специально под Yii2-Start нужно учитывать это в случае его использовании в сторонних приложениях. Касательно проблемы: что получаете в ответ на запрос загрузки самого аватара? Подразумевается ответ на AJAX запрос после выбора аватара.

vova07 avatar Oct 02 '14 09:10 vova07

файл появился в темпе, но как теперь сохранить его в базу? [avatar] => null почему-то

psych88 avatar Oct 02 '14 20:10 psych88

Какой ответ вы получаете от сервера на запрос загрузки? В консоли брайзера точно никаких JS ошибок нет?

vova07 avatar Oct 03 '14 05:10 vova07

ошибок точно нет, файл превью загружается нормально, но когда жму кнопку регистрация, в базу имя файла не сохраняет. Про ответ сервера http://img.lostpic.net/orig_images/7/b/c/7bc83970599263d80ee1372febb5fb07.jpg Может где-то avatar_url прописать надо, в рулс? у меня просто в моделях прописано public $avatar_url; и больше ничего. помню в первом yii надо было писать в рулс array('pic', 'file', 'types'=>'jpg,png,gif'

psych88 avatar Oct 03 '14 19:10 psych88

Ответ от сервера приходит нормальный, но возможно не заполняется значения поля с аватаром после AJAX запроса. Хотя если ошибок нет, то это мало вероятно. Как называется ваше поле которое должно содержать аватар? Приведите весь ваш код: представление с виджетом, контролер где экшен прописывается, и модель. Предпочтительно чтоб код был оформлен в спец теги гитхаба для читаемости. По другому будет трудно понять ошибку.

vova07 avatar Oct 04 '14 07:10 vova07

поле называется avatar_url https://github.com/psych88/opipo/blob/master/forma.php представление виджета https://github.com/psych88/opipo/blob/master/controller.php контроллер https://github.com/psych88/opipo/blob/master/model.php модель

psych88 avatar Oct 04 '14 08:10 psych88

Проверьте если у вас поле avatar_url доступно для присваиваения в текущем сценарии модулеи. Возможно оно просто не присваиваеться, и значение null. Речь идет об сценариях.

vova07 avatar Oct 04 '14 09:10 vova07

В модели добавил ['avatar_url', 'string', 'max' => 64] и все заработало и behaviors я не в ту модель пихал ) еще маленький вопросик, а как можно поменять имя файла, я хочу сделать только jpg и имя аватара это айди нового пользователя. т.е. первый юзер в базе будет с аватаром 1.jpg

psych88 avatar Oct 05 '14 19:10 psych88

https://github.com/vova07/yii2-fileapi-widget/blob/master/Widget.php 85 строка aspectRtio ошибка?

psych88 avatar Oct 05 '14 20:10 psych88

Правило которое вы добавили уже прописано в поведении. лучше добавьте поле через Scenarios метод. Касательно 85 строки: да это опечатка. Исправлю. Спаисбо за это.

vova07 avatar Oct 06 '14 06:10 vova07

Здравствуйте и спасибо за прекрасную песочницу по yii2 Столкнулся с небольшой проблемой на установленной через композер yii2-start - загрузка аватара пользователя в админке не срабатывает (запрос возвращает "Forbidden (#403) You are not allowed to perform this action"). При этом загрузка аватара через редактирование профиля в публичной части приложения проходит успешно, как и загрузка изображений для блога. В чем может быть проблема? Спасибо

FlavBriatore avatar Oct 15 '14 21:10 FlavBriatore

@FlavBriatore исправил ошибку. Обновитесь пожалуйста и проверьте результат. Спасибо!

vova07 avatar Oct 16 '14 07:10 vova07

@vova07 да, добавленный Вами access rule решил проблему, спасибо

FlavBriatore avatar Oct 16 '14 08:10 FlavBriatore

Небольшие идеи по развитию модуля. Сделать модуль обособленным, независимым от других внутренних модулей, как и большинство других модулей. Позволит использовать их независимо.

А по поводу текущего. Можно превратить его в единую точку входа для файлов, чтобы только он знал о файлах и к нему все обращались.

Основное

Заставить этот модуль оперировать понятием attachment, каждый из материалов может иметь один или несколько прикрепленных файлов. Файлы могут быть разного типа, будь то pdf, картинка, видео или иной вид ресурса. К какому типу относится фаил будет определятся в таблице.

Структура

Таблица файлов

  • Имя
  • Url или Uri ( в случае uri, можно подумать в сторону указания адресов вида public://path/to/file.jpg или youtube://videoId реализуется потоками в php) - релативный путь до файла, который потом связывается с путем до директории загруженных файлов, указанной в настройках модуля.
  • mime тип файла - пригодится для реализации скачивания файла
  • размер файла.
  • время создания

Таблица вложений

  • ID файла
  • ID пользователя владельца
  • тип латинский ID, который прописан в настройках модуля, вложения (скажем может быть avatar, video, audio)
  • статус ( опубликовано, черновик etc..)

Если мест где используются вложения много, то можно так же добавить эти два поля, или делать по таблице на каждый тип материала в системе

  • тип материала
  • ID материала

Понятие "Вложение"

Существует базовый класс вложения File, он реализует базовые методы работы с файлом. Так же есть классы Image, Video, Audio, реализующие дополнительные методы, постобработку перед сохранением и другие методы. Так же можно создать в модуле user вложение вида Avatar, которое будет отнаследовано от Image, и перед сохранением будет уменьшать картинку до аватарки и записывать ее в нужную папку и знать откуда взять дефолтный аватар и все в этом духе.

Как это использовать

Подключаем behavior к модели материала, указываем атрибут, указываем тип вложения ( avatar, image, video ). Далее в форме можно заставить behavior получить имя виджета на основе типа вложения, чтобы указать для поля как его выводить.

При сохранении материала, behavior сохраняет вложение и ассоциирует его с материалом и указывает его тип, для последующего вывода.

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

Экшены

Так же можно реализовать отдельные экшены, для удаления, заливки вложений, чтобы можно было реализовать ajax загрузку файла. Скачивание файла, и список файлов.

Настройки модуля

В конфиге модуля можно явно указывать через ассоциированный массив соответсвия типа вложения и его класса

[
    'video' => '\attachment\type\Video',
    'audio' => '\attachment\type\Audio'
]

В таком случае, этот модуль будет независим, но другие модули будут от него зависеть.

JiLiZART avatar Nov 14 '14 12:11 JiLiZART

Такое задумывалось, но в конце отказался от этого так как подумал что многим это будет неудобно. Обычно загрузка картинок в маленьких проектах делается в свою таблицу с сущностями, что упрощает процесс работы с данными ресурсами, и увеличивает скорость работы с ними, ну и уменьшает количество запросов к БД. Если такой функционал будет полезен сообществу, то я могу его реализовать, так как в наличии уже есть подобный модуль, который работает по такой логике. Нужно предусмотреть поведения которые можно будет использовать и по отдельности для загрузки картинок для таких частных случаях которые описал выше. Спасибо! Будет время займусь обновлением приложения.

vova07 avatar Nov 14 '14 14:11 vova07

Ну это все делится, на виджет, на экшен, и все собирается в одном модуле.

JiLiZART avatar Nov 14 '14 14:11 JiLiZART

@vova07 здравствуйте. Планируете ли добавить мультизагрузку файлов в данный виджет? Это было бы просто мегаполезно

FlavBriatore avatar Nov 14 '14 15:11 FlavBriatore

Да, планирую. Как будет свободная минутка, допилю эту возможность.

vova07 avatar Nov 14 '14 17:11 vova07

Отличные новости, значит отличный виджет станет еще полезней. Спасибо за ответ

FlavBriatore avatar Nov 14 '14 17:11 FlavBriatore