不要不理解为什么未正确提交扩展的ChoiceType值

时间:2019-04-10 08:57:30

标签: php symfony

在编辑现有的“实体”时,我提交表单(handleRequest()时,我的ChoiceType扩展的值未正确提交:$ request包含正确的值,但是$ form-> getData( ) 别。 换句话说,如果在此字段上已经设置了默认值,则无法更新它。

我在 Symfony 3.4.15 上,在与API通信的客户端应用程序上。 我这边没有任何实体,我只是在API上获取资源并在数组上工作。

我对表单验证没有任何问题。为确保其正常工作,我尝试定义“选择”选项中不存在的值,并且出现错误。

我已经找到了一种通过将“数据”选项设置为false来理解此问题的方法。这解决了发送值时的问题,但是在初始化表单时我没有更多的恢复原始值。

这是我的表格:

//OrdersItemsType class

public function buildForm(FormBuilderInterface $builder, array $options
{
    $builder
        ->add('type', ChoiceType::class, [
            'label' => 'label.type',
            'choices' => [
                'label.total' => 'total',
                'label.simple_partial' => 'simple_partial',
                'label.complex_partial' => 'complex_partial'
            ],
            'expanded' => true,
            'multiple' => false,
            'empty_data' => 'total' //comment or uncomment this line don't change anything
        ])
    ;
}

public function getBlockPrefix()
{
    return 'form_name';
}

在我提交表单时,请注意以下几行:

dump($customFormData);

$form = $this->createForm(OrdersItemsType::class, $customFormData, [
    'method' => 'PATCH'
]);

if ($request->isMethod('PATCH') && $form->handleRequest($request)->isValid()) {
    dump($request->request->all());
    dump($form->getData());
    exit;
}

这里是$ customFormData的转储:

array:2 [
  "form_name" => [
    "type" => "simple_partial"
  ]
]

这里是$ request-> request-> all()的转储:

array:2 [
  "_method" => "PATCH"
  "form_name" => [
    "_token" => "my_valid_token"
    "type" => "complex_partial"
  ]
]

这里是$ form-> getData()的转储:

array:2 [
  "form_name" => [
    "type" => "simple_partial"
  ]
]

我希望在初始化表单以进行预填充时拥有$customFormData值(实体的实际值),并在提交表单时获得$request值(就像表单应该可以正常工作,并且在其他字段上也可以很好地工作),但实际上我无法更新此扩展的ChoicesType。

  

编辑:经过更多测试,我可以这样说:

     
      
  • 如果type最初是"total",我根本无法更改。
  •   
  • 如果type最初是"simple_partial",我可以将其更改为"total",但不能更改为"complex_partial"
  •   
  • 如果type最初是"complex_partial",我可以将其更改为   "total""simple_partial"
  •   

_

  

Edit2:经过进一步的测试,我发现ChoiceType中的选择顺序会影响我可以修改的值:具体来说,如果我发送的值低于选择列表中的当前值,则无法更改类型

2 个答案:

答案 0 :(得分:0)

最后,由于时间不足,我放弃了ChoiceType ['expanded' => true](单选按钮),换成了简单的ChoiceType(选择列表),就解决了这个问题。

我没有解释最初的问题。

答案 1 :(得分:0)

问题与PATCH有关,并且扩展的字段具有未在PATCH上正确更新的子字段。这将导致两个活动子字段(新字段和旧字段),然后这两个字段中的第一个获胜。我昨天碰到了那件事,这让我发疯。现在,我意识到我已经有了一个简单的答案,可以解决这个问题:https://stackoverflow.com/a/46056461/2564552