Campo Entity en FormType. Null por defecto.

126 views
Skip to first unread message

Héctor Mario Medina Cabanelas

unread,
Dec 9, 2015, 12:47:48 PM12/9/15
to symfony-es
Hola.

Estoy intentando que en un formtype mi campo Entity sea al principio null. Porque depende de qué seleccione el usuario, luego poblaré ese select con cierta información.

¿Eso cómo se puede hacer? 

He intentado el query_builder o el choices pero no me funciona... :(

  public function buildForm(FormBuilderInterface $builder, array $options)
    { 

        $builder
            ->add('email', 'email', array('label' => false, 'translation_domain' => 'FOSUserBundle'))
            ->add('username', null, array('label' => false, 'translation_domain' => 'FOSUserBundle'))
            ->add('plainPassword', 'repeated', array(
                'type' => 'password',
                'options' => array('translation_domain' => 'FOSUserBundle'),
                'first_options' => array('label' => false),
                'second_options' => array('label' => false),
                'invalid_message' => 'fos_user.password.mismatch',
            ))
            ->add('sexo', 'choice', array('label' => 'sexo', 'choices' => array('1' => 'hombre', '0' => 'mujer'), 'translation_domain' => 'aplicacion','placeholder' => 'Género'))
            ->add('nacimiento', 'date', array('label' => 'nacimiento', 'translation_domain' => 'aplicacion', 'years' => range(1940, date('Y')), 'format' => 'dd-MM-yyyy',     'placeholder' => '--',
'empty_data'  => null
))
            ->add('paises', 'entity', array('class' => 'TuzonaBundle:Paises', 'choice_label' => 'nombre','placeholder' => 'Pais'))
            ->add('provincias', 'entity', array('class' => 'TuzonaBundle:Provincias', 'choice_label' => 'nombre', 'placeholder' => 'Provincia'))
            ->add('ciudades', 'entity', array('class' => 'TuzonaBundle:Ciudades', 'choice_label' => 'nombre', 'placeholder' => 'Ciudad'));        
        
        

    }



Concretamente quiero que cuando represente el campo 'ciudades', éste sea un select sin opciones. 

¿Alguna idea?

Un abrazo.

Sebastian Thomson

unread,
Dec 9, 2015, 1:53:25 PM12/9/15
to symfony-es
Héctor, 

Por lo que puedo entender, intentas hacer un Select Dependiente, por lo que te recomiendo hacerlo a través de eventos. 


Espero que te sirva,


Héctor Mario Medina Cabanelas

unread,
Dec 9, 2015, 2:23:32 PM12/9/15
to symfony-es
No, eso no es lo que busco. 

Sólo quiero que en el select no me aparezca ninguna opción al principio. Es lo único que quiero. 

El tutorial que comentas... le he dado vueltas un montón de veces. Ese y muchos otros. Si bien lo que propone sería una solución válida para mi, no es lo que busco. Más que nada porque no lo entiendo bien y no sé implementarlo. 

Gracias por tu aportación de todos modos. 

Eloy González Andueza

unread,
Dec 9, 2015, 2:26:15 PM12/9/15
to symfo...@googlegroups.com

--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Sebastian Thomson

unread,
Dec 9, 2015, 2:55:50 PM12/9/15
to symfony-es
Si lo que quieres es que no el select no traiga opciones, lo que puedes hacer es indicar en la consulta una condición que jamás se de.

Por ejemplo un q.id IS NULL.

Lo malo de hacer esto, es cuando quieres "validar" el formulario con un isValid() te dirá que está malo, ya que le está llegando un valor que no está en la consulta original. Y en esto es en lo que te ayuda el enlace que compartí anteriormente. Es la forma correcta de hacerlo.

El select dependiente inclusive te servirá para cuando crees el editar (si es que lo necesitas) del formulario que estás haciendo.

Saludos.


Héctor Mario Medina Cabanelas

unread,
Dec 9, 2015, 7:30:41 PM12/9/15
to symfony-es
Gracias a ambos por vuestras respuestas.

Ya lo he solucionado. 

Al final he hecho con el query_builder una consulta que sé que me va a dar null. Y ya está. 

Un abrazo y muchas gracias por vuestro tiempo... ¡Sois los mejores! :D

PD: qué subidón da cuando las cosas funcionan..!!! :D
Message has been deleted

Héctor Mario Medina Cabanelas

unread,
Dec 10, 2015, 7:26:04 PM12/10/15
to symfony-es
Sebastian, me estoy dando cuenta de que lo que me pasa es exactamente lo que me comentas. Al validar el formulario, me da un error porque el valor que le estoy metiendo no estaba en la consulta original...

¿Eso puedo saltarmelo de algún modo?

Es que de verdad que me vuelve loco este tema. El tutorial de showmethecode lo he intentado implementar miles de veces... y no hay manera de que me funcione :(


El miércoles, 9 de diciembre de 2015, 20:55:50 (UTC+1), Sebastian Thomson escribió:

Gonzalo Alonso

unread,
Dec 11, 2015, 6:05:22 AM12/11/15
to symfony-es
El campo es requerido?

Héctor Mario Medina Cabanelas

unread,
Dec 11, 2015, 9:36:52 AM12/11/15
to symfony-es
Te refieres a required en el select? No. 

Sebastian Thomson

unread,
Dec 11, 2015, 10:03:22 AM12/11/15
to symfony-es
Héctor, 

Eso te sucede porque el formulario es INVALIDO. Le están llegando datos que el controlador no envía. Esto es por seguridad, para que tú aplicación no sea vulnerable.

Tienes 2 posibilidades: 
  1. Hacerlo de la manera correcta y usar el tutorial que te indiqué más arriba. No es para nada difícil, solo debes darte el tiempo de entender qué se está haciendo.
  2. Quitar la validación isValid() del controlador, pero así dejas tú formulario con una vulnerabilidad MUY ALTA. Después puedes obtener los datos por medio del $request. Pero como digo... es muy vulnerable. Ojo que quitando el isValid() quiere decir que tendrás que hacer todas las validaciones a mano.
Saludos. 

Héctor Mario Medina Cabanelas

unread,
Dec 11, 2015, 11:33:49 AM12/11/15
to symfony-es
Tienes toda la razón, Sebastian. 

Sé que es muy vulnerable el formulario, pero tampoco tengo cosas importantes. Todos los valores son nullables, así que no pasa nada. Tengo que entregar el proyecto en 20 días y esto me tiene loco. 

He provado quitarle el $form->isValid() en el Controller, y efectivamente no realiza las validaciones y guarda todo lo que le llega en la base de datos. Sin embargo, aún no puedo guardar el dato de la ciudad. Al hacerle un $form['ciuidades']->getData(); antes de guardar los datos en la base de datos, me he dado cuenta de que me devuelve un 'null', por lo que sigue sin aceptar el valor que le doy al no estar presente cuando se generó el formulario. 

Aquí pone esto: 


To suppress form validation you can use the POST_SUBMIT event and prevent the ValidationListener from being called.

The reason for needing to do this is that even if you set validation_groups to false there are still some integrity checks executed. For example an uploaded file will still be checked to see if it is too large and the form will still check to see if non-existing fields were submitted. To disable all of this, use a listener:

use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
        $event->stopPropagation();
    }, 900); // Always set a higher priority than ValidationListener

    // ...
}


