我开始调查Symfony2框架,似乎我已经搞砸了一些事情。
我想做一个相对简单的事情;根据选择框的值动态地向表单添加额外字段。让我们假设我没有将表单附加到任何实体,所以我最终想要得到的是一系列值。
所以,作为一个简单的例子,我将拥有这个控制器:
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
$form = $this->createFormBuilder(null, array('allow_extra_fields' => true))
->add('test', 'Symfony\Component\Form\Extension\Core\Type\TextType')
->add('select', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
'choices' => array(
'Maybe' => null,
'Yes' => true,
'No' => false,
),
'choices_as_values' => true,
))
->add('submit', 'Symfony\Component\Form\Extension\Core\Type\SubmitType')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
dump($form->getData());
die;
}
return $this->render('default/index.html.twig', array(
'form' => $form->createView()
));
}
/**
* @Route("/test", name="test")
*/
public function AddFieldAction(Request $request)
{
return new JsonResponse($request->get('form'));
}
视图的javascript可能是:
$('document').ready(function(){
$('#form_select').change(function(){
var form = $(this).closest('form');
var value = $(this).val();
var data = {};
data[$(this).attr('name')] = value;
$.ajax({
url: "{{ url("test") }}",
type: 'POST',
data: data,
dataType: 'json'
}).done(function (response) {
console.log(response);
if (response.select == 1) {
$('#form').append("<label> extra field </label> <input type='text' id='extra_field' name="form[extra_field]"></input>");
}
}).fail(function (jqXHR, textStatus) {
});
})
})
现在这将正确返回字段,因为这将调用AddFieldAction
并且它将在表单中添加适当的HTML。当我尝试提交表单时,在$form->isValid
部分,我可以使用$form->getData()
和$form->getExtraData()
方法获取所有提交的数据。
问题是,这是最佳方式吗?应该(并且可能)我会使用表单事件吗?我试图使用表单事件,但它变得一团糟,我很容易在PRE_SUBMIT
或PRE_SET_DATA
的层次结构中相互混淆。