Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony createFormBuilder Array

15 de octubre de 2015

Hola tengo un formulario simple con FormBuilder armado:

$form = $this->createFormBuilder($plans)
                ->add('name', 'text', array('label' => 'Nombre'))
                ->add('price', 'text', array('label' => 'Precio'))
                ->add('description', 'text', array('label' => 'Detalle'))
                ->add('ean13', 'text', array('label' => 'Ean13'))
                ->add('talle', 'choice', array('choices' => array('30'   => '30','31' => '31','32'   => '32',),'multiple' => true,),array('data' => '30'))
                ->add('color', 'choice', array('choices' => array('rojo'   => 'Rojo','negro' => 'Negro','blanco'   => 'Blanco',),'multiple' => true,))
                ->add('save', 'submit', array('label' => 'Guardar'))
                ->add('saveAndAdd', 'submit', array('label' => 'Guardar y Agregar uno Nuevo'))
                ->getForm();

El tema es que no tengo los campos color y talle definidos como array en la base de datos ya que tengo que crear una fila por cada registro. Eso lo soluciono con un foreach al momento de guardar los datos, pero el problema se me presenta al querer editar un registro.

El FormBuilder me dice que talle y color no son array. ¿hay forma de crear esos dos campos del formulario pasandole yo los datos?

Ya intenté pasarle los datos con data al final array('data' => '30') y nada me sigue diciendo que talle no es un array.

Unable to transform value for property path "talle": Expected an array.

¿Alguna idea?

No se como insertar los datos a ese campo yo y que no los tome de la base de datos automáticamente.


Respuestas

#1

No me hagas mucho caso porque no entiendo los formularios de Symfony, pero creo que en este caso podrías usar los Data Transformers.

@javiereguiluz

15 octubre 2015, 8:37
#2

Yo te recomendaría o bien como dice Javier, de usar un data transformers o mi idea, que es que los campos talla y color sean entidades independientes y que esten relacionadas con la entidad princial.

Tu usa la que mejor te venga

@TsubasaAkai

15 octubre 2015, 13:03
#3

@TsubasaAkai tu idea también funcionaría, pero ¿no te parece un poco compleja para este caso? Luego tendría que embeber colecciones de formularios para el color y la talla dentro del formulario principal.

@javiereguiluz

15 octubre 2015, 13:22
#4

Buenas, @xub ¿podrias indicarnos si la variable $plans que le pasas al form es una entidad? y de ser así, ¿Tienes definidos los atributos color y talle como arreglos? Porque si los tienes como arreglos, no deberías hacer nada ni en la entidad ni en el formulario para que te funcione.

Entonces, acá hay dos posibilidades:

Caso 1

Si $plans es una entidad, la definición correcta para los atributos color y talle es:

/**
 * @ORM\Column(type="array")
 */
private $color;
 
/**
 * @ORM\Column(type="array")
 */
private $talle;

Con esto el guardado y manejo de los valores de arreglos es transparente en doctrine, y en el form la data que le llegará a los campos será la adecuada.


Caso 2

El otro caso es que $plans sea un arreglo, si es así, debes asegurarte que el valor de los indices color y talle sean null, array o un objeto iterable, pero no pueden ser otra cosa:

$plans['color'] = null;
$plans['talle'] = array(30, 32);

Saludos!

@manuel_j555

15 octubre 2015, 13:47
#5

hola aca esta la parte que faltaba

$em = $this->getDoctrine()->getManager();
        $plans = $em->getRepository('AppBundle:Product')->find($id);
        if (!$plans) {
            throw $this->createNotFoundException(
                    'No news found for id ' . $id
            );
        }
 
        //var_dump(Product::getTalles($plans->getName()));
        $form = $this->createFormBuilder($plans)
                ->add('name', 'text', array('label' => 'Nombre'))
                ->add('price', 'text', array('label' => 'Precio'))
                ->add('description', 'text', array('label' => 'Detalle'))
                ->add('ean13', 'text', array('label' => 'Ean13'))
                ->add('talle', 'choice', array('choices' => array('30' => '30', '31' => '31', '32' => '32',), 'multiple' => true,), array('data' => '30'))
                ->add('color', 'choice', array('choices' => array('rojo' => 'Rojo', 'negro' => 'Negro', 'blanco' => 'Blanco',), 'multiple' => true,))
                ->add('save', 'submit', array('label' => 'Guardar'))
                ->add('saveAndAdd', 'submit', array('label' => 'Guardar y Agregar uno Nuevo'))
                ->getForm();

justamente no tengo definidos a talle y color como array en la entidad porque no me sirve guardar en la base el dato como array ya que cada codigo puede tener su precio cantidad etc

El tema de transformers lo vi pero no tengo idea como pasarle al formbuilder yo el dato como un array Lo que tengo que hacer es una consulta a la base que me de para el codigo 1000 los colores y los talles que tienen luego ese array pasarselo a mano al formbuilder en esta linea

->add('talle', 'choice', array('choices' => array('30' => '30', '31' => '31', '32' => '32',), 'multiple' => true,), array('data' => '30'))

si alguien sabe como hacer eso y me muestra como quedaria la linea ya esta ...

porque asi como esta lo que intenta hacer FormBuilder es traer el valor de el campo talle directo de la base de datos ...

@xub

15 octubre 2015, 19:02
#6

SOLUCIONADO

$plans->setColor(array('data' => 'blanco'));
$form = $this->createFormBuilder($plans)

:-)

@xub

16 octubre 2015, 15:40