2012-05-18 32 views
1

可能重複:
Validate a field depending on another field value in SymfonySymfony的形式框架:驗證表單字段取決於別人的Fileds值

我怎樣才能取消設置,即,一些表單字段命名爲A式B當單選按鈕R被檢查? 我想通常配置這些A/B字段的驗證器,但如果單選按鈕R被選中(例如,設置A和B爲所需字符串但在R時驗證它們,則跳過對它們的驗證器的檢查(並取消設置它們的值)即使它們是空的也被檢查)。

我試圖重寫doBind功能,使用前/後驗證,但我繼續接受「必要」的消息

謝謝!

+0

其中Symfony的版本? – j0k

+0

Symfony v1.4.17 – Daniele

+1

你已經檢查過[這個答案](http://stackoverflow.com/questions/6441982/validate-a-field-depending-on-another-field-value-in-symfony)? – j0k

回答

3

這是一個正確的操作。我發現answers一個couple並做到這一點的最好的地方就是覆蓋bind功能,重新定義取決於值從表單驗證的選項(以禁用所需選項或刪除驗證):

public function bind(array $taintedValues = null, array $taintedFiles = null) 
{ 
    if($taintedValues["method"] == 'phone') 
    { 
    // disabled required 
    $this->validatorSchema["email"]->setOption('required', false); 
    } 
    else 
    { 
    // remove the validator 
    $this->validatorSchema['other_field'] = new sfValidatorPass(); 

    // and disabled required 
    $this->validatorSchema["phone"]->setOption('required', false); 
    } 

    return parent::bind($taintedValues, $taintedFiles); 
} 
+0

我找了幾個小時沒有找到任何解決方案.. 但是,至於doBind方法,如果我不顯式調用'bind',它不會被調用。有理由嗎?它應該被稱爲.. – Daniele

+0

你應該明確地調用bind函數來驗證你的表單(即:在你的行爲中),[見本文檔](http://www.symfony-project.org/gentle-introduction/1_4/EN/10-形式#chapter_10_sub_form_handling_with_data_validation)。 – j0k

+0

確實,主要形式A的綁定在行動中被調用。通過這種方式,表單A和每個子表單B和C都被驗證。 但是現在我正在嘗試上面所說的,所以在子窗體B中,我重寫了'bind'函數。在這種情況下,我認爲'綁定'會自動再次被調用(但使用覆蓋)但它不會發生。但是,也顯式調用'B-> bind'到'A-> doBind'中,問題沒有解決。我的'B-> bind'函數是按照你的例子構建的,只添加了未設置的值。 然後,這是doBind和綁定之間的區別? 感謝您的幫助 – Daniele