2011-12-22 159 views
3

我正在尝试使用表单类添加&编辑。在添加模式下,需要iconFile。在编辑模式下,iconFile是可选的(以替换当前图标)。我该如何实现这个目标?Symfony 2表单验证组

我试图在构造

class ItemForm extends AbstractType { 
    public function __construct($mode) { 
     $this->mode = $mode; 
    } 

    public function getDefaultOptions(array $opts) { 
     if ($mode == 'add') { 
      return array('validation_groups' => array('Default', 'add')); 
     } else { 
      return array('validation_groups' => array('Default')); 
     } 
    } 
} 

// doctrine entity, data_class of form 
class Item { 
    /** 
    * @Assert\NotBlank(groups={"add"}) 
    * @Assert\Image 
    */ 
    protected $iconFile; 
} 

// creating the form in controller 
$form = $this->createForm(new ItemForm($mode)); 

问题是,即使在编辑模式设置的模式,我还需要选择一个图像。 HTML5验证触发

回答

4

在你ItemForm构造函数中,要设置$mode$this->mode,但你尝试从getDefaultOptions()访问$mode$mode显然没有这个范围内的存在 - 尝试更改为以下:

public function getDefaultOptions(array $opts) { 
    if ($this->mode == 'add') { 
     return array('validation_groups' => array('Default', 'add')); 
    } else { 
     return array('validation_groups' => array('Default')); 
    } 
} 
0

你可以这样做:

public function setDefaultOptions(OptionsResolver\OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'LIG\Bundle\UserBundle\Entity\User', 
     'validation_groups' => function(Form\FormInterface $form) { 
      $data= $form->getData(); 
      if($data->getId()) 
      { 
       return array('Default', 'Edit'); 
      } 
      else 
      { 
       return array('Default', 'Add'); 
      } 
     }, 
    )); 
}