Hola, estoy siguiendo este tutorial
Todo funciona perfecto, el inconveniente viene cuando quiero establecer un dato por defecto para el campo que se agrega de manera dinamica, siguiendo el ejemplo:
$form->add('position', 'entity', array( 'class' => 'AppBundle:Position', 'placeholder' => '', 'choices' => $positions, ));
Yo quiero agregar un campo de texto con un valor por defecto:
$form->add('newField', 'text', array( 'data' => 'Any data', ));
Después del envio del formulario mediante ajax tal como lo indica la documentation el campo newField se muestra pero sin ningún valor por defecto.
Alguna sugerencia de como debe hacer esto?
Gracias.
Respuestas
Cuando se envia formulario, aunque en el método PRE_SUBMIT
le damos un valor por defecto al campo al añadirlo al form con la opción data
, luego del pre_submit toda la data de los campos es actualizada en base a lo que se ha enviado desde el navegador, por eso es que no vez el valor por defecto que estableces.
La solución a esto es actualizar la data en el evento pre_submit, ejemplo:
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { $data = $event->getData(); $data['newField'] = 'Valor por defecto'; $event->setData($data); });
Acá, no hizo falta volver a añadir el campo al formulario, ya que lo unico que se quiere es actualizar su valor a uno en especifico, suponiendo claro que ese valor dependerá de ciertas condiciones, ya que de lo contrario, el campo siempre tendrá dicho valor, por más que enviemos algo distinto desde el navegador.
Saludos!!!
@manuel_j555
Hola @manuel_j555 gracias por tu respuesta.
Efectivamente la manera como indicas funciona para un campo de tipo texto.
Mi problema es que quiero hacer lo mismo con un campo de tipo collection y la data no se muestra, he verificado que exista datos y efectivamente los hay.
Con el tipo collection se debe hacer algo adicional?
Gracias.
@ramiroanacona
Podrias mostrar como lo estás haciendo?
@manuel_j555
Hola @manuel_j555
La parte de jQuery lo tengo hecho tal como está en la doc.
De esta manera, pone todos los campos, pero el problema es que los deja vacíos.
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('producto', 'choice', [ 'choices' => $this->entityManager->getRepository('AppBundle:Productos')->findAll(), // No mas de 20 'required' => true, 'placeholder' => 'Seleccione', ]) ->add('detalles', 'collection', [ 'type' => new DetalleProductoType(), ]) ; $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { $form = $event->getForm(); $data = $event->getData(); $datallesByProducto = $this->entityManager->getRepository('AppBundle:DetalleProducto')->findDetallesByProducto($data['producto']); $form->get('detalles')->setData($datallesByProducto); }); }
Probe de la manera que comentaste:
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('producto', 'choice', [ 'choices' => $this->entityManager->getRepository('AppBundle:Productos')->findAll(), // No mas de 20 'required' => true, 'placeholder' => 'Seleccione', ]) ->add('detalles', 'collection', [ 'type' => new DetalleProductoType(), ]) ; $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { $form = $event->getForm(); $data = $event->getData(); $datallesByProducto = $this->entityManager->getRepository('AppBundle:DetalleProducto')->findDetallesByProducto($data['producto']); $data['detalles'] = $datallesByProducto; $event->setData($data); }); }
Y obtengo este error después de enviar el form: Este formulario no debería contener campos adicionales. y no muestra los campos.
Espero me entiendas y puedas ayudarme.
Gracias.
@ramiroanacona
¿Puedes explicar que intentas hacer realmente?.
Con el código que has mostrado lo que veo es que deberías tener esa funcionalidad dividida en dos páginas (puede ser ajax para que a ojos del usuario, solo sea una), una página que pida el producto, y otra que consulte los detalles del producto y muestre la colección de elementos.
Te lo digo porque veo que estableces la colección de elementos en el PRE_SUBMIT
, pero entonces estas reemplazando los datos enviados por el usuario desde el navegador, y el mismo nunca podrá hacerle ningun cambio a dichos datos.
@manuel_j555
Hola @manuel_j555,
Lo he resuelto justo como dices, "funcionalidad dividida en dos páginas" y funciona perfectamente.
Gracias por tu ayuda.
@ramiroanacona