在Symfony2.1中重新加载或清除现有表单中的数据。

7
我们从Symfony 2.0升级到了2.1版本。在2.0版本中,我习惯像这样修改实体并重新加载表单:
$form->setData($entity);

但是自从Symfony 2.1之后就不再允许这样做了(https://github.com/symfony/symfony/pull/3322)。我会得到以下错误:

You cannot change the data of a bound form

有没有一种方法可以重新绑定表单到实体/重新加载数据?

你可以请提供一下你的解决方案吗? - pmoubed
3个回答

11

我做了一些事情,起到了效果...不知道这是否是最好的方法,但...

public function contactAction(Request $request){
    $task = new myBundle();

    $form = $this->createFormBuilder($task)
        ->add('email', 'text', array('label'=>'E-mail'))
        ->add('message', 'textarea')
        ->add('newsletter', 'checkbox', array('label'=>'blabla','required'=>false))
        ->getForm();

   $cloned = clone $form;

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        if ($form->isValid()) {
            [... code ...]
            $form = $cloned;
        }
    }
    return $this->render(
         'myBundle:Default:contact.html.twig',
          array('form' => $form->createView())
     );
}

通过克隆刚实例化的表单对象,我可以用空的对象替换“完整”对象,并保留所有参数。


8

在成功提交表单后,最明显的重置表单的方式是设置一个“闪存”,重定向到表单页面并显示该闪存:

public function contactAction(Request $request)
{
    $contact = new Contact();
    $form = $this->createForm(new ContactType(), $contact);

    $form->handleRequest($request);

    if ($form->isValid()) {
        //...

        $session = $this->container->get('session');
        $session->getFlashBag()->set('success', 'Your message has been sent.');

        return $this->redirect($this->get('router')->generate('contact'));
    }

    return array(
        'form'  => $form->createView(),
    );
}

在你的Twig模板中:

{% if app.session.flashBag.has('success') %}
    {{ app.session.flashBag.get('success')[0] }}
{% endif %}

3

好的,你可以创建一个新的表单实例并重新绑定。虽然有点过度,但在紧急情况下这将起作用。


是的,我曾尝试过那种方法,但由于我们有一个基本表单并在控制器中使用 ->remove 来保留所需字段,所以这很麻烦。不过我认为没有其他办法了,感谢你的帮助。 - Ben
@Ben 在控制器上创建一个private function(),用于创建baseForm并添加->remove()。这样就像另一个$this->something()一样简单。 - Rixius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接