UploadedFile не корректное имя атрибута

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

UploadedFile не корректное имя атрибута

Сообщение comunTwist »

Это моя последняя попытка получить ответ на вашем сайте. Больше я не буду тратить время на наполнение его контентом...

У меня есть форма, в которой в цикле выводятся массивы полей. То есть элемент массива - это объект. Одно из полей подразумевает загрузку картинки. Форма рендерится примерно так:

Код: Выделить всё

<?php foreach ($images as $key => $image) : ?>
   <?= $form->field($image, '[' . $key . ']alt')->textInput() ?>
   <?= $form->field($image, '[' . $key . ']image')->fileInput() ?>
<?php endforeach; ?>
Соответственно сохраняю объекты тоже циклом, примерно так:

Код: Выделить всё

foreach ($images as $image) {
   $image->save(false);
}
В этом примере, поле alt сохраняется без проблем, а вот картинку извлечь сложно. Дело в том, что загрузчику зачем-то нужен индекс массива из переданного поля. То есть вот такой код, возвращает null:

Код: Выделить всё

 $files = UploadedFile::getInstance($this, 'image');
А вот такой код возвращает объект картинки:

Код: Выделить всё

 $files = UploadedFile::getInstance($this, '[0]image');
И это странно, ведь загрузчик уже работает с $this, но в поле image ничего нету, зато есть какое-то псевдополе [n]image, n которого я никак не могу вычислить из модели.

Как победить?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: UploadedFile не корректное имя атрибута

Сообщение unknownby »

comunTwist писал(а): 2020.12.04, 11:32 Это моя последняя попытка получить ответ на вашем сайте. Больше я не буду тратить время на наполнение его контентом...
Ваш контент тут никому не нужен, кроме вас самих :D
comunTwist писал(а): 2020.12.04, 11:32 Как победить?
Предлагаю использовать мультиплай виджет (этот или любой другой, который найдете), который может помочь решить проблемы.
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

Re: UploadedFile не корректное имя атрибута

Сообщение comunTwist »

unknownby писал(а): 2020.12.04, 13:41 Ваш контент тут никому не нужен, кроме вас самих :D
Сложно не согласиться, как и получить ответ
unknownby писал(а): 2020.12.04, 13:41 Предлагаю использовать мультиплай виджет (этот или любой другой, который найдете), который может помочь решить проблемы.
Я не уверен, что виджет поможет, но спасибо за ответ. Проблема именно в поле загрузки файла, другие поля приходят корректно.

У меня есть поля формы, с подобными именами:

Код: Выделить всё

ProductImage[$id][slug]
ProductImage[$id][alt]
ProductImage[$id][image]
После отправки формы, я получаю соответствующий массив объектов.

Метод UploadedFile::getInstance($this, 'image') работает с глобальным массивом $_FILES. Как выяснилось, этот массив формирует другую структуру, он обрезает скобки. В итоге, например, чтобы вытащить имя файла из этого массива, нужно обратиться так:

Код: Выделить всё

ProductImage[name][$id][image]
а ожидаедтся:

Код: Выделить всё

ProductImage[$id][name][image]
Соответственно метод UploadedFile::getInstance($this, 'image') не может корректно отработать.

Неужели только у меня такие проблемы? Типичная же на вид задача: прикрепить несколько дочерних объектов с картинками к одному родительскому
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: UploadedFile не корректное имя атрибута

Сообщение unknownby »

comunTwist писал(а): 2020.12.04, 14:59 Неужели только у меня такие проблемы? Типичная же на вид задача: прикрепить несколько дочерних объектов с картинками к одному родительскому
Чтоб не быть голословным
Вот так выглядит прикрепление документов (картинок, зависит от настройки)
http://prntscr.com/vvpy9y
Вот так документы закреплены
http://prntscr.com/vvq06o
После сохранения видим, что они загружены и всё отлично.
http://prntscr.com/vvq1j2

Вместо "тип документа", может быть "описание документа" и вводить вручную.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: UploadedFile не корректное имя атрибута

Сообщение proctoleha »

Как интересно. Вот вы выводите картинки в цикле

Код: Выделить всё

