Foros del Web » Programando para Internet » PHP » Symfony »

symfony2 build form entity oneToMany

Estas en el tema de symfony2 build form entity oneToMany en el foro de Symfony en Foros del Web. Estoy aprendiendo a utilizar este framework pero me he topado con un problema que ya hace algunos días no he podido resolver: Tengo 2 tablas ...
  #1 (permalink)  
Antiguo 18/04/2013, 16:38
 
Fecha de Ingreso: julio-2006
Mensajes: 13
Antigüedad: 17 años, 9 meses
Puntos: 3
symfony2 build form entity oneToMany

Estoy aprendiendo a utilizar este framework pero me he topado con un problema que ya hace algunos días no he podido resolver:

Tengo 2 tablas en la BD: categoria con llave primaria "idcategoria" y producto con llave primaria ("idproducto" y llave forenea a la tabla categoria "categoria_idcategoria", tengo las entidades generades y un controlador con un editAction que es un formulario que almacena los datos del producto y la categoria a la que pertence.

Relacionaes en ORM yml

Entity: Producto
...
manyToOne:
categoria:
targetEntity: Categoria
inversedBy: productos
joinColumn:
name: categoria_idcategoria
referencedColumnName: idcategoria

Entity: Categoria
...
oneToMany:
productos:
targetEntity: Producto
mappedBy: categoria

Form/Type
ProductoType
public function buildForm(FormBuilderInterface $builder, array $options)
{
...

$builder->add('categoria_idcategoria', 'entity',
array('class' => 'SysCatalogoBundle:Categoria',

'property' => 'nombre',));

...
}

ProductoController

public function editAction(Request $request)
{
$id = 1;
$em = $this->getDoctrine()->getManager();
$productos= $em->getRepository('SysCatalogoBundle:Producto')->find($id);
$form = $this->createForm(new ProductoType(), $productos);


...
}

Si bien se genera un <select> con las categorías, no deja seleccionada la categoria a la que pertenece el producto, probé con un query_builder sin resultado, probe con new Categoria pero tampoco dejaba seleccionado el "selected", probe con un choice con un array fijo y si funcionaba, alguien sabe que puede ser??, estará mal planteada la relación?, seguí los ejemplos de la documentación doc español simfony2.

Se agredece la ayuda.

Última edición por capemp; 18/04/2013 a las 16:40 Razón: symfony2
  #2 (permalink)  
Antiguo 19/04/2013, 10:36
 
Fecha de Ingreso: julio-2006
Mensajes: 13
Antigüedad: 17 años, 9 meses
Puntos: 3
Respuesta: symfony2 build form entity oneToMany

Me respondo solo, despues de mucho navegar encontre una explicación por lo que con esto funciona (con el query_builder tambien funciona):

Código PHP:
$builder
                
->add('categoria_idcategoria''entity',  
                        array(
'class' => 'SysCatalogoBundle:Category',
                                
'label' => 'Categoría: ',
                                
'empty_value' => '--Seleccionar--',
                                
//'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.nombre', 'ASC');},
                                
'property' => 'nombre',
                                
'data' => $options['data']->getCategory(),

        )); 
Acá la fuente que me dio la pista, ojala alguien que sepa pueda verlo y confirmar que se hace así, quizas hay otra manera de lograr que automaticamente te seleccione el dato que viene en la base de datos.
http://stackoverflow.com/questions/13310329/symfony2-entity-to-array
  #3 (permalink)  
Antiguo 19/04/2013, 14:48
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 14 años, 8 meses
Puntos: 23
Respuesta: symfony2 build form entity oneToMany

Hola,

Si estas cargando esto en el controller "new Categoria", estas creando un nuevo objeto de esto, por lo tanto viene vacio, es logico que no te deje nada seleccionado.

Si ya tienes datos insertados en la Base de Datos, debes rescatarlos para que queden "cargados" en tu objeto Categoria. Por ejemplo

Inserte una carrera en la Base, en mi entidad tengo 3 campos

- Id (Autonumerico)
- Nombre
- Año

Teniendo el ID busco la carrera

Código HTML:
Ver original
  1. $em = $this->getDoctrine()->getManager();
  2.  
  3. //Find existe por defecto
  4. $entity = $em->getRepository('ANPruebaBundle:Carrera')->find($id);
  5.  
  6.         if (!$entity) {
  7.             throw $this->createNotFoundException('No encontro nada.');
  8.         }
  9.  
  10. //Crea el formulario con los datos de la entidad
  11.         $form = $this->createForm(new CarreraType(), $entity);


Entonces, si la encontro, te retornara un objeto entidad con todos los datos cargados, me entiendes?

A y lo otro, no ocupes guiones bajos ya que symfony los reemplaza o mejor dicho los quita u omite.

Por ultimo, viendo tus relaciones deberian estar asi


Código HTML:
Ver original
  1. //Producto
  2.  
  3.     /**
  4.      * @ORM\ManyToOne(targetEntity="Categoria", inversedBy="producto")
  5.      * @ORM\JoinColumn(name="categoriaid", referencedColumnName="idcategoria")
  6.      */
  7.  
  8.     protected $categoriaid; //Idealmente ocupar el mismo nombre con que creas el campo (name)


Código HTML:
Ver original
  1. //Categoria
  2.  
  3.  
  4.     /**
  5.      * @ORM\OneToMany(targetEntity="Producto", mappedBy="categoriaid")
  6.      */
  7.     protected $producto;


Tanto "inversedBy" como "mappedBy" hacen referencia a la variable definida y no al nombre del campo, EJ:

protected $categoriaid

protected $categoriaid

^^

Última edición por fhederico; 19/04/2013 a las 15:01

Etiquetas: entity, form
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:39.