LaravelRUS / SleepingOwlAdmin

🦉 Administrative interface builder for Laravel (Laravel admin)
http://sleepingowladmin.ru/
MIT License
805 stars 217 forks source link

\vendor\laravelrus\sleepingowl\resources\assets\js\admin\form\file.js - paramName #321

Closed ghost closed 7 years ago

ghost commented 8 years ago

Проблема в параметре предзагрузки файла. Он не устанавливается в dropzone.js в файле в сабжекте - ни через AdminFormElement::file('image') ни через ->setName('images');

Так и остается file

butschster commented 7 years ago

Не совсем понял проблему. Можешь подробнее объяснить?

ghost commented 7 years ago

Да мне проще пул сделать - сегодня сделаю.

ghost commented 7 years ago

спустя две недели.... 🥇

Butochnikov commented 7 years ago

@aios а с этим у нас что?

ghost commented 7 years ago

@Butochnikov я даже нашел эту проблему


button.dropzone({
                url: this.url,
                method: 'POST',
                uploadMultiple: false,
                previewsContainer: false,
                dictDefaultMessage: '',
                headers: {
                    'X-CSRF-TOKEN': window.Admin.Settings.token
                },
                sending () {
                    self.closeAlert()
                },
                success (file, response) {
                    self.value = response.value;
                },
                error (file, response) {
                    if(_.isArray(response.errors)) {
                        self.$set('errors', response.errors);
                    }
                }
            });

Дроп зона инстанциируется с дефолтным файловым параметром под именем file причем @{{$name}} передается в сам компонент и вау - он вот в этом моменте теряется. Причем наблюдается это и в компонентах file, images, image Самое интересное что роут зарегистрированный под это счастье действительно считает что это верно

Но давайте отклонимся от задачи делать это в админке потому что админка не поддерживает S3 и добавим на элемент images, image, file свой view - переделаем в нем роут и укажем свой контроллер. Вот тут у нас и начинается котовасия - потому что нам нужно будет создавать кастомные вью для каждой энтити у которой загрузка файла.

Если @butschster объяснит зачем кроется такая логика то вполне реально что я пойму что я дурачок и закрою иссуй - пока я как бы и сделать что то хочу с этим - и боюсь одновременно.

ghost commented 7 years ago

@butschster Паш ну отпишись то что думаешь по этому поводу?

butschster commented 7 years ago

@aios Я если честно так и не понял проблемы, задачи и т.д. Dropzone только загружает файл на сервер и отдает обратно ссылку на файл, которая попадает в элемент формы. Т.е. само поле ничего не загружает, а только сохраняет ссылку на файл в БД.

ghost commented 7 years ago

@butschster верно - но у меня кастом контроллер и кастом обработка которая может отдать вообще json а не урлу файла. что предлагаешь сделать тут?

ghost commented 7 years ago

Вешать кастомные параметры в админке что бы определить что загрузка приходит из админки - как то глупо. Вот просто представь что есть один контроллер загрузки на всю ивановскую. че делать?)

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

butschster commented 7 years ago

@aios ты так со мной общаешься, как будто я в курсе того, что ты решил сделать. Пока что я понял, что тебе не нравится что имя file. Вообще все это работает через vuejs и врядли это подойдет для твоих задач, проще написать свой JS со своими заморочками

ghost commented 7 years ago

Ладно, я понял вообщем начал работу. Постараюсь сегодня залить.

Butochnikov commented 7 years ago

с загрузкой файлов тема важная. @aios предлагаю тебе написать, что ты хочешь получить в итоге и как, и желательно с кодом, а то так трудно понять. а не хотелось бы закрывать не разобравшись. Если это упрется в то, что это не возможно сделать, то это к той теме, что нужен отдельный элемент который будет работать через storage.

ghost commented 7 years ago

Элемент не нужен - нужен общий метод.. который будет выбирать драйвер. всего то делов. Я хочу унифицировать все элементы что бы можно было на каждый задать параметры загрузки файлов. Нужно расширить количество параметров - и подогнать под выдачу не текстового url картинки - а json с возможностью указать какой именно элемент в json будет отвечать за url в идеале даже с доп логикой ибо вернуться может вообще всякое всякое Давно. Добавить возможность указать роут куда складывать картинки- по сути это может быть кастомный контроллер - кастомный хендлер админки - кастомное что угодно. Так же нужно предусмотреть обработку бакета что бы указывать path-key и возвращать их урлы. Возможно контроллер будет принимать модель на входе что бы прицепить картинку сразу и вернуть отношение там или хз. По сути сейчас очень много проблем с этой заливкой очень... мне пришлось пройти реально огонь и воду что бы заставить все элементы админки складировать фотки туда куда мне нужно. А многим из обывателей это тупо не под силу.

То есть работу с драйверами не только на S3. завтра кто то захочет на GCS, RackSpace, HisOwnFavoriteDriver который он же и опишет. Это все админка должна предусматривать в стиле ->setDriver('s3')

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

Это моя субъективная позиция. @Butochnikov

butschster commented 7 years ago

Не совсем понимаю с чем у тебя возникли сложности, но вот тот контроллер, через который происходит загрузка файлов. https://github.com/LaravelRUS/SleepingOwlAdmin/blob/development/src/Http/Controllers/UploadController.php#L65 Ну и за сам процесс загрузки файла отвечает само поле https://github.com/LaravelRUS/SleepingOwlAdmin/blob/development/src/Form/Element/File.php#L224

Т.е. добавить поддержку сторонних хранилищ не должно занять много времени и сил.