forms - createform - Colección de formulario Symfony2: ¿cómo eliminar entidad de una colección?
symfony form validation (4)
Intento eliminar entidades de una colección, pero no funciona.
Creo que tengo un error en alguna parte, pero no sé dónde.
Aquí el código de mi updateAction
:
$em = $this->getDoctrine()->getEntityManager();
$entity = new Person();
if (!$entity) {
throw $this->createNotFoundException(''Unable to find Person entity.'');
}
$editForm = $this->createForm(new PersonType(), $entity);
$deleteForm = $this->createDeleteForm($id);
$request = $this->getRequest();
$editForm->bindRequest($request);
if ($editForm->isValid()) {
$entity = $editForm->getData();
$em->persist($entity);
foreach($entity->getAddresses() as $address)
{
$em->persist($address);
}
$em->flush();
return $this->redirect($this->generateUrl(''person_show'', array(''id'' => $id)));
}
return $this->render(''AppPersonBundle:Person:edit.html.twig'', array(
''entity'' => $entity,
''edit_form'' => $editForm->createView(),
''delete_form'' => $deleteForm->createView(),
);
Tenga en cuenta que para eliminar mi entidad, elimino el div del html.
Quiero decir que <div id="myapp_personbundle_persontype_address_4">
por ejemplo.
¿Es el camino correcto?
Por ahora, lo hago:
[...]
$editForm = $this->createForm(new PersonType(), $entity);
$deleteForm = $this->createDeleteForm($id);
$previousCollections = array(
''addresses'' => $entity->getAddresses(),
);
$request = $this->getRequest();
$editForm->bindRequest($request);
if ($editForm->isValid()) {
$entity = $editForm->getData();
$this->deleteCollections($em, $previousCollections, $entity);
$em->persist($entity);
foreach($entity->getAddresses() as $address)
{
$em->persist($address);
}
$em->flush();
return $this->redirect($this->generateUrl(''person_show'', array(''id'' => $id)));
}
[...]
}
private function deleteCollections($em, $init, $final)
{
if (empty($init)) {
return;
}
if (!$final->getAddresses() instanceof /Doctrine/ORM/PersistentCollection) {
foreach ($init[''addresses''] as $addr) {
$em->remove($addr);
}
}
}
Y espero encontrar una solución algún día en https://github.com/symfony/symfony/issues/1540 , pero es lenta de encontrar.
La colección de formularios en Symfony2 es bastante sencilla, hace casi todo el trabajo por usted. Básicamente solo necesitas agregar un collection type
y establecer allow_add
, allow_delete
flags y agregar un pequeño código JavaScript. Echa un vistazo al ejemplo del libro de cocina
Estoy usando esta solución ...
En el controler:
$em = $this->getDoctrine()->getManager();
$enity->removeElements($em);
//Add all your elements again in order to update entity collection.
$entity->addElement($element) ...
....
$em->persist($entity);
$em->flush();
En la entidad:
public function removeElements($em)
{
$elements = $this->elements;
foreach ($elements as $element) {
$this->elements->removeElement($element);
$em->remove($element);
$em->persist($this);
}
}
Para mí funciona y muestra menos código y no tengo que usar la función huérfano Removimiento.
Gracias a esta respuesta , encontré una mejor solución. Puede usar la función de eliminación huérfana de Doctrine:
class Gallery
{
//...
/**
* @ORM/OneToMany(targetEntity="Photo", mappedBy="gallery", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $photos;
//...
public function removePhotos($photo)
{
$this->photos->remove($photo);
$photo->setGallery(null);
}
}