使用viewData值而不是ModelData手动设置表单数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用viewData值而不是ModelData手动设置表单数据相关的知识,希望对你有一定的参考价值。
用Symfony 3疯了。
问题是:将值设置为Symfony表单的正确方法是什么,只需设置viewData而不是modelData,表单将处理转换?
......带有小捕获:没有通常的形式/请求创建和处理。 :)
像(假设我们在DB中设置一个DateTime字段):
$form = $this->createForm(ProperForm::class, $existingData);
$form->setPlainScreenFormattedData('myDateField', '11/29/2016');
哪个会将给定的日期转换为正确的 Datetime对象,并在表单中很好地设置它?
示例和说明:
我正在使用一个包来内联编辑html表数据(Tabledit),并且必须保留该包(由于时间/空间问题)。它将以下数据(通过ajax)发送到服务器:
- 表单字段的名称
- DB中数据的ID
- 要保留给DB的新值
这一切都很好,并且与保存控制器一起使用 - 只要它与纯文本数据一起使用。当您尝试使用它更改EntityType或某个Datetime字段时 - 它会中断。它打破了,因为我尝试将一个简单的屏幕格式化值设置为表单的形式或底层对象。
为了防止破坏,仍然有一个一对一的解决方案,我尝试了各种形式的创建给定的表单并使用,例如:
- $form->get($field)->setData($value)
- $form->setData([$field => $value)])
- $form->getData()->AProperFieldSetterName($value)
更多(如here),但没有一个工作,因为基本上,所有这些都期望$ value是一个modelData(就像它说的here)。
我的推理
我不想为此创建新的数据转换器 - 因为它们已经存在,Symfony知道这种形式及其底层对象结构。此外,我不想更改现有解决方案,并停止向控制器发送单个字段以进行更新。
我可以通过创建一些手动调用DB来解决这个问题,首先根据给定的ID(如$em->getRepository('somerepo')->find($value)
(对于实体),或者手动创建Datetimes,然后将其提供给表单)为每个字段获取正确的水合对象,但是这一切似乎都不好,并且使现有功能翻倍。
有没有一种简单的方法来进行数据转换?感觉应该有一个。或者我是否走得太远非Symfony方式而迷路了?
我想你可以用SymfonyComponentFormFormInterface::submit
做到这一点
以上是关于使用viewData值而不是ModelData手动设置表单数据的主要内容,如果未能解决你的问题,请参考以下文章
模型伪造查看器中缺少 Autodesk.AEC.ModelData