2017-05-16 10 views
1

emailなどのフィールドを持つフォームがあります。このemailフィールドは必須であり、一意である必要があります(制約があります)。すでに存在する電子メールアドレスを入力すると、フォームバリデーターは「この電子メールアドレスはすでに使用中です」と返します。それはokeyですが、フォームが発生したときにフォームを変更するには、固有の電子メール検証をスキップして有効なフォーム(送信時)を許可する新しいボタン「Invite」を追加します。特定の検証がトリガーされたときにフォームを動的に変更

私はこれらの公式のトピック読み

マイルストーン:

  1. は、電子メールの検証がトリガされた動的フォームに "招待" ボタンを追加します。 。
  2. [招待]ボタンをクリックしたときの電子メールの検証を省略します。

最初のポイントを達成する方法を理解できません。検証制約がトリガされたときに動的にフォームを変更する方法

$resolver->setDefaults([ 
    'validation_groups' => function (FormInterface $form) { 
     if ($form->has('invite') && $form->get('invite')->isClicked()) { 
      return false; //or ['invite'] if I want to keep other constraints 
     } 

     return ['Default']; 
    }, 
]); 

:しかし、私は2番目のポイントは、このような何かを行うことができると思いますか?

ありがとうございました!

+0

なぜ 'email'フィールドに' EmailUnique'制約があり、それで2回目の送信でそれをスキップするのですか?あなたが本当に必要がなければ、それを使わないでください。 –

+0

@gp_sfloverこの新しいボタン "Join"はオプションで、ボタンがたくさんあるので、私は決定を下し、 "Join"ボタンを表示するための制約が必要です。 – presto

+0

これはウィザード形式ですが、関連する情報のみを表示しています – presto

答えて

2

ここで大きな問題はフォーム検証プロセスです。ルートフォームが送信された直後(FormEvents::POST_SUBMIT)、に送信されたフォームに子を追加することはできません。

しかし、あなたは(FormEvents::SUBMITForm::submit()方法は、モデルとビューのデータに正規化されたデータをバックに変換する直前に手動で電子メールのフィールドを検証することができ、このような何か:

$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) { 
    $errors = $this->validator->validate($event->getForm()->getData(), null, ['unique_email']); 

    if (1 === $errors->count()) { 
     $event->getForm()->add('invite', SubmitType::class, [ 
      // Point 2: 
      // change the validation group depending on 
      // which button is used to submit the form. 
      'validation_groups' => 'invite', 
     ]); 
    } 
}); 

validatorを注入することを確認しますフォームへのサービスとvalidate()メソッドの第3引数(groupsが)だけのユニークな制約をチェック注意し、したがって、あなたは定義にこれを追加する必要があります

@UniqueEntity("email", groups={"unique_email"}) 

ポイント2を終了するには、email制約にinvite検証グループを含めないでください。

+0

ああ!あなたは私の週を救った人:)ありがとう、ちょうど私が必要なもの! – presto

関連する問題