2014-04-28 49 views
3

我有一個嵌入式表格(對於Address),它有各自屬性的驗證。我將此表單嵌入到父表單中(對於Person),並且在父表單上有一個複選框,上面寫着「Person has a address?」之類的東西。有條件地禁用驗證嵌入式表格

當取消選中該複選框時,我想要禁用嵌入式Address表單的所有驗證。或者,更好的是,如果我可以將嵌入式表單完全提交,那也可以。

我看着使用驗證組,但用例與我自己不匹配。

回答

1

好的,想通了。當添加在我的表單生成的AddressType嵌入形式,我只是通過在選項確認團組,像這樣:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     $form = $event->getForm(); 
     $form->add('address', new AddressType(), array(
      'label' => 'Address', 
      'validation_groups' => function (FormInterface $form) { 
       if ($form->getParent()->get('toggleAddress')->getData() === false) { 
        return array(); 
       } 
       return array('Default'); 
      } 
     )); 
    }); 

在驗證組功能,進行檢查,看是否切換,使地址處於關閉狀態。如果是這樣,返回一個空數組,並刪除所有驗證組,包括「默認」組。

0

你試圖用驗證組來解決你的問題,它不會覆蓋你的用例(它可以但會很棘手,因爲空Address對象將鏈接到你的Person對象)。

基本上,您每次都會嵌入您的Address表單,而只有在複選框被選中時纔會嵌入。恕我直言,你應該依靠動態形式解釋here

使用此解決方案,您需要額外的JS代碼才能更新表單,當您單擊複選框以相應地更新整個表單時。然後,將不會有任何驗證問題,因爲地址對象只會在表單嵌入時創建。

此外(僅供參考),您可以根據提交的數據添加/編輯驗證組,如解釋here所述。

希望我的回答很有幫助!

+0

是的,我希望不必有條件地添加嵌入的表單,如果可能的話。我喜歡向用戶展示表單,但將這些字段變灰。我會考慮這種方法,雖然 – Brian

+0

在這種情況下,你應該混合我的兩個主張。依賴於驗證部分提交的數據的動態驗證組,並生成嵌入表單爲禁用,以便在後端禁用它,因此,如果禁用它,則不考慮提交的數據。無論如何,如果禁用了空白地址對象(可能由於數據庫限制而需要),您將需要更新底層對象以刪除空的地址對象。我公開給你的所有內容都可以通過表單組件中的事件來實現。 – egeloen