Symfony2使用数据形成预填字段

时间:2013-12-10 16:40:24

标签: php forms symfony controller doctrine-mongodb

暂时假设此表单使用来自Animal的虚构ZooCollection文档对象类,中只有两个属性(“name”和“color”)。< / p>

我正在寻找工作简单的愚蠢解决方案使用给定对象 auto预填充 表单字段 -magically (例如,更新?)。

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);
    ...
}

2 个答案:

答案 0 :(得分:7)

您应该加载要更新的动物对象。 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控制台命令(doctrine:generate:crud)生成的代码中学习总是一个好主意。您可以了解这个想法以及处理此类请求的方式。

答案 1 :(得分:1)

使用对象创建表单是最好的方法(请参阅@ dtengeri的回答)。但你也可以将$form->setData()与关联数组一起使用,这听起来就像你要求的那样。如果不使用ORM,或者只需要更改表单数据的子集,这将非常有用。

大量问题是表单构建器中的任何默认值 都不会被setData()覆盖。这是违反直觉的,但它是Symfony如何运作的。讨论: