以下是我的表单列表:
$builder = $this->createFormBuilder($project)
->add('name','text')
->add('type','choice', array(
'choices' => $enumtype
))
->add('begindate','date')
->add('expecteddate','date')
->add('events', 'collection', array(
'type' => new EventType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
))
->add('financial', 'file', array(
'property_path' => false,
'required' => false
))
->add('investition', 'file', array(
'property_path' => false,
'required' => false
));
if ($defaults) {
$builder->add('id','hidden',array('data' => $defaults['id'], 'property_path' => false));
$form = $builder->getForm();
$form->setData($defaults);
}
else
$form = $builder->getForm();
当我尝试验证此表单时,我收到FormError对象:
Array (
[0] => Symfony\Component\Form\FormError Object (
[messageTemplate:protected] => This form should not contain extra fields.
[messageParameters:protected] => Array (
[{{ extra_fields }}] => id
)
[messagePluralization:protected] =>
)
)
如果我排除“id”字段 - 一切正常。 我如何使用隐藏类型并进行验证?
答案 0 :(得分:2)
这个问题来自隐藏参数是optionnal。
常见的错误是在提交表单时不设置相关类型。
错误示例:
public function addOrEditAction($id=null)
{
$request = $this->getRequest();
if (!$id) {
$model = new Actu();
$type = new ActuType(); /* I do not set the default id on submit */
} else {
$em = $this->getDoctrine()->getEntityManager();
$model = $em->getRepository("MyBundle:Actu")
->find($id);
if (!$model) {
return $this->redirect($this->generateUrl('admAddNew'));
} else {
$type = new ActuType($model->getId());
}
}
$form = $this->createForm($type,$model);
if ('POST' == $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getEntityManager();
$em->persist($model);
$em->flush();
return $this->redirect($this->generateUrl('admNews'));
}
}
$data = array('form'=>$form->createView());
return $this->render('MyBundle:Page:news-add.html.twig',$data);
}
致电控制器时
ActuType()
包含:
'name', 'content', 'date', 'id'
提交表单时
ActuType()
包含:
'name', 'content', 'date'
他们不匹配。
这实际上会返回一个错误,因为在提交表单时会有一个包含要编辑的行的隐藏id
的额外字段。
您需要做的就是在初始化FormType
之前检查请求if (!$id && null === $id = $request->request->get('newsType[id]',null,true)) {
使用此功能,您可以设置在请求页面时所执行的相同FormType