Symfony2:未绑定到表单对象的选择字段的字符串值

时间:2013-01-23 09:11:52

标签: php jquery forms symfony

我的应用包含一个包含三个选项字段/下拉列表的表单。

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

第二个和第三个都链接到同一实体中的字符串字段。 通过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>

我怀疑错误可以在最初为空的选择数组中找到。然而,要填写所有可能的选择是不可能的,因为它们可以运行数百个。

1 个答案:

答案 0 :(得分:2)

我前几天遇到了同样的问题,这让我很难找到解决方案,我遇到了这个问题,甚至可能为时已晚,我想分享我所提出的解决方案发现万一有同样问题的人,我找到了其中三个,但似乎没有一个是完美的解决方案。

在我的情况下,我必须根据zipCode保存用户选择的城市。当用户保存一个新地址时,他会用zipCode表示,然后通过ajax我用城市选项填写城市选择。

我的选择&#34;现场声明:

$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. 如果与实体相关的表格期待该实体 要验证,您可以使用&#34;映射&#34;轻松地跳过此验证。 =&GT;假参数。
  2. 表单验证本身,如果您有一个&#34;选择&#34;当表单验证看向您声明的第一个选项时,是否定义了有或没有选择的字段。我还没有能够跳过这个领域的验证。
  3. 所以我找到了三种方式:

    1. 使用表单事件,然后在将请求绑定到表单$builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($xxx) { ...});之前(我在链接文章中有一个使用示例),我们对我们在ajax上创建的数据库进行相同的查询,我们检索值并将它们添加到chocie字段中。如果我们在代码中考虑这是更好的方法,但我们必须做两次相同的查询,而我不想这样做。
    2. 在我的情况下,我必须存储一个带有城市名称的字符串,因此另一个选项是将城市字段添加为隐藏字段并将整个选择作为元素插入。但是我不喜欢这个,其中有两个:我不喜欢在symfony2创建的其他表单字段之间插入一个洞的想法;另一个是,从我的角度来看,它需要更多的jquery,这是必要的。
    3. 根据第二个选项,我根据用户所做的城市选择填写其他一些隐藏字段,所以我只添加一个隐藏字段来保存城市名称;当表单被提交时,我从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();
          }
      });
      
    4. 我已经决定采用第三种选择,但我认为其中三种选择都不好。