2013-10-07 6 views
5

symfony2で動的フォームに問題が発生しました。私は提出されたフォームのいくつかのフィールドを生成しようとしています。言い換えれば、ユーザーはいくつかの値を入力し、フォームを送信し、これらの値に従って、私のダイナミクスフィールドがこの同じフォームに追加されます(これは明らかに2回目に表示されます)。これを行うには、私は料理からこの例を使用:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-datasymfony2がエラーのない動的フォームを無効にしました

だから、ここに私のFormationTypeクラスかなりよくそう

class FormationType extends AbstractType 
{ 

private $em; 
private $context; 

public function __construct($em, $context) { 
    $this->em = $em; 
    $this->context = $context; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name') 
     ->add('date') 
     ->add('type', 'choice', array(
      'mapped' => false, 
      'choices' => Formationlist::getTypeTypes(false), 
      'empty_value' => false, 
     )) 
     ->add('cost') 
     ->add('travelCost') 
     ->add('maximum') 
     ->add('location') 
     ->add('schedule') 
    ; 

    $formModifier = function(FormInterface $form, $type) { 
     $formationList = $this->em->getRepository('CoreBundle:FormationList')->findBy(array("year" => 1, "type" => $type)); 

     $form->add('formationList', 'entity', array(
      'label'=> 'Titre formation', 
      'choices' => $formationList, 
      'class' => 'CoreBundle:FormationList', 
      'property' => 'title',) 
       ); 

     }; 


    $builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function(FormEvent $event) use ($formModifier) { 

      $data = $event->getForm(); 
      $type = $data->get('type')->getData(); 

      $formModifier($event->getForm(), $type); 

     } 
    ); 

    $builder->get('type')->addEventListener(
     FormEvents::POST_SUBMIT, 
     function(FormEvent $event) use ($formModifier) { 

      $type = $event->getForm()->getData(); 
      $formModifier($event->getForm()->getParent(), $type); 
     } 
    ); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'EXAMPLE\CoreBundle\Entity\Formation' 
    )); 
} 

public function getName() 
{ 
    return 'example_corebundle_formationtype'; 
} 
} 

、2つのaddEventListener作品です。私のフォームが最初に表示されると、formModifierのフィールドは期待通りにロードされません。私のコントローラクラスは、次のいずれかです。

public function createAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $contextSrv = $this->get('example.service.context'); 
    $context = $contextSrv->getContext(); 

    $entity = new Formation(); 
    $form = $this->createForm(new FormationType($em, $context), $entity); 
    $form->bind($request); 

    if ($form->isValid()) { 

     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('formation_show', array('id' => $entity->getId()))); 
    } 

    return array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    ); 
} 

私のダイナミックな分野の一つは、フォームが送信される初めてnullにすることはできませんので、それが有効にすることはできません。したがって、FormationTypeは2度目に読み込まれます。つまり、フィールド "type"が満たされている場合、私のformModifier()関数は動的フィールド(formationList)をロードできます。それまでは、すべてがうまくいきました。私は新しい分野を手に入れました。

しかし、フォームの2回目の「提出」後には何も起こりません。ページは再ロードされ、エラーは表示されません。

私は

var_dump($request->request->get('example_corebundle_formationtype')); 

でフォームの内容を確認 - (動的なものを含む)すべてのフィールドは有効な値で満たされています>。

また、私はこれを試してみてください。

foreach($form->all() as $item) { 
     echo $item->getName(); 
     var_dump($item->getErrors()); 
} 

は - >これらの行でエラーが表示されません。しかし、フォームは決して有効ではありません。

- > falseを返します。したがって、フォームは無効です。

最後に、動的部分全体を削除すると、フォームが機能します。 何が問題なのか分かりません。フォームにエラーが表示されず、csrfトークンが正しく表示されます。私は何か見落としてますか ?ご協力いただきありがとうございます。

+0

このコード行を削除すると、タイプの値が同じであれば、firebugで確認できますか?フォーム$ formModifierの 'choices' => $ formationList? – Cesc

+0

hm ...あなたの意見は分かりません。 $ formModifierから 'choices' => $ formationListを削除しましたが、フィールド "type"に何も起こりません。これは、 'タイプ'が動的値のない選択であるために期待しています。 formationListフィールドはありましたが、まだリストになっています(数字は内の – TiPi

+0

は、FormationListクラスの有効なID(指定した主キーを問わず)でなければなりません。そうでない場合、$ form-> isValid()はfalseになります。それは私の要点でしたが、$ formationListのリストがうまくいっていて、適切なIDを持っているはずです。それは単なる野生の推測だった。 – Cesc

答えて

1

これはちょっと古くなっていますが、Googleではかなり上がっています。

getErrors()メトードは、フォームの埋め込みフォームをフォームに使用するときに、getErrors(true)またはより洗練されたメソッドを必要とします。詳細はhttps://knpuniversity.com/blog/symfony-debugging-form-errorsをご覧ください。

1

おそらくフォームのどこかにバリデーションエラーがあります。代わりにフォーム:: getErrorsにあなたの複雑な呼び出しの

() - 完全に再帰的ではありません、第二レベルより深い任意のフィールドのエラーなどは表示されません - あなたはフォームを使用する必要があります:: getErrorsAsString( )

これは、あなたのような開発者のためにSymfonyの人が作成したデバッグメソッドで、検証エラーが複雑なフォームのどこにあるのかを理解しようとしています。

エラーは表示されない場合は、フォームのエラーとなる可能性があります。カスタムフォームテーマを作成するときに、開発者がフィールドのエラーブロックを表示するのを無効にするか、忘れてしまう可能性があります。

問題のもう1つの原因は、フォームの一般的な表示です。 {{form_widget(form)}}を使用してフォームを表示すると、トップフォームにバブルするエラーは表示されません。代わりに{{form_row(form)}}を使用してください。

+0

知っておいてよかった、getErrorsAsString、このチップのおかげで!残念ながら、それは何の誤りも示さなかった。単一のフィールドごとに "エラーなし"のみ...私は同じ結果のためにform_widgetの代わりにrow_formも使用しました。そして、私はこのフォームのカスタムテーマを使用しないので...これは原因ではありません。 あなたのアドバイスは何が間違っているかを知るのに役立ちます! – TiPi

+0

しかしそれは不合理です。 Form :: isValid()の基本定義を確認した場合、このメソッドはエラーの存在を再帰的にチェックします。 Form :: getErrorsAsString()が何も返さない場合、isValid()はtrue、periodでなければなりません。カスタムisValid()メソッドを使用していますか?フォームがバインドされた後で、チェックとダンプを行うことは絶対に確実ですか? – Zephyr

+0

余分なフィールドがある可能性もあります。 – geoB

0

私はこの問題に数回も遭遇しました。

私の場合、私はJSON形式でデータを投稿しました。したがって、jsonデータを$ request-> requestで利用可能な通常のPOSTデータに変換する優先度の高いリクエストリスナーを実行する必要がありました。

ポストデータが空の場合でも$フォームが無効でエラーがないシナリオは、$ request-> request-> all()をダンプしてデータがあるかどうかを確認してください。

関連する問題