2011-12-22 192 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'); 
      } 
     }, 
    )); 
}