Я использую автономную форму Symfony (то есть не полную структуру стека) для создания типа «изображения», который позволяет пользователям загружать 1-x изображений и присваивать каждому название, изменять порядок загружаемых изображений и так далее.
Я сделал это, создав тип изображения, который содержит файл и текстовое поле. Я также подклассифицировал CollectionType в качестве держателя (как в примере с кулинарной книгой). Наконец, у меня есть выделенный класс хранения, связанный с CollectionType, который заботится о сохранении загруженных данных (я не могу сохранить отдельные изображения отдельно, так как мне также нужно сохранить порядок).
Это все работает более или менее, то есть я могу добавлять / обновлять / удалять изображения в обычном режиме. Единственная проблема, с которой я сталкиваюсь, — это когда в каком-либо другом поле в той же форме возникает ошибка проверки (например, если я не заполняю обязательное поле). В этой ситуации загруженный файл никогда не достигает класса хранения, и при повторной визуализации формы данные представления имеют неправильный формат. Поэтому я добавил ViewTransformer в свой собственный CollectionType, который обнаруживает этот случай и выполняет необходимое преобразование. Что в принципе работает, но, к сожалению, оно помещает преобразованные данные в неправильное место: экземпляр FormView, соответствующий CollectionType, имеет правильные (т.е. преобразованные) данные, в то время как дочерний экземпляр (то есть тип изображения) имеет нетрансформированные значения. Поэтому возникает вопрос: могу ли я сделать так, чтобы преобразованные данные передавались нужному потомку, или это не должно происходить автоматически даже?
Я могу предоставить пример кода, если это поможет, но может потребоваться некоторое время, чтобы извлечь только соответствующие части. А пока я хотел спросить: правильно ли я подхожу к этой проблеме? Документация о внутренней работе формы Symfony немного не нужна, поэтому я не уверен, что не будет более простого способа сделать то, что я пытаюсь сделать.
РЕДАКТИРОВАТЬ: После долгих отладок я обнаружил, что моя проблема в том, что во время вызова трансформаторов по-разному submit()
а также setData()
: В течение submit()
(т.е. когда данные загружаются из серверной части хранилища), преобразователь представления запускается на родительском объекте (т.е. CollectionType
), а затем преобразованный $viewData
передается детям. В течение submit()
, наоборот: сначала отображаются дочерние данные, а затем запускается преобразователь представления. Я думаю, что я открою билет на GH …
Задача ещё не решена.
Других решений пока нет …