Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2:选择字段中的字符串值未绑定到窗体对象_Php_Jquery_Forms_Symfony - Fatal编程技术网

Php Symfony2:选择字段中的字符串值未绑定到窗体对象

Php Symfony2:选择字段中的字符串值未绑定到窗体对象,php,jquery,forms,symfony,Php,Jquery,Forms,Symfony,我的应用程序包含一个带有三个选项字段/下拉列表的表单 第一个链接到实体中的“关系”字段,工作正常。 用户应该首先选择一个表链接 第二个和第三个都链接到同一实体中的字符串字段。 通过jQuery,这些选择字段将根据用户在第一个下拉列表中做出的决定填充值 提交表单后,第二个和第三个字段出现错误:它们包含无效输入。当我检查表单对象时,它们的值没有绑定;他们的价值观从未实现 用于从用户收集字符串数据的选择字段如下所示: ->add('sourceName', 'choice', array

我的应用程序包含一个带有三个选项字段/下拉列表的表单

第一个链接到实体中的“关系”字段,工作正常。 用户应该首先选择一个表链接

第二个和第三个都链接到同一实体中的字符串字段。 通过jQuery,这些选择字段将根据用户在第一个下拉列表中做出的决定填充值

提交表单后,第二个和第三个字段出现错误:它们包含无效输入。当我检查表单对象时,它们的值没有绑定;他们的价值观从未实现

用于从用户收集字符串数据的选择字段如下所示:

->add('sourceName', 'choice', array
    (
        'label' => 'Choose source name:',
        'empty_value' => 'Please choose a table link first...',
        'choices' => array(),
        'attr' => array('class' => 'extFieldChoice'),
    )
<select id="someId" name="someName[sourceName]" required="required" 
  class="extFieldChoice">
  <option value="first">first</option>
  <option value="second">second</option>
  <option value="manymore">Many more...</option>
</select>
jQuery完成其工作后,html select元素如下所示:

->add('sourceName', 'choice', array
    (
        'label' => 'Choose source name:',
        'empty_value' => 'Please choose a table link first...',
        'choices' => array(),
        'attr' => array('class' => 'extFieldChoice'),
    )
<select id="someId" name="someName[sourceName]" required="required" 
  class="extFieldChoice">
  <option value="first">first</option>
  <option value="second">second</option>
  <option value="manymore">Many more...</option>
</select>

第一
第二
还有很多。。。

我怀疑可以在最初为空的choices数组中找到错误。然而,不可能用所有可能的选择来填满它,因为它们有数百种。

几天前我也遇到了同样的问题,它让我疯狂地想找到一个解决方案,我开始问这个问题,甚至可能已经太晚了,我想分享我找到的解决方案,以防有人遇到同样的问题,我已经找到了三个,但似乎没有一个是完美的解决方案

在我的例子中,我必须保存用户根据zipCode选择的城市。当用户保存一个新地址时,他会编写zipCode,然后通过ajax我用城市选项填写城市选择

我的“选择”字段声明:

$builder->add('city', 'choice', array(
    'label' => 'form.city',
    'read_only' => true,
    'mapped' => false,
    'required' => false,
    'empty_value' => false,
    'choices' => array('none' => 'form.empty.city'),
    'data' => null
));
问题在于表单验证需要考虑两个方面:

  • 如果与某个实体相关的表单向前看该实体 要进行验证,可以使用“映射”轻松跳过此验证 =>假参数
  • 表单验证本身,如果在表单验证时定义了“选项”类型字段,其中包含或不包含选项,请查看您声明的第一个选项。我不能只跳过这个字段的验证
  • 因此,我找到了三种方法:

  • 使用form事件,在将请求绑定到表单之前(我在链接文章中有一个使用示例),我们对ajax上的数据库进行相同的查询,检索值并将其添加到chocie字段。如果我们在代码中思考,这是更好的方法,但是我们必须做两次相同的查询,我不想这样做
  • 在我的例子中,我必须存储一个带有城市名称的字符串,因此另一个选项是将城市字段添加为隐藏字段,并将整个select作为元素插入。但是我不喜欢这一个有很多原因,其中两个原因:我不喜欢在symfony2创建的其他表单字段之间插入一个洞;另一个是它需要更多jquery,这在我看来是必要的
  • 基于第二个选项,我根据用户选择的城市填写了一些其他隐藏字段,因此我只添加了一个隐藏字段来保存城市名称;提交表单时,我会从select中删除所有选项,使其与我定义的选项匹配

    $('#cityChoice').on({
        change: function(){
            var optionSelected = $(this).find('option:selected');
            $('#city').val(optionSelected.val());
            $('#latitude').val(optionSelected.data('lat'));
            $('#longitude').val(optionSelected.data('lng'));
        }
    });
    
    $('#myForm').on({
        submit: function(){
            $('#mySelect option').remove();
        }
    });
    

  • 我已经决定使用第三个选项,但我认为这三个选项都有不好的一面。

    所以在symfony 4中,我遇到了一个问题,我使用了类似
    ['string'=>'string']
    的数组。唯一对我有效的是:
    “data”=>false,
    。不要添加
    “mapped”=>false
    ,我已经在数据库中保存了这个字符串,但只有我在实体中设置为默认值的字符串。