2016-10-09 13 views
1

私のプロジェクトには、Event、OrganizerProfile、Userという3つのドキュメントがあります。Symfony3:ネストされた(オプションの)フォームを検証する

ユーザーは複数のOrganizerProfile(Facebookの「ページ」のようなものです)とイベントを持つことができます。

ユーザーがイベントを作成したとき、彼はイベントに「OrganizerProfile」を割り当てることができます(ユーザーAlbertoが「Company A」のイベント「イベントX」を作成します)。

OrganizerProfileType.php

class OrganizerProfileType extends AbstractType{ 
    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder 
      ->add('email', EmailType::class) 
      ->add('name', TextType::class) 
      ->add('description', TextType::class, ['required' => false]) 
... 

EventType.phpフィールド "profile_list" のユーザーで

class EventType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $profileChoices = ... //List of existing profiles 

     $builder 
      ->add('profile_list', ChoiceType::class, [ 
       'choices' => $profileChoices, 
       'required' => false, 
       'mapped' => false, 
      ]) 
      ->add('profile', OrganizerProfileType::class, [ 
       'required' => true, 
      ]) 
      ->add('title', TextType::class, ['required' => false]) 
      ->add('description', TextType::class, ['required' => false]) 
... 

これを実現するためには、私はこのフォームを作成しました既存のOrganizerProfilesを見つけることができます。ユーザはその1つを選択してイベントに割り当てることができますが、ユーザが既存のプロファイルを選択しない場合は、「プロファイル」フォームに情報を挿入する必要があります。

私は「オプション」のプロファイルフォームを作成し、ユーザーが既存のプロファイルを選択しない場合にのみ必要とします。

どうすればいいですか?ありがとう

+1

[提出されたデータに基づいて検証グループを選択する](http://symfony.com/doc/current/form/data_based_validation.html) – Matteo

答えて

0

Validation Groups Based on the Submitted Dataで実装できます。

だからあなたにformTypeは、次のようにする必要があります:

class EventType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $profileChoices = [...]; 

     $builder 
      ->add('profile_list', ChoiceType::class, [ 
       'choices' => $profileChoices, 
       'required' => false, 
       'mapped' => false, 
      ]) 
      ->add('profile', OrganizerProfileType::class, [ 
       'constraints' => [ 
        new Valid() 
       ] 
      ]) 
      ->add('title', TextType::class, ['required' => false]) 
      ->add('description', TextType::class, ['required' => false]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'validation_groups' => function (FormInterface $form) { 

       if (null === $form->get('profile_list')->getData()) { 
        return ['without_profile']; 
       } 

       return ['with_profile']; // Or simply 'Default' 
      }, 
     ]); 
    } 

} 

はUPDATE:また、他にformTypeで検証グループを使用し

次にあなたが検証グループとサブフォームの検証を処理する必要があります、例として:

class OrganizerProfileType extends AbstractType{ 

    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder 
      ->add('email', EmailType::class, [ 
        'constraints' => [ 
         new NotNull(
          [ 
           'groups' => ['without_profile', 'with_profile'] 
          ] 
         ) 
      ]]) 
      ->add('name', TextType::class, [ 
        'constraints' => [ 
         new NotNull(
          [ 
           'groups' => ['without_profile', 'with_profile'] 
          ] 
         ) 
      ]]) 
      ->add('description', TextType::class, ['required' => false]) 

・ホープこのヘルプ

+0

ありがとうございます、明日あなたのソリューションを試してみましょう!それがうまくいけば、SymfonyDayであなたにビールを提供します(もしあなたがそこにいれば)) –

+0

"Event"ドキュメントに検証グループを置くと、 "$ form-> isValid()"メソッドに到達すると正しく停止しますが、検証グループを無視して、OrganizerProfileフォームの検証を完全にスキップします。私も 'cascade_validation'で試してみましたが、まだ動作していません。 「手動検証」(検証サービスを使用し、適切なグループでOrganizerProfileフォームを検証する)でのみ機能します。標準メソッド "$ form-> isValid()"を使ってすべてのフォーム(およびサブフォーム)を検証する方法はありますか? –

+0

こんにちは@AlbertoFecchi、あなたは他のFormTypeでも検証グループを使うべきです。私の更新をチェックしてください。あなたもsfdayに会いたいと思っています:) – Matteo

関連する問題