SonataAdminBundle y relación manytomany con campos extra

182 views
Skip to first unread message

David Santana

unread,
May 14, 2013, 12:50:53 PM5/14/13
to symfo...@googlegroups.com
Hola.

Después de dos días dedicado a este tema en los que he aprendido de todo menos solucionar este problema, os comento mi caso.

Modelo los logros de un usuario y necesito almacenar la fecha de consecución del logro. Tengo 3 entidades: Usuario, Logro y LogroUsuario mapeadas correctamente de uno a muchos con el muchos en ambos lados de LogroUsuario. El modelo funciona y cargo las fixtures correctamente. No obstante, no consigo hacer una administración de la entidad Usuario (otras entidades fuertes sí me funcionan) que me permita en el momento de crear uno nuevo, asignale usuarios mediante un desplegable.

Pienso que la clave esta en el -->add() del formMapper, pero he probado todo lo que he encontrado sin lograr configurarlo bien (sonata_type_collection, etc). Aquí esta parte el código, en la clase Admin dejo lo que más cerca he estado de conseguirlo, con este campo se muestras en el formulario de Usuario un desplegable con los nombres de los logros, pero no los almacena.



Se agradece cualquier pista por pequeña que sea.

oyepez003

unread,
May 15, 2013, 10:57:13 AM5/15/13
to symfo...@googlegroups.com
Hola, ya probaste colocando

mappedBy="usuario" cascade={"persist"}

Saludos.

Jakala

unread,
May 15, 2013, 1:01:01 PM5/15/13
to symfo...@googlegroups.com
Buenas, David:

Tal como tienes el codigo, lo que estas haciendo no es un ManyToMany, sino un OneToMany <- logrousuario-> ManyToOne... Sonata no lo va a interpretar directamente como un ManyToMany (que es lo que quieres).

Supongo (no se si podras comprobarlo) que si ejecutas tu codigo, lo unico que consigues (si añades un logro) es unicamente guardar la fecha (pero no la relacion en si mismo).

Sin embargo, en los admin de sonata tienes una serie de metodos que pueden ayudarte a esto. Entre ellos tienes el prePersist() y el preUpdate().  El primero se ejecuta ANTES de grabar el objeto, y el segundo ANTES de editarlo. 

en el prePersist podrias mirar si has definido objetos de tipo logro, y si es asi, crear tu a mano la relación. Bien añadiendo al collection de Usuario los logros, o por una DQL directamente

David Santana

unread,
May 15, 2013, 1:46:04 PM5/15/13
to symfo...@googlegroups.com
Efectivamente, no tengo un manytomany ya que necesito en esa relación guardar una propiedad más, la fecha.

Gracias por la información. Ya había tirado la toalla por el momento y me resignaba a introducir los logros de los usuarios con un segundo formulario (un admin para la entidad intermedia)

Voy a emplear esos dos métodos para almacenar los logros tal como lo hago en la fixture, aunque primero debo investigar cómo en el formulario de usuario introduzco un "subformulario múltiple" que me permita seleccionar pares logro/fecha.

Me comprometo a publicar la solución a este problema ya que la información existente en la red no es nada clara.

Jakala, oyepez003 muchísimas gracias por ponerme en la pista.

Jorge Hernán

unread,
Jul 26, 2013, 8:25:30 AM7/26/13
to symfo...@googlegroups.com
Buenas.

No se si seguirás teniendo este problema, pero yo solucioné ayer el problema que creo que es el tuyo también.

Lo que te falta es añadir dos anotaciones en el O2M:

  1. /**
  2.      * @ORM\Column(nullable=true)
  3.      * @ORM\OneToMany(targetEntity="xxx\UsuarioBundle\Entity\LogroUsuario", mappedBy="usuario", cascade={"persist"}, orphanRemoval=true)
  4.      */
  5.     private $logros;

A mí con esto me funciona, y no me hace falta definir métodos prePersist o preUpdate.

Saludos.

David Santana

unread,
Aug 1, 2013, 7:36:08 AM8/1/13
to symfo...@googlegroups.com
Muchas gracias Jorge, lo probaré.
Reply all
Reply to author
Forward
0 new messages