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

时间:2012-09-25 21:42:22

标签: symfony symfony-2.1

我们从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

有没有办法将表单重新绑定到实体/重新加载数据?

3 个答案:

答案 0 :(得分: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())
     );
}

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

答案 1 :(得分: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(),
    );
}

在你的树枝上:

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

答案 2 :(得分:3)

好吧,您可以创建表单的新实例并重新绑定。看起来像是矫枉过正,但它会起作用。