Form Collection上的ZF2对象绑定

时间:2013-06-24 13:45:06

标签: forms collections doctrine-orm zend-framework2

我正在开发一个Zend Framework 2项目,用户必须能够添加/编辑发票。发票包含一些客户信息(例如姓名,地址)和一个或多个发票行。为此,我使用了两个Doctrine 2实体:InvoiceInvoiceLine。发票包含一条带有所有行的学说ArrayCollection

我还有一张发票表格和一行表格。此表单包含所有行的Form Collection

$form->add(array(
    'type' => 'Zend\Form\Element\Collection',
     'name' => 'lines',
     'options' => array(
        'should_create_template' => true
     )
));
$form->get('lines')->setTargetElement($this->createLineFieldset($form->get('lines')-  >getTemplatePlaceholder()));

发布表单后,我将发票实体绑定到表单,然后验证表单。对于新的(不存在的)发票,这是完美的,我的发票包含所有信息,包括行:

$form->bind($invoice);
$form->setData($request->getPost());

if ($form->isValid()) {
    // Form is valid and invoice contains all information (including lines)
}

如果我想编辑现有发票,事情就会出现问题。当我用我现有的发票(和线条)填充表格时,一切似乎都很好;所有字段和字段集都使用值填充。但是,当我发布此表单时,所有字段集(现有行或新行)都未经过验证,并且我的实体不包含正确的值;所有的线都丢失了。

简而言之:添加效果很好,但编辑发票却不行。

我错过了什么或这是一个错误吗?提前谢谢!

2 个答案:

答案 0 :(得分:3)

看看这篇文章表格与关系一对一,一对多 http://zf2cheatsheet.com/#form

答案 1 :(得分:2)

经过长时间的调试后我终于解决了问题:)。起初我使用的是Zend的ObjectProperty保湿剂。将其更改为Doctrine的DoctrineObject水化器解决了我的问题。我为所有属性创建了getter和setter,并将所有水合器更改为DoctrineObject,现在一切正常。