0

これが私のフォームのリストです:

$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」フィールドを除外すると、すべて問題なく動作します。非表示タイプを使用して検証を行うにはどうすればよいですか?

4

1 に答える 1

2

この問題は、隠しパラメーターがオプションであるという事実から発生します。

よくある間違いは、フォームを送信するときに関連する型を設定しないことです。

間違いの例:

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 を設定できます。

于 2012-12-21T16:17:22.133 に答える