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的情況下工作。
謝謝。我知道可以指定closure作爲validation_groups的值,但我真的沒有看到它有助於避免兩次檢查請求類型,也許我錯過了一些東西。但我意識到我至少可以避免通過引入變量兩次硬編碼請求參數: '$ isAddReq = $ request-> request-> get('addb');' 並通過此變量進行檢查。 仍然對其他可能的選項感興趣。 – realmer
您可以在'FormEvents :: PRE_BIND'事件上添加一個偵聽器,並將您的字段添加代碼移到那裏。請參閱[這裏](http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html)瞭解更多信息。 –