Предположим на мгновение, что эта форма использует воображаемый объект объекта документа Animal
из ZooCollection
который имеет только два свойства («имя» и «цвет») в symfony2 .
Я ищу рабочее простое глупое решение , чтобы заранее заполнить поля формы заданным объектом автоматически (например, для обновлений?).
Acme/DemoBundle/Controller/CustomController
:
public function updateAnimalAction(Request $request) { ... // Create the form and handle the request $form = $this->createForm(AnimalType(), $animal); // Set the data again << doesn't work ? $form->setData($form->getData()); $form->handleRequest($request); ... }
Вы должны загрузить объект животного, который вы хотите обновить. createForm () будет использовать загруженный объект для заполнения поля в вашей форме.
Предполагая, что вы используете аннотации для определения ваших маршрутов:
/** * @Route("/animal/{animal}") * @Method("PUT") */ public function updateAnimalAction(Request $request, Animal $animal) { $form = $this->createForm(AnimalType(), $animal, array( 'method' => 'PUT', // You have to specify the method, if you are using PUT // method otherwise handleRequest() can't // process your request. )); $form->handleRequest($request); if ($form->isValid()) { ... } ... }
Я считаю, что всегда полезно учиться на коде, создаваемом командами Symfony и доктрины консоли ( doctrine: generate: crud ). Вы можете изучить идею и способ обращения с такими типами запросов.
Создание формы с использованием объекта – лучший подход (см. Ответ @ dtengeri). Но вы также можете использовать $form->setData()
с ассоциативным массивом, и это похоже на то, о чем вы просили. Это полезно, если вы не используете ORM, или просто вам нужно изменить подмножество данных формы.
Массивный вопрос заключается в том, что любые значения по умолчанию в вашем построителе форм не будут переопределены setData()
. Это противоречит интуиции, но так работает Symfony. Обсуждение: