【问题标题】:Symfony2 Form becomes invalid on submit when I am trying to append new elements in form当我尝试在表单中附加新元素时,Symfony2 表单在提交时变得无效
【发布时间】:2015-11-03 19:26:26
【问题描述】:

我在表单中添加了一个按钮添加部分。当用户单击该按钮时,它会打开一个提示窗口。提示窗口询问部分 id 之后,它调用 ajax 以从数据库中获取部分数据并使用相应的字段创建部分表单然后我将该子表单(即部分表单)附加到现有表单。但是当我提交表单时,symfony 会抛出错误,该表单无效。所以基本上symfony表单不接受新创建的子表单附加到现有表单

这就是我在 symfony 控制器中向表单添加按钮的方式

 $formBuilder-> add('new_sections','hidden',array())
  ->add('add','button', array(
        'label' => 'Add Section',

    ))

在 twig 文件中,Jquery 将新字段附加到按钮单击上的现有表单

 $('#form_add').click(
        function(){
            var section_id = prompt("Please enter your Section ID");
            console.log(section_id);
            $.ajax({url: url, success: function(result){

                var new_section_form ='' +
                        '<div style="border-style: solid; margin-top: 15px; border-radius: 3px; border-width: 1px; padding: 10px;">'+
                        '<label class="required">'+result['section']['section_id']+'</label>'+
                '<div id="form_'+result['section']['section_id']+'" class="SectionForms">'+
                 '       <div><label for="form_'+result['section']['section_id']+'_weight'+result['section']['section_id']+'">Weight </label><input type="text" id="form_'+result['section']['section_id']+'_weight'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][weight'+result['section']['section_id']+']" value="0"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_label'+result['section']['section_id']+'" class="required">label </label><input type="text" id="form_'+result['section']['section_id']+'_label'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][label'+result['section']['section_id']+']" required="required" value="Text Description v2"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_active'+result['section']['section_id']+'" class="required">Active </label><input type="text" id="form_'+result['section']['section_id']+'_active'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][active'+result['section']['section_id']+']" required="required" value="1"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_link'+result['section']['section_id']+'">Link </label><input type="text" id="form_'+result['section']['section_id']+'_link'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][link'+result['section']['section_id']+']"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_events_max'+result['section']['section_id']+'">events_max </label><input type="text" id="form_'+result['section']['section_id']+'_events_max'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][events_max'+result['section']['section_id']+']"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_events_min'+result['section']['section_id']+'">events_min </label><input type="text" id="form_'+result['section']['section_id']+'_events_min'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][events_min'+result['section']['section_id']+']"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_module'+result['section']['section_id']+'">module</label><input type="text" id="form_'+result['section']['section_id']+'_module'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][module'+result['section']['section_id']+']"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_module_icon'+result['section']['section_id']+'">module_icon </label><input type="text" id="form_'+result['section']['section_id']+'_module_icon'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][module_icon'+result['section']['section_id']+']" value="icon_generic"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_module_id'+result['section']['section_id']+'">module_id </label><input type="text" id="form_'+result['section']['section_id']+'_module_id'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][module_id'+result['section']['section_id']+']"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_apicall'+result['section']['section_id']+'">apicall </label><input type="text" id="form_'+result['section']['section_id']+'_apicall'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][apicall'+result['section']['section_id']+']" value="1"></div>'+
                '<div><label for="form_'+result['section']['section_id']+'_template_static'+result['section']['section_id']+'">template_static </label><input type="text" id="form_'+result['section']['section_id']+'_template_static'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][template_static'+result['section']['section_id']+']"></div>'+

                '<input type="hidden" id="form_'+result['section']['section_id']+'_changed'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][changed'+result['section']['section_id']+']" class="changedField" value="2">'+
                 '       <div><button type="button" id="form_'+result['section']['section_id']+'_delete_'+result['section']['section_id']+'" name="form['+result['section']['section_id']+'][delete_'+result['section']['section_id']+']" class="btn-delete">Delete Section No. '+result['section']['section_id']+'</button></div>'+
                '</div>'+
                '</div>'


                $('.SectionForms').last().parent().after(new_section_form);
                $('#form_new_sections').val($('#form_new_sections').val()+" "+result['section']['section_id']);

            }});
        });

但是当我提交表单时,它没有进入表单有效块

 if ('POST' === $request->getMethod()) {

        $form->handleRequest($request);

        if ($form->isValid()) {
        // not entering in this block
        }
        }

【问题讨论】:

  • 表单中是否有隐藏的令牌字段被意外替换? Symfony2 中是否对此表单进行了验证,如果有,验证规则是什么?试试 Form::getErrorsAsString() 看看出了什么问题。
  • 请贴出与此问题相关的代码。
  • 这就是我在 symfony 控制器 $formBuilder 中向表单添加按钮的方式 -> add('new_sections','hidden',array( )) ->add('add','button' , array( 'label' => '添加部分', ))
  • 在 twig 文件中,Jquery 将新字段附加到按钮上的现有表单单击 $('#form_add').click( function(){ var section_id = prompt("请输入您的部分 ID "); $.ajax({url: url, success: function(result){ var new_section_form = //一些 html 代码 $('.SectionForms').last().parent().after(new_section_form); $( '#form_new_sections').val($('#form_new_sections').val()+" "+result['section']['section_id']); }}); });
  • 首先,您应该在您的问题中 发布您的代码,这样人们就不必猜测解决方案了。其次,您可能只是没有允许添加集symfony.com/doc/current/reference/forms/types/…

标签: javascript php jquery forms symfony


【解决方案1】:

从 Symfony 2.6 开始,您可以通过将其添加到表单选项来消除此错误:

'allow_extra_fields' => true,

更多信息请见here

【讨论】:

  • 但我使用的是 Symfony 2.3。
  • 我建议你升级,不是很困难
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多