【问题标题】:Symfony2: string values from choice fields not bound to form objectSymfony2:来自选择字段的字符串值未绑定到表单对象
【发布时间】:2013-01-06 17:04:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php jquery forms symfony


    【解决方案1】:

    几天前我遇到了同样的问题,它让我疯狂地寻找解决方案,我遇到了这个问题,甚至可能为时已晚我想分享我找到的解决方案,以防有人同样的问题,我找到了其中的三个,但似乎都不是完美的解决方案。

    就我而言,我必须保存用户根据邮政编码选择的城市。当用户保存一个新地址时,他编写了邮政编码,然后通过 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. 使用表单事件,在将请求绑定到表单$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();
          }
      });
      

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

    【讨论】:

    • 所以在 symfony 4 中我遇到了问题,我有像 ['string'=&gt;'string'] 这样的数组,唯一对我有用的是:"data" =&gt; false,不要添加"mapped" =&gt; false,我将字符串保存在数据库中,但只有我在实体中设置为默认值的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多