在编辑现有的“实体”时,我提交表单(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中的选择顺序会影响我可以修改的值:具体来说,如果我发送的值低于选择列表中的当前值,则无法更改类型
答案 0 :(得分:0)
最后,由于时间不足,我放弃了ChoiceType ['expanded' => true]
(单选按钮),换成了简单的ChoiceType
(选择列表),就解决了这个问题。
我没有解释最初的问题。
答案 1 :(得分:0)
问题与PATCH有关,并且扩展的字段具有未在PATCH上正确更新的子字段。这将导致两个活动子字段(新字段和旧字段),然后这两个字段中的第一个获胜。我昨天碰到了那件事,这让我发疯。现在,我意识到我已经有了一个简单的答案,可以解决这个问题:https://stackoverflow.com/a/46056461/2564552