我们从 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
有没有办法将表单重新绑定到实体/重新加载数据?
我们从 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
有没有办法将表单重新绑定到实体/重新加载数据?
我做了一些可以解决问题的方法……不知道这是否是最好的方法,但是……
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())
);
}
通过克隆刚刚实例化的表单对象,我可以将“完整”对象切换为空对象,并保留所有参数。
以及在成功发布后重置表单的最明显方法。设置一个“flash”,重定向到表单页面并显示flash:
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 %}
好吧,您可以创建表单的新实例并重新绑定。看起来有点矫枉过正,但它会在紧要关头起作用。