Symfony2形成部分结合

时间:2014-01-04 04:14:58

标签: php forms symfony symfony-forms

我遇到了symfony2表单的问题,如果没有提交相应的表单输入,它会将我的实体数据覆盖为null。

以下是一个例子:

表格类型:

$builder
    ->add('customerid', 'text')
    ->add('field1', 'text')
    ->add('field2', 'text')
    ...

控制器:

$customer = new Customer();
$customer->setId('the customerID');
$customerForm = $this->createForm(new CustomerType(), $customer);
if ($request->getMethod() == 'POST') {
    $customerForm->bind($request);
    ...
}

在视图中,我不呈现customerid文本字段。 只提交了其他字段。

提交表单后,$ customerForm-> bind($ request);即使没有为其提交空值,也会将先前设置的customerID重置为null。

如果没有渲染输入字段,有没有办法不覆盖值?

这似乎是同样的问题: https://github.com/symfony/symfony/issues/1341 提交了一个补丁,但我没有找到关于如何使用它的文档。

由于

1 个答案:

答案 0 :(得分:4)

表单中的任何字段(无论是否呈现)都将具有值,无论是null还是字段的值。

您使用的是哪个版本的Symfony?

我假设您正在使用< 2.3,因为我认为bind已更改为在2.3提交。 使用绑定将每个字段合并到对象中意味着它将替换数据,null或其他。 我认为解决这个问题的唯一方法是在表单中不包含不需要的字段,或者使用事件监听器作为documented in the cookbook

如果您使用的是2.3+(或升级到2.3+),那么您应该使用$ form-> submit(),它有第二个参数,允许您将表单设置为不覆盖对象属性(如果它们是空值。例如$form->submit($request->get($form->getName()), false)(true是设置/取消设置覆盖的布尔值,或实际代码上的$ clearMissing)