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

Dos entidades en un formulario

Estas en el tema de Dos entidades en un formulario en el foro de Symfony en Foros del Web. Hola, he estado trabajando en Symfony 2 y quiero con un solo formulario recoger los datos de dos entidades. Tengo una entidad Anuncio que tiene ...
  #1 (permalink)  
Antiguo 30/07/2013, 10:26
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 9 meses
Puntos: 0
Dos entidades en un formulario

Hola, he estado trabajando en Symfony 2 y quiero con un solo formulario recoger los datos de dos entidades. Tengo una entidad Anuncio que tiene una relación de Uno a muchos con la entidad Imagen, es decir un anuncio tiene muchas imágenes. Aquí les dejo el código de las entidades y del formulario:
Código PHP:
class Anuncio
{
    
/**
    * @ORM\OneToMany(targetEntity="Imagen", mappedBy="anuncio")
    */    
    
private $imagenes;
    
    public function 
addImagene(AnunciosFrontendBundleEntityImagen $imagenes)
    {
        
$this->imagenes[] = $imagenes;
    
        return 
$this;
    }

    
/**
     * Remove imagenes
     *
     * @param \Anuncios\FrontendBundle\Entity\Imagen $imagenes
     */
    
public function removeImagene(AnunciosFrontendBundleEntityImagen $imagenes)
    {
        
$this->imagenes->removeElement($imagenes);
    }

    
/**
     * Get imagenes
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    
public function getImagenes()
    {
        return 
$this->imagenes;
    }
}
class 
Imagen
{
    
/**
     * @var \Anuncio
     *
     * @ORM\ManyToOne(targetEntity="Anuncio", inversedBy="imagenes")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="anuncio_id", referencedColumnName="id", onDelete="Cascade")
     * })
     */
    
protected $anuncio;
}

