php - Symfony2 : string values from choice fields not bound to form object

标签 php jquery forms symfony

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

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

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

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

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

->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 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
));

问题在于表单验证会寻找两件事:

  1. 如果表单与某个实体相关,则向前查找该实体 要进行验证,您可以使用“映射”轻松跳过此验证 => 错误参数。
  2. 表单验证本身,如果您有一个“选择”类型字段,无论是否定义了选择,表单验证都会查看您声明的第一个选择。而且我无法仅跳过此字段的验证。

所以我找到了三种方法:

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

    $('#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();
        }
    });
    

我决定采用第三种选择,但我认为他们三个都有不好的一面。

关于php - Symfony2 : string values from choice fields not bound to form object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475978/

相关文章:

php - MySQL 到 Codeigniter Active Record 删除重复记录

javascript - 使用jquery使对象在给定的时间和日期实时可见

PHP MySQL 将信息从一个表单插入到多个表中

javascript - 单击按钮时,循环遍历文本框 javascript

javascript - OnSubmit 返回在 Safari 中不起作用

forms - 模板渲染过程中抛出异常一个表单只能提交一次

php - 如何将一行的主键插入到它的另一列中?

php - SELECT、SELECT COUNT 和交叉引用表是否可以仅由一个查询处理?

php - 使用 array_keys() 进行插入

jQuery:使用悬停一次滚动多个图像