2012-12-21 45 views
0

这里是我的形式上市:Symfony2的额外领域FormError与隐藏字段验证表单

$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

询问时设置你做了同样的FormType类还是你绑定到一个实体?如果是后者,可能性是绑定到未定义的属性(id),或者它是不能以这种方式在窗体中设置的主键。 – phpisuber01

+0

我将它绑定到一个实体,但这是未定义的属性。名称无关紧要。 – Aronsky

回答

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)) { 

有了这个前检查的要求,您可以您使用的是独立形式的页面