2012-10-24 27 views
0

什麼是暫時禁用表單驗證器的最佳方法。考慮以下在表單上禁用驗證器以添加無javascript腳本的表單

MyController.php

$builder = $this->createFormBuilder() 
      ->add('parentfield1') 
      ->add('parentfield2') 
      ->add('children', 'collection', array('type' => new ChildType(), 'allow_add' => true)); 

$form = $builder->getForm(); 

if ($request->request->get('addb')) { 
    $formReq = $request->request->get('form'); 

    $formReq['children'][] = array(
     'child_id' => '1', 
     'childfield1' => '', 
     'childfield2' => '' 
    ); 



    $request->request->set('form', $formReq); 

    // I would like to disable validators here somehow 
    $form->bindRequest($request); 
} elseif ($request->request->get('sendb')) { 
    $form->bindRequest($request); 

    // persist form to database 
} 

所以在我的形式我有兩個不同的按鈕: SENDB - 這帖子的形式,驗證它並持續到數據庫 ADDB - 剛剛張貼的形式,並增加了添加子項,而無需調用驗證

新領域目前我可以確認團組做到這一點:

$validationGroups = array(); 
if($request->request->get('addb')) { 
    // I just use group not defined in entity for any validators 
    $validationGroups[] = 'novalidation'; 
} 

$builder = createFormBuilder(new ParentEntity(), array('validation_groups' => $validationGroups)); 

這有效,但這也意味着代碼重複,因爲symfony2只允許將驗證器傳遞到表單構建器構造函數,並且我必須檢查request-> get('addb')兩次。

我知道添加子窗體字段也可以用javascript(集合原型選項)來完成,但我想讓它在沒有javascript的情況下工作。

回答

0

您可以根據setDefaultOptions方法中提交的數據動態設置驗證組。見here

+0

謝謝。我知道可以指定closure作爲validation_groups的值,但我真的沒有看到它有助於避免兩次檢查請求類型,也許我錯過了一些東西。但我意識到我至少可以避免通過引入變量兩次硬編碼請求參數: '$ isAddReq = $ request-> request-> get('addb');' 並通過此變量進行檢查。 仍然對其他可能的選項感興趣。 – realmer

+0

您可以在'FormEvents :: PRE_BIND'事件上添加一個偵聽器,並將您的字段添加代碼移到那裏。請參閱[這裏](http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html)瞭解更多信息。 –