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-&gt;setData() 与关联数组一起使用,这听起来就像您所要求的。这在不使用 ORM 或只需要更改表单数据的子集时很有帮助。

http://api.symfony.com/2.8/Symfony/Component/Form/Form.html#method_setData

巨大的陷阱是表单构建器中的任何默认值都将不会setData() 覆盖。这是违反直觉的,但这就是 Symfony 的工作方式。讨论:

https://github.com/symfony/symfony/issues/7141

【讨论】:

以上是关于Symfony2 表单用数据预填充字段的主要内容,如果未能解决你的问题,请参考以下文章

如何正确预填充颤振表单字段?

ASP.NET / 模型 - 防止模型预填充表单输入字段

CakePHP 2.4:不需要的预填充表单数据

根据另一个表单字段(单选按钮)预填充值 HTML 表单输入

预填充 EntityType 类型的 Symfony 表单的字段

Symfony2 和 Doctrine2 :用两个实体填充表单(一个复杂的场景)