Symfony2 表单用数据预填充字段
Posted
技术标签:
【中文标题】Symfony2 表单用数据预填充字段【英文标题】:Symfony2 Form pre-fill fields with data 【发布时间】:2013-12-10 16:40:24 【问题描述】:暂时假设此表单使用来自ZooCollection
的虚构Animal
文档对象类,该对象类在symfony2 中只有两个属性(“名称”和“颜色”)。
我正在寻找一个工作简单愚蠢的解决方案,用给定的对象预填充 表单字段 auto -神奇地(例如更新?)。
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);
...
【问题讨论】:
只设置动物对象的属性怎么样? 【参考方案1】:您应该加载要更新的动物对象。 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) 中学习总是一个好主意。您可以了解处理此类请求的想法和方式。
【讨论】:
【参考方案2】:使用对象创建表单是最好的方法(请参阅@dtengeri 的回答)。但是您也可以将$form->setData()
与关联数组一起使用,这听起来就像您所要求的。这在不使用 ORM 或只需要更改表单数据的子集时很有帮助。
巨大的陷阱是表单构建器中的任何默认值都将不会被setData()
覆盖。这是违反直觉的,但这就是 Symfony 的工作方式。讨论:
【讨论】:
以上是关于Symfony2 表单用数据预填充字段的主要内容,如果未能解决你的问题,请参考以下文章