我的应用程序包含一个包含三个选择字段/下拉列表的表单。
第一个链接到实体中的"关系"字段,并且工作正常。用户应该首先选择一个表链接。
第二个和第三个都链接到同一实体中的字符串字段。通过 jQuery,这些选择字段根据用户在第一个下拉列表中做出的决定填充值。
提交表单后,第二个和第三个字段出现错误:它们包含无效的输入。当我检查表单对象时,它们的值没有绑定;他们的价值观从未到来。
用于从用户收集字符串数据的选择字段如下所示:
->add('sourceName', 'choice', array
(
'label' => 'Choose source name:',
'empty_value' => 'Please choose a table link first...',
'choices' => array(),
'attr' => array('class' => 'extFieldChoice'),
)
jQuery完成它的工作后,html select元素看起来像这样:
<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>
我怀疑可以在最初的空选择数组中找到错误。但是,不可能用所有可能的选择来填充它,因为它们有数百个。
几天前我遇到了同样的问题,这让我发疯寻找解决方案,我得到了这个问题,甚至可能为时已晚我想分享我找到的解决方案,以防有人遇到同样的问题,我找到了其中的三个,但似乎没有一个是完美的解决方案。
就我而言,我必须保存用户根据邮政编码选择的城市。当用户保存新地址时,他写了邮政编码,然后通过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
));
问题是表单验证会寻找两件事:
- 如果与实体相关的表单向前看实体要进行验证,您可以使用"映射"轻松跳过此验证=> 假参数。 表单验证
- 本身,如果您有一个"选择"类型字段,在表单验证时定义了或没有定义选项,则查看您声明的第一个选项。而且我无法跳过仅此字段的验证。
所以我找到了三种方式:
- 使用表单事件,在将请求绑定到表单之前 $builder->addEventListener(FormEvents::P RE_BIND, function (DataEvent $event) use ($xxx) { ...});(我在链接的文章中有一个使用示例)我们对在 ajax 上进行的数据库进行相同的查询,我们检索值并将它们添加到 chocie 字段中。如果我们在代码中思考,这是更好的方法,但我们必须执行两次相同的查询,我不想这样做。
- 就我而言,我必须存储一个带有城市名称的字符串,因此另一种选择是将城市字段添加为隐藏字段,并将整个选择作为元素插入。但是我不喜欢这个有很多原因,其中两个:我不喜欢插入一个洞的想法,在symfony2创建的其他表单字段之间;另一个是它需要更多的jQuery,从我的角度来看,这是必要的。 基于第二个选项,我
根据用户所做的城市选择填写了一些其他隐藏字段,所以我只包含一个隐藏字段来保存城市名称;提交表单时,我从选择中删除所有选项,因此它与我定义的选项相匹配。
$('#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(); } });
我已经决定第三种选择,但我认为他们三个都有不好的一面。