class 
AnuncioType extends AbstractType
{
    public function 
buildForm(FormBuilderInterface $builder, array $options)
    {
        
$builder            
            
->add('imagen1','file', array(
                
'mapped' => false,
                
'required' => false,
            ))
            ->
add('imagen2','file', array(
                
'mapped' => false,
                
'required' => false,
            ))
            ->
add('imagen3','file', array(
                
'mapped' => false,
                
'required' => false,
            ))
        ;
    }

Ahora mi duda está en cómo crear las instancias de Imagen para poder adicionarlas al formulario y como validar los campos del formulario utilizando los Assert que tiene definido symfony para validaciones como esta:
* @Assert\Image(maxSize = "1M")
Gracias y espero que me puedan ayudar
  #2 (permalink)  
Antiguo 30/07/2013, 11:53
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Dos entidades en un formulario

Te sugiero que leas el siguiente cookbook http://symfony.com/doc/current/cookb...llections.html

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 30/07/2013, 15:52
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Dos entidades en un formulario

@masterpuppet, gracias, voy a revizar lo que me sugieres y cualquier duda posteo en este tema
  #4 (permalink)  
Antiguo 31/07/2013, 11:25
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Dos entidades en un formulario

Ya me he leído la documentación que me recomendaste, pero tengo aun algunos problemas, el primero es que las validaciones de la entidad imagen no están funcionando ya que no validan y la segunda es que me está guardando en la base de datos el nombre de las imágenes sin la extensión…. A continuación muestro el código
Gracias y espero que me puedan seguir ayudando

Código PHP:
Ver original
  1. class Imagen
  2. {
  3.      /**
  4.      * @var string
  5.      *
  6.      * @ORM\Column(name="imagen", type="string", length=20, nullable=false)
  7.      * @Assert\File(maxSize = "500k", mimeTypes = {"application/jpg"})
  8.      */
  9.     protected $imagen;
  10.    
  11.     public function subirImagen($directorio)
  12.     {
  13.         if($this->imagen === null)
  14.             return false;
  15.         $nombreImagen = uniqid('anuncio-').'.'.$this->imagen->guessExtension();
  16.         $this->imagen->move($directorio, $nombreImagen);
  17.         $this->setImagen($nombreImagen);
  18.         return true;
  19.     }  
  20. }  
  21. class ImagenType extends AbstractType
  22. {
  23.     public function buildForm(FormBuilderInterface $builder, array $options)
  24.     {
  25.         $builder
  26.             ->add('imagen', 'file', array(
  27.                 'required' => false,
  28.                 'by_reference' => false,
  29.             ))
  30.         ;
  31.     }
  32.  
  33.     public function setDefaultOptions(OptionsResolverInterface $resolver)
  34.     {
  35.         $resolver->setDefaults(array(
  36.             'data_class' => 'Anuncios\FrontendBundle\Entity\Imagen'
  37.         ));
  38.     }
  39.  
  40.     public function getName()
  41.     {
  42.         return 'anuncios_frontendbundle_imagentype';
  43.     }
  44. }
  45. class AnuncioType extends AbstractType
  46. {
  47.     public function buildForm(FormBuilderInterface $builder, array $options)
  48.     {
  49.         $builder
  50.             ->add('asunto')
  51.             ->add('precio')
  52.             ->add('moneda')
  53.             ->add('descripcion')
  54.             ->add('nombre')
  55.             ->add('telefono')
  56.             ->add('categoria')
  57.             ->add('imagenes', 'collection', array(
  58.                 'type' => new ImagenType(),
  59.                 'by_reference' => false,
  60.                 ))
  61.         ;
  62.     }
  63.  
  64.     public function setDefaultOptions(OptionsResolverInterface $resolver)
  65.     {
  66.         $resolver->setDefaults(array(
  67.             'data_class' => 'Anuncios\FrontendBundle\Entity\Anuncio'
  68.         ));
  69.     }
  70.  
  71.     public function getName()
  72.     {
  73.         return 'anuncios_frontendbundle_anunciotype';
  74.     }
  75. }
  76. En el controller
  77.  public function anuncioNuevoAction()
  78.     {  
  79.         $anuncio = new Anuncio();
  80.         $imagen1 = new Imagen();
  81.         $imagen2 = new Imagen();
  82.         $imagen3 = new Imagen();
  83.         $anuncio->addImagene($imagen1);
  84.         $anuncio->addImagene($imagen2);
  85.         $anuncio->addImagene($imagen3);
  86.         $formulario = $this->createForm(new AnuncioType(), $anuncio);
  87.        
  88.         $peticion = $this->getRequest();
  89.         if($peticion->getMethod()== 'POST')
  90.         {
  91.            $formulario->bind($peticion);          
  92.            if($formulario->isValid())
  93.            {                  
  94.                $em = $this->getDoctrine()->getManager();
  95.                $anuncio->setFecha(new \DateTime());
  96.                $anuncio->setUsuario($this->getUser());
  97.                $directorio = $this->container->getParameter('anuncios.directorio.web');
  98.                if(!$imagen1->subirImagen($directorio))
  99.                     $anuncio->removeImagene($imagen1);              
  100.                if(!$imagen2->subirImagen($directorio))
  101.                    $anuncio->removeImagene($imagen2);
  102.                if(!$imagen3->subirImagen($directorio))
  103.                    $anuncio->removeImagene($imagen3);              
  104.                $em->persist($anuncio);
  105.                $em->flush();                
  106.            }
  107.         }
  108.         return $this->render('FrontendBundle:Anuncios:anuncioFormulario.html.twig', array(
  109.             'formulario' => $formulario->createView(),
  110.         ));
  111.     }
  #5 (permalink)  
Antiguo 31/07/2013, 14:17
 
Fecha de Ingreso: marzo-2013
Mensajes: 10
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Dos entidades en un formulario

@daymerrf yo tengo un proyecto donde tengo el mismo caso y funciona bien, utilizo "Lifecycle Callbacks" de doctrine para subir los archivos.

http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

Saludos!
  #6 (permalink)  
Antiguo 31/07/2013, 15:58
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Dos entidades en un formulario

Ya resolví un problema solo me queda solucionar, por que, cuando en el controlador llamo al método isValid() del formulario, no me valida el formulario de la entidad Imagen que esta dentro del formulario de Anuncio, puedo subir cualquier archivo aunque no sean imagines y no me muestra ningún error incluso me deja insertar en la base de datos
saludos y espero que me puedan seguir ayudando
  #7 (permalink)  
Antiguo 12/12/2013, 15:21
 
Fecha de Ingreso: diciembre-2013
Mensajes: 1
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Dos entidades en un formulario

daymerrf, no se si ya resolviste tu problema, pero por si acaso le llega ser de utilidad a alguien se soluciona haciendo esto:

En la entidad madre (la que genera el form donde se va a embeber el otro formulario de la otra entidad) debe tener una variable que hace referencia a dicha entidad, a esta se le debe poner la anotacion:

/**
* @Assert\Valid
*/

Ya con esto el isValid() va a tomar las validaciones de las otras entidades.

Etiquetas: entidades, formulario
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 23:13.