2012-01-24 79 views
2

在我的表格中,我有entity類型的字段。如何在提交表單時禁用該實體的驗證?這個實體已經存在於數據庫中,所以驗證者沒有必要從我的角度驗證這個實體。Symfony2中的實體表單字段和驗證?

編輯:

代碼如下所示:

class SearchRequest 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="ArticlePattern") 
    * @ORM\JoinColumn(name="article_pattern_id", onDelete="CASCADE") 
    * @Assert\NotBlank 
    */ 
    private $articlePattern; 
} 

表單字段:

$builder 
    ->add('articlePattern', 'entity', array('class' => 'LonbitItssBundle:ArticlePattern') 

驗證組將無法工作,因爲我想要做到的是爲驗證程序檢查$articlePattern字段上的約束@Assert\NotBlank,但我不希望他檢查在c中定義的約束lass ArticlePattern。換句話說,我想阻止驗證器在$ articlePattern對象內下降,但我希望驗證放置在$ articlePattern字段本身上的約束。

任何想法如何做到這一點?

EDIT2:

確認團組將工作。所以,最終的解決方案是增加groups={"search_request"}約束選項(該組的名稱是任意的),以每場斷言在SearchRequest類,像這樣:

/** 
* @Assert\NotBlank(groups={"search_request"}) 
*/ 
private $articlePattern; 

這樣,驗證不會下降到關聯的對象(假設他們不屬於 - 在這種情況下 - 「search_request」組)。

+0

將字段設置爲「disabled」或「readonly」怎麼辦? – jere

回答

4

1)如果你想禁用此字段,只是不要在你的班級形式使用它! (從模板中刪除它)

public function buildForm(FormBuilder $builder, array $options) 
{ 
     $builder 
      ->add('content') 
      ->add('username') 
      //->add('yourEntity') 
     ; 
} 

2)或者更好,使用validation groups。您創建一個validation_group不打電話給你驗證實體,然後使用該組中的類形式:

public function getDefaultOptions(array $options) 
{ 
     return array(
      'data_class' => 'Sybio\BuzzBundle\Entity\SearchRequest', 
      'csrf_protection' => true, 
      'csrf_field_name' => '_token', 
      'intention'  => '865c0c0b4ab0e063e5caa3387c1a8741', 
      'validation_groups' => array('without_article_pattern_ckecking'), 
     ); 
} 

在你的實體類:

/** 
* @ORM\ManyToOne(targetEntity="ArticlePattern") 
* @ORM\JoinColumn(name="article_pattern_id", onDelete="CASCADE") 
* @Assert\NotBlank(
* groups={"without_article_pattern_ckecking"} 
*) 
*/ 
private $articlePattern; 

你的形式將只驗證是指驗證到without_article_pattern_ckecking組,因此如果它們沒有此驗證組,它就不應該在ArticlePattern實體內測試驗證器。

我希望這可以幫助你!

+0

正如我寫的,我想在表單中包含這個字段,所以validation_groups可能是答案。我會查一下。 – JohnM2

+0

我很害怕它不是它。我在我的問題中包含了代碼和一些解釋。 – JohnM2

+0

通常,通過這樣做: /** * @ORM \多對一(targetEntity = 「ArticlePattern」) * @ORM \ JoinColumn(名稱= 「article_pattern_id」,onDelete = 「層疊」) * @assert \ NotBlank ( * groups = {「without_article_pattern_ckecking」} *) */ private $ articlePattern; 在窗體類: 「validation_groups」 =>陣列(「without_article_pattern_ckecking」), 您的形式將只驗證是指without_article_pattern_ckecking組驗證,所以應該不是你的ArticlePattern實體內部測試驗證,如果他們沒有這個驗證組:o! – Sybio