2012-10-29 98 views
3

我有一些複雜的表單,有幾個子表單,我希望能夠根據主表單中選擇的單選按鈕分別驗證每個子表單。我想通過驗證組來實現這一點。我有data_class模型,我使用數組。基於已提交數據的Symfony2表單驗證組

這裏是我的形式簡化爲:

class MyType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('xxx', 'text', array(
       'constraints' => array(
        new Constraints\NotBlank(), 
       ), 
       'validation_groups' => array(
        'xxx', 
       ) 
      )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'validation_groups' => function(FormInterface $form) { 
       return array('xxx'); 
      }, 
     )); 
    } 
} 

的問題是這一領域的驗證不會被觸發。

當這個作品,我可以很容易地改變setDefaultOptions驗證所需的組根據提交的數據:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => function(FormInterface $form) { 
      $data = $form->getData(); 

      return array($data['type']); 
     }, 
    )); 
} 

任何想法?

回答

12

您必須將驗證組名稱傳遞給約束,而不是在窗體本身中。通過將組名分配給表單,您可以指定在驗證中使用哪些約束。

替換

$builder->add('xxx', 'text', array(
     'constraints' => array(
      new Constraints\NotBlank(), 
     ), 
     'validation_groups' => array(
      'xxx', 
     ) 
    )) 
; 

隨着

$builder->add('xxx', 'text', array(
     'constraints' => array(
      new Constraints\NotBlank(array(
       'groups' => 'xxx' 
      )), 
     ), 
    )) 
; 

默認情況下,約束具有 '默認'(大寫)組和形式使用此組,如果未指定進行確認。如果您希望沒有顯式組的其他約束條件得到驗證,則指定的組會傳遞'默認值'。

$resolver->setDefaults(array(
    'validation_groups' => function(FormInterface $form) { 
     $data = $form->getData(); 

     return array($data['type'], 'Default'); 
    }, 
)); 
+0

謝謝,這有幫助。但是,那麼在表單中使用的「validation_groups」是什麼? 關於默認組,可以使用常量Symfony \ Component \ Validator \ Constraint :: DEFAULT_GROUP。 – umpirsky

+0

它用於指定組進行驗證。例如,您可以將常規驗證組傳遞到主窗體並在子窗體中覆蓋組。字段形式(例如文本,選擇)與主表單相同(例如主題中的MyType表單)。 –

+0

對,清楚。非常感謝您的答覆! – umpirsky