Pero tampoco me funcionó.
 
:( 

Sebastian Thomson

unread,
Dec 11, 2015, 12:15:20 PM12/11/15
to symfo...@googlegroups.com
Héctor, 

tal y como te lo comenté... debes obtener los valores por medio del $request.

--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Sebastián Andrés Thomson Henríquez
Ingeniero en Computación e Informática

reyn...@gmail.com

unread,
Dec 11, 2015, 12:36:02 PM12/11/15
to symfo...@googlegroups.com

Creo que llego tarde y ando desde el teléfono así q no puedo probar mucho pero q tal si pones la propiedad "data=>null"? Cual es el resultado?

Aquí la referencia http://symfony.com/doc/current/reference/forms/types/entity.html#data

Manuel Aguirre

unread,
Dec 11, 2015, 1:07:21 PM12/11/15
to symfo...@googlegroups.com
Buenas, por razones de seguridad no es posible deshabilitar esa validación, lo que puedes hacer son dos cosas:

Hacerlo de la forma correcta:

Hacerlo de la forma correcta usando los listeners, para eso te pasó otro link de mi autoría con otro enfoque, a ver si así te sirve:

http://manuelj555.github.io/2015/04/26/formularios-dinamicos.html

Trampeando los choices

La idea es que en vez de hacer que la consulta no retorne ninguna opción, hacer que retorne todas las opciones posibles (con esto ya no vas a tener el problema de seguridad de symfony). Y en la vista al imprimir el campo lo haces de la siguiente manera:
{{ form_row(form.ciudades, {choices: []}) }}

Con eso vas a lograr que el campo aparezca sin ninguna opción.

De todas formas soy partidario de hacer las cosas bien, y por mi parte recomiendo encarecidamente la primera opción.

Saludos!

Manuel Aguirre.


manuel_j555 | Desarrollador de Software | Optime Consulting | twitter | github | Sitio web


A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos de leer manuales.

Lester Gonzalez

unread,
Dec 13, 2015, 5:52:38 PM12/13/15
to symfo...@googlegroups.com

Hola a todos:

  Tengo la siguiente duda. Estoy haciendo un proyecto donde una de mis tablas (area), tiene una relación de uno a varios con la tabla “localización”, es decir, que un área tiene varias localizaciones, pero cada localización solamente está en un área.

 

Yo tenía las bases de datos creadas anteriormente, así que genere las entidades con:

è php app/console doctrine:mapping:convert xml ./src/Ejemplos/PruebasBundle/Resources/config/doctrine/metadata/orm --from-database –force

è php app/console doctrine:mapping:import EjemplosPruebasBundle yml

è php app/console doctrine:generate:entities EjemplosPruebasBundle

 

Hasta aquí sin ningún problema. Luego escribí los metadatos en las entidades e incluí algunos campos que faltaban, como la variable $localizaciones (contendría el conjunto de localizaciones de un área determinada) en la entidad “Area”, pero al ejecutar el comando:

doctrine:generate:entities SistemaReportesBundle:Area

por ejemplo, para una de mis entidades,  Symfony no me genera el constructor (la función __construct) ni las funciones addXXX y removeXXX de la variable $localizaciones, que es un array, y así lo hace para todas las entidades con variables de tipo array.

Para tratar de solucionar el problema borre todas las funciones, dejando solamente las variables y volvi a generar la entidad, nada. Hice esto y además elimine el backup que crea Symfony de cada entidad y volvi a generar la entidad, nada. Hice lo anterior, limpie el cache y volvi a generar la entidad, nada.

 

Este es el contenido de mi entidad “Area:

<?php

 

namespace SistemaReportes\SistemaReportesBundle\Entity;

 

use Doctrine\ORM\Mapping as ORM;

 

/**

* Area

* @ORM\Table(name="area")

* @ORM\Entity

*/

class Area

{

    /**

     * @var integer

     * @ORM\Id

     * @ORM\Column(type="integer")

     */

    private $idArea;

 

    /**

     * @var string

     * @ORM\Column(type="string")

     */

    private $nombreArea;

 

    /**

     * @var text

     * @ORM\Column(type="text")

     */

    private $descripcion;

 

    /**

     * @var boolean

     * @ORM\Column(type="boolean")

     */

    private $eliminado;

 

 

    /**

     * @var \Doctrine\Common\Collections\Collection

     * @ORM\OneToMany(targetEntity="Localizacion", mappedBy="area")

     */

    protected $localizaciones;

 

    /**

     * @var \SistemaReportes\SistemaReportesBundle\Entity\Zona

     * @ORM\ManyToOne(targetEntity="Zona", inversedBy="areas")

     * @ORM\JoinColumn(name="id_zona", referencedColumnName="id_zona")

     */

    private $idZona;

 

   

 

    /**

     * Get idArea

     *

     * @return integer

     */

    public function getIdArea()

    {

        return $this->idArea;

    }

 

    /**

     * Set nombreArea

     *

     * @param string $nombreArea

     * @return Area

     */

    public function setNombreArea($nombreArea)

    {

        $this->nombreArea = $nombreArea;

 

        return $this;

    }

 

    /**

     * Get nombreArea

     *

     * @return string

     */

    public function getNombreArea()

    {

        return $this->nombreArea;

    }

 

    /**

     * Set descripcion

     *

     * @param string $descripcion

     * @return Area

     */

    public function setDescripcion($descripcion)

    {

        $this->descripcion = $descripcion;

 

        return $this;

    }

 

    /**

     * Get descripcion

     *

     * @return string

     */

    public function getDescripcion()

    {

        return $this->descripcion;

    }

 

    /**

     * Set eliminado

     *

     * @param boolean $eliminado

     * @return Area

     */

    public function setEliminado($eliminado)

    {

        $this->eliminado = $eliminado;

 

        return $this;

    }

 

    /**

     * Get eliminado

     *

     * @return boolean

     */

    public function getEliminado()

    {

        return $this->eliminado;

    }

 

    /**

     * Set idZona

     *

     * @param \SistemaReportes\SistemaReportesBundle\Entity\Zona $idZona

     * @return Area

     */

    public function setIdZona(\SistemaReportes\SistemaReportesBundle\Entity\Zona $idZona = null)

    {

        $this->idZona = $idZona;

 

        return $this;

    }

 

    /**

     * Get idZona

     *

     * @return \SistemaReportes\SistemaReportesBundle\Entity\Zona

     */

    public function getIdZona()

    {

        return $this->idZona;

    }

}

 

Esta claro que puedo escribir las funciones pero se que Symfony las genera automáticamente, además seria poco productivo para un proyecto relativamente grande.

Si me pudieran ayudar se los agradecería mucho. Si necesitan el contenido de algun otro archivo para poder analizar el problema, no duden en pedírmelo.

Gracias desde ya,

Saludos…

Reply all
Reply to author
Forward
0 new messages