Symfony2在onChange发生时动态添加字段

时间:2016-10-08 12:07:07

标签: symfony symfony-forms

我开始调查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_SUBMITPRE_SET_DATA的层次结构中相互混淆。

0 个答案:

没有答案