我有2个实体。用户和地址。用户有很多地址。我想在我的用户创建表单中实现sonata_type_collection字段。
我已将reference_by设置为false,在我的User实体中创建了相应的方法。 它是UserAdminClass中的formtype
->add('addresses', 'sonata_type_collection', array(
// Prevents the "Delete" option from being displayed
'type_options' => array('delete' => false, 'by_reference' => false)
), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'sortable',
))
这是我在User实体中的方法:
public function setAddresses($addresses)
{
$this->addresses->clear();
foreach ($addresses as $address) {
$this->addAddress($address);
}
}
public function getAddresses()
{
return $this->addresses;
}
/**
* Add addresses
* вызывается при нажатии на кнопку "добавить новый" в сонате на коллекции
* @param \Application\Sonata\UserBundle\Entity\Address $addresses
* @return User
*/
public function addAddress(\Application\Sonata\UserBundle\Entity\Address $addresses)
{
$addresses->setUser($this);
$this->addresses[] = $addresses;
return $this;
}
/**
* Remove addresses
*
* @param \Application\Sonata\UserBundle\Entity\Address $addresses
*/
public function removeAddress(\Application\Sonata\UserBundle\Entity\Address $addresses)
{
$this->addresses->removeElement($addresses);
}
但是当我提交表单时,它会对现有的链接地址进行公布。我无法删除地址,并且在没有地址时无法添加新地址。
我发现,在表单提交时,方法setAddresses必须被调用,但它还没有,所以我的地址集合并不是每次都清楚,它会使得dublicates。 (我希望我明白这一点。)
我使用symfony 2.5和最新的奏鸣曲。 我已经阅读了所有google和stackoverflow,但是在2012年发布了相同的问题。