为什么Symfony将表单字段设置为null,如果它们不在模板中但在formType中

时间:2012-08-17 01:59:47

标签: php symfony doctrine-orm

我无法理解为什么Symfony会这样做。

假设我有UserFormType类

->add(username);
->add(datecreated);

现在我没有在我的模板中显示dateCreated,然后symfony将DateCreated设置为覆盖数据库值的null

我想知道将该值设置为null时的问题是什么,如果它不在模板中则只有原始值

2 个答案:

答案 0 :(得分:1)

documentationAdditionally, 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。