ZF2 Doctrine - 字段集绑定
ZF2 Doctrine - fieldset binding
我已经阅读了我能找到的所有内容,但似乎无法解决我的问题。问题是当编辑数据仅从基本字段集绑定到表单时,不会从子项中提取数据(在本例中为联系人)。因此,表单中填入了来自 ContactAddress 的数据,而不是来自 Contact 的数据。当我将查询转储到 Zend\Debug 时,所有信息都在那里,但它没有进入表单。我希望有人能指出我犯的任何愚蠢错误。以下是我认为相关的代码部分:
控制器:
$em = $this->getEntityManager();
$id = (int)$this->params()->fromRoute('id',0);
$form = new ContactsForm($em);
$qb = $em->createQueryBuilder();
$qb->select('contactAddressId', 'contact')
->from('Application\Entity\ContactAddress', 'contactAddressId')
->where('contactAddressId = ' . $id)
->leftJoin('contactAddressId.contact', 'contact');
$query = $qb->getQuery();
$contactAddress = $query->getResult();
$form->bind($contactAddress[0]);
return array('form' => $form);
联系人表单:
parent::__construct('orders');
$this->setAttribute('method','post')
->setHydrator(new ClassMethodsHydrator(false));
$this->add(array(
'name' => 'orderId',
'type' => 'hidden',
'attributes' => array(
'id' => 'orderId',
),
));
$contactAddressFieldset = new Fieldsets\ContactAddressFieldset($objectManager);
$contactAddressFieldset->setUseAsBaseFieldset(true);
$this->add($contactAddressFieldset);
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Add',
'id' => 'submitbutton',
),
));
联系人地址字段集:
parent::__construct('contactAddress');
$hydrator = new AggregateHydrator();
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactAddress'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactAddressType'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\AddressType'));
$this->setHydrator($hydrator);
$this->setObject(new \Application\Entity\ContactAddress())
->setObject(new \Application\Entity\ContactAddressType())
->setObject(new \Application\Entity\AddressType());
$this->setAttribute('method','post');
$contactFieldSet = new ContactFieldset($objectManager);
$this->add($contactFieldSet);
$this->add(array(
'name' => 'contactAddressId',
'attributes' => array(
'type' => 'hidden',
'id' => 'contactAddressId',
),
));
等等等等
联系人字段集:
parent::__construct('contact');
$hydrator = new AggregateHydrator();
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\Contact'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactType'));
$this->setHydrator($hydrator);
$this->setObject(new \Application\Entity\Contact())
->setObject(new \Application\Entity\ContactType());
$this->setAttribute('method','post');
$this->add(array(
'name' => 'contactId',
'attributes' => array(
'type' => 'hidden',
'id' => 'contactId',
),
));
感谢您提供的任何帮助
詹姆斯
确保你使用的是 DoctrineModule 的最新版本,如果你使用 Zend Framework 2 with composer,只需确保你的 composer.json 文件读取
"doctrine/doctrine-orm-module" : "0.*",
和运行phpcomposer.phar自更新
其次是
php composer.phar 更新
这将安装最新版本的 ORM 模块。
同时使用以下 link: https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md
将帮助您开始使用 Doctrine 和 Zend Framework 2 Forms & Fieldsets。
确保检查您的实体是否遵循文档中显示的类似模式,并且在添加 OneToMany 关系的部分时以 /** 开头,而不是 /*。
还要确保您的表单/字段集按以下顺序排列:
表单->(OneToMany)Fieldset->(ManyToOne)Fieldset
这里我假设一个联系人可以有多个地址,所以您的表格顺序是这样的:
ContactsForm -> ContactFieldset -> ContactAddressFieldset
另外,在定义 ManyToOne 字段集时尝试使用表单集合,因此在您的 ContactAddressFieldset 中,您当前具有以下内容:
$contactFieldSet = new ContactFieldset($objectManager);
$this->add($contactFieldSet);
尝试将其更改为:
$contactFieldSet = new ContactFieldset($objectManager);
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'contact',
'options' => array(
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'target_element' => $contactFieldSet,
)
));
allow_add 和 allow_remove 将(尽管 add 默认设置为 true)将允许您从表单中干净地添加和删除项目。
希望这对您的情况有所帮助。
山木越
我已经阅读了我能找到的所有内容,但似乎无法解决我的问题。问题是当编辑数据仅从基本字段集绑定到表单时,不会从子项中提取数据(在本例中为联系人)。因此,表单中填入了来自 ContactAddress 的数据,而不是来自 Contact 的数据。当我将查询转储到 Zend\Debug 时,所有信息都在那里,但它没有进入表单。我希望有人能指出我犯的任何愚蠢错误。以下是我认为相关的代码部分:
控制器:
$em = $this->getEntityManager();
$id = (int)$this->params()->fromRoute('id',0);
$form = new ContactsForm($em);
$qb = $em->createQueryBuilder();
$qb->select('contactAddressId', 'contact')
->from('Application\Entity\ContactAddress', 'contactAddressId')
->where('contactAddressId = ' . $id)
->leftJoin('contactAddressId.contact', 'contact');
$query = $qb->getQuery();
$contactAddress = $query->getResult();
$form->bind($contactAddress[0]);
return array('form' => $form);
联系人表单:
parent::__construct('orders');
$this->setAttribute('method','post')
->setHydrator(new ClassMethodsHydrator(false));
$this->add(array(
'name' => 'orderId',
'type' => 'hidden',
'attributes' => array(
'id' => 'orderId',
),
));
$contactAddressFieldset = new Fieldsets\ContactAddressFieldset($objectManager);
$contactAddressFieldset->setUseAsBaseFieldset(true);
$this->add($contactAddressFieldset);
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Add',
'id' => 'submitbutton',
),
));
联系人地址字段集:
parent::__construct('contactAddress');
$hydrator = new AggregateHydrator();
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactAddress'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactAddressType'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\AddressType'));
$this->setHydrator($hydrator);
$this->setObject(new \Application\Entity\ContactAddress())
->setObject(new \Application\Entity\ContactAddressType())
->setObject(new \Application\Entity\AddressType());
$this->setAttribute('method','post');
$contactFieldSet = new ContactFieldset($objectManager);
$this->add($contactFieldSet);
$this->add(array(
'name' => 'contactAddressId',
'attributes' => array(
'type' => 'hidden',
'id' => 'contactAddressId',
),
));
等等等等
联系人字段集:
parent::__construct('contact');
$hydrator = new AggregateHydrator();
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\Contact'));
$hydrator->add(new DoctrineHydrator($objectManager,'Application\Entity\ContactType'));
$this->setHydrator($hydrator);
$this->setObject(new \Application\Entity\Contact())
->setObject(new \Application\Entity\ContactType());
$this->setAttribute('method','post');
$this->add(array(
'name' => 'contactId',
'attributes' => array(
'type' => 'hidden',
'id' => 'contactId',
),
));
感谢您提供的任何帮助 詹姆斯
确保你使用的是 DoctrineModule 的最新版本,如果你使用 Zend Framework 2 with composer,只需确保你的 composer.json 文件读取
"doctrine/doctrine-orm-module" : "0.*",
和运行phpcomposer.phar自更新 其次是 php composer.phar 更新 这将安装最新版本的 ORM 模块。
同时使用以下 link: https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md
将帮助您开始使用 Doctrine 和 Zend Framework 2 Forms & Fieldsets。
确保检查您的实体是否遵循文档中显示的类似模式,并且在添加 OneToMany 关系的部分时以 /** 开头,而不是 /*。
还要确保您的表单/字段集按以下顺序排列:
表单->(OneToMany)Fieldset->(ManyToOne)Fieldset
这里我假设一个联系人可以有多个地址,所以您的表格顺序是这样的:
ContactsForm -> ContactFieldset -> ContactAddressFieldset
另外,在定义 ManyToOne 字段集时尝试使用表单集合,因此在您的 ContactAddressFieldset 中,您当前具有以下内容:
$contactFieldSet = new ContactFieldset($objectManager);
$this->add($contactFieldSet);
尝试将其更改为:
$contactFieldSet = new ContactFieldset($objectManager);
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'contact',
'options' => array(
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'target_element' => $contactFieldSet,
)
));
allow_add 和 allow_remove 将(尽管 add 默认设置为 true)将允许您从表单中干净地添加和删除项目。
希望这对您的情况有所帮助。
山木越