2013-06-14 5 views
5

私はチェックボックスと「値フィールド」を含むフォームを持っています。値フィールドには、何か、テキストボックス、複合フィールド、コレクションなどがあります。兄弟(チェックボックス)フィールドに「false」が含まれている場合、検証をスキップ

フォームには、例えば、次のようになります。

field_1_label enabled [x] 
       value  [________] 

field_2_label enabled [x] 
       value  sub_field_1 [________] 
          sub_field_2 [________] 

field_3_label enabled [x] 
       value  [________] 

「有効」フィールドがtrue含まれ、すべてがすでに正常に動作します。 「有効」フィールドにfalseが含まれている場合は、の値フィールドに対する検証を無効にし、その子フィールドを使用したいと考えています。

「有効にする」チェックボックスをオフにすると、フィールドを効果的に無視します。私はまだそれをフォームに表示しますが、私はそのデータを保存せず、確かに検証したくありません。

どのように私はこれを行うかもしれないのですか?具体的には、値フィールドの可能性のある子フィールドを無視するように検証システムを設定することに問題があります。

答えて

9

http://symfony.com/doc/current/book/forms.html#groups-based-on-the-submitted-data

ですから、例えば、チェックボックスと値フィールドを含むフィールド上:は

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver 
     ->setDefaults([ 
      'validation_groups' => function(FormInterface $form) { 
       // If the form is disabled, don't use any constraints 
       if ($form->get('enabled_checkbox')->getData() == false) { 
        return false; 
       } 

       // Otherwise, use the default validation group 
       return 'Default'; 
      } 
     ]); 
} 
+0

これは2.4でも動作しますか?私はそれに問題があります。 'false'を返すことはフォームの検証を無効にするようには見えません。 – Brian

+0

私は、代わりに 'false'の代わりに空の配列を返すことで動作させることができました – Brian

2

親のチェックボックスがfalseに設定されている場合、検証の前に子フィールドを削除するだけです。

続きを読む料理本の記事How to Dynamically Modify Forms Using Form Events

form eventsFormEvents::POST_SET_DATAを購読し、サブスクライバのフィールドを削除します。

セクションAdding an Event Subscriber to a Fom classがこのトピックをカバーしています。


フォームに別のvalidation groupsを導入することもできます。

親のチェックボックスがfalseに設定されている場合は、別の検証グループ(chieldフィールドを含まない)を適用するだけです。

あなたは何の制約が適用されていない持っているvalidation_groupsに偽使用できるのSymfony 2.3では
+0

問題そのフォームを削除すると、フォームが再表示されたときにフィールドを使用できなくなります。フォーム上の他の場所に検証エラーがある場合は、「有効」チェックボックスがありますが、値フィールドはありません。検証後にフィールドを追加しない限り、フォームは壊れた状態になります。 SUBMIT/POST_SUBMIT以降、子プロセスの - > setParent(null)を呼び出すと、 '送信されたフォームから子を削除できません'という例外がスローされるため、フィールドを削除(または追加)することはできません。 – ledneb

+0

POST_BINDの代わりにPOST_SET_DATAを使用しても問題ありませんか?答えに別の可能性を追加しました。ただ検証グループを使用してください。レビューしてください。 – nifr

+0

検証はPOST_BINDとなり、事前検証を削除してフィールドをスキップする場合、POST_BINDでフィールドを再度追加する必要がありますが、これは不可能です。妥当性チェックグループに関して、それは有用かもしれないようですが、どのように妥当性を検証するためにグループを指定することができないのでしょうか?いろいろなバリデーショングループを構築すると、フォームシステムがハードコードされて「デフォルト」グループのみを検証するように見えますか?(Symfony \ Component \ Form \ Extension \ Validator \ EventListener \ ValidationListenerの55行目) – ledneb

関連する問題