我无法理解为什么Symfony会这样做。
假设我有UserFormType类
->add(username);
->add(datecreated);
现在我没有在我的模板中显示dateCreated,然后symfony将DateCreated
设置为覆盖数据库值的null
。
我想知道将该值设置为null时的问题是什么,如果它不在模板中则只有原始值
答案 0 :(得分:1)
从documentation:Additionally, if there are any fields on the form that aren't included in the submitted data, those fields will be explicitly set to null.
,您必须渲染所有字段,否则将设置为空。
你可以不在表单中添加它,Symfony会在更新时单独保留该值,我猜你在代码中设置dateCreated,所以你不需要Forms库试图更新该字段。
另一个选项是将字段添加为隐藏字段->add('dateCreated', 'hidden')
,您需要在模板中呈现字段,Symfony将保留dateCreated数据。如果要渲染每一行,可以在树枝中使用form_rest(form)
来渲染所有缺失的字段。
答案 1 :(得分:0)
这是一个老话题,但我遇到了同样的情况,我处理这个问题最简单,最干净的方法就是当你不想对它做任何事情时从表单中删除字段。
例如,我想显示用户所附加的组列表,但其他一些用户无法看到它们。结果是这些用户的任何更改都会删除他们已经拥有的组。
解决方案:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$this->onPreSubmit($event);
}
);
.....
}
public function onPreSubmit(FormEvent $event)
{
$params = $event->getData();
if (!isset($params['groups'])) {
$event->getForm()->remove('groups');
}
}
现在,如果已设置,您的表单将拒绝这些组,以避免您可以向表单添加选项'allow_extra_fields' => true
。它将通过验证并且不做任何事情。
虽然它很整洁我不是一个大粉丝,但我看不到任何其他解决方案,或者你将不得不自己构建html和动作/服务来处理验证,而没有内置表单系统的symfony。