2013-01-23 33 views
0

我的应用程序中包含一种形式有三个选择字段/下拉列表。Symfony2的:从选择字段字符串值未绑定到表单对象

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

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

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

回答

2

我前几天已经同样的问题,这我发疯找到一个解决方案,我得到这个问题,甚至可能为时已晚,我想分享我在案例中发现就会有解决办法有同样问题的人,我发现了其中三个,但他们中没有一个似乎是完美的解决方案。

在我来说,我要救通过基于邮政编码的用户选择的城市。当用户保存一个新地址时,他会提示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 
)); 

的问题是,表单验证一下两件事情:

  1. 如果它与实体相关的形式期待的实体 到验证,您可以使用“映射的” => false参数轻松地跳过此验证。
  2. 表单验证本身,如果您有一个“选择”类型字段有或没有选择定义时,表单验证看看你已经声明的第一个选择。而且我一直没有能够跳过只有这个领域的验证。

于是三种方式,我发现:

  1. 使用磨片绑定请求的形式$builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($xxx) { ...});(我在链接的文章使用的例子),我们做出同样的前形式的活动,查询我们在ajax上创建的数据库,我们检索这些值并将它们添加到chocie字段中。如果我们在代码中思考,这是更好的方法,但我们必须执行相同的查询两次,而我不想这样做。
  2. 在我的情况下,我必须存储一个字符串与城市名称,所以另一个选项是添加城市领域作为一个隐藏的,并插入整个选择作为一个元素。但我不喜欢这个的原因有很多,其中的两个:我不喜欢插入孔中,并受Symfony2中创建的其他表单字段之间的想法;另一种是,它需要更多的jQuery的,它是从我的角度来看必要的。
  3. 基于第二个选项,我被灌在用户做出基于城市选择一些其他的隐藏字段,所以我只包括一个或多个隐藏字段救市的名称;当形式submited我删除从选择的所有选项,所以我定义的选择相匹配。

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

我已经决定了第三种选择,但我觉得他们三个有不利的一面。

相关问题