我正在开发一个Zend Framework 2项目,用户必须能够添加/编辑发票。发票包含一些客户信息(例如姓名,地址)和一个或多个发票行。为此,我使用了两个Doctrine 2实体:Invoice
和InvoiceLine
。发票包含一条带有所有行的学说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)
}
如果我想编辑现有发票,事情就会出现问题。当我用我现有的发票(和线条)填充表格时,一切似乎都很好;所有字段和字段集都使用值填充。但是,当我发布此表单时,所有字段集(现有行或新行)都未经过验证,并且我的实体不包含正确的值;所有的线都丢失了。
简而言之:添加效果很好,但编辑发票却不行。
我错过了什么或这是一个错误吗?提前谢谢!
答案 0 :(得分:3)
看看这篇文章表格与关系一对一,一对多 http://zf2cheatsheet.com/#form
答案 1 :(得分:2)
经过长时间的调试后我终于解决了问题:)。起初我使用的是Zend的ObjectProperty保湿剂。将其更改为Doctrine的DoctrineObject水化器解决了我的问题。我为所有属性创建了getter和setter,并将所有水合器更改为DoctrineObject,现在一切正常。