<?= $form->field($image, '[' . $key . ']image')->fileInput() ?>
У каждой картинки есть ключ - 0, 1, 2 ...

Т.е. в массиве POST вам, условно прилетит

Код: Выделить всё

image = [
	0 => '...',
	1 => '...',
	2 => '....'
]
А потом вы спрашиваете - почему приложение не сохраняет данные без указания ключа? Может это действительно не ваш сайт?
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

Re: UploadedFile не корректное имя атрибута

Сообщение comunTwist »

proctoleha писал(а): 2020.12.04, 19:12 Как интересно. Вот вы выводите картинки в цикле

Код: Выделить всё

<?= $form->field($image, '[' . $key . ']image')->fileInput() ?>
Этот синтаксис взят из официальной документации.
proctoleha писал(а): 2020.12.04, 19:12 У каждой картинки есть ключ - 0, 1, 2 ...

Т.е. в массиве POST вам, условно прилетит

Код: Выделить всё

image = [
	0 => '...',
	1 => '...',
	2 => '....'
]
А потом вы спрашиваете - почему приложение не сохраняет данные без указания ключа? Может это действительно не ваш сайт?


Модель $image, в данном случае это ProductImage, и да, на выходе должно быть примерно следующее:

Код: Выделить всё

ProductImage = [
	0 => [
	    'image' => [
	       'name' => '...'
	    ]
	],
        1 => [
	    'image' => [
	       'name' => '...'
	    ]
	],
        2 => [
	    'image' => [
	       'name' => '...'
	    ]
	],
]
И на самом деле, так и происходит - я получаю такую структуру для всех полей, КРОМЕ поля загрузки файла. Очевидно, что имена полей - это строки и фреймворк парсит их и преобразует в массивы, поэтому строка ProductImage[$id][image], будет преобразована в массив выше. Файлы же, идут отдельным заголовком в переменной $_FILES. И там уже другая структура, которую фреймворк не правильно парсит:

Код: Выделить всё

ProductImage = [
	'name' => [
	    0 => [
	       'image' => '...'
	    ],
	    1 => [
	       'image' => '...'
	    ]
	    2 => [
	       'image' => '...'
	    ]
	]
]
Вот дебаг модели и дебаг $_FILES: https://prnt.sc/vw8ww6
Аватара пользователя
comunTwist
Сообщения: 9
Зарегистрирован: 2020.11.10, 23:20

Re: UploadedFile не корректное имя атрибута

Сообщение comunTwist »

unknownby писал(а): 2020.12.04, 15:08
comunTwist писал(а): 2020.12.04, 14:59 Неужели только у меня такие проблемы? Типичная же на вид задача: прикрепить несколько дочерних объектов с картинками к одному родительскому
Чтоб не быть голословным
Вот так выглядит прикрепление документов (картинок, зависит от настройки)
http://prntscr.com/vvpy9y
Вот так документы закреплены
http://prntscr.com/vvq06o
После сохранения видим, что они загружены и всё отлично.
http://prntscr.com/vvq1j2

Вместо "тип документа", может быть "описание документа" и вводить вручную.
Просто люблю всё делать сам без лишних библиотек. Но спасибо, попробую на досуге
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: UploadedFile не корректное имя атрибута

Сообщение unknownby »

comunTwist писал(а): 2020.12.05, 11:49
unknownby писал(а): 2020.12.04, 15:08
comunTwist писал(а): 2020.12.04, 14:59 Неужели только у меня такие проблемы? Типичная же на вид задача: прикрепить несколько дочерних объектов с картинками к одному родительскому
Чтоб не быть голословным
Вот так выглядит прикрепление документов (картинок, зависит от настройки)
http://prntscr.com/vvpy9y
Вот так документы закреплены
http://prntscr.com/vvq06o
После сохранения видим, что они загружены и всё отлично.
http://prntscr.com/vvq1j2

Вместо "тип документа", может быть "описание документа" и вводить вручную.
Просто люблю всё делать сам без лишних библиотек. Но спасибо, попробую на досуге
Может стоит самому делать хлеб, колбасу, бензин и машину свою создать, но прежде детали выковать из добытой руды.
Ответить