Symfony: [Form] [3.0] setData en FormEvents :: SUBMIT no funciona en formas compuestas

Creado en 12 may. 2016  ·  3Comentarios  ·  Fuente: symfony/symfony

Si tiene una forma compuesta y llama a setData() con datos modificados dentro de un oyente para FormEvents::SUBMIT los datos no se modifican correctamente. Cuando finaliza la función handleRequest() , normdata, viewdata y modeldata de la forma compuesta son correctos, pero los valores de las formas secundarias no han cambiado. Si llama a $form->createView() después de esto, el formulario no contiene los cambios.

Código de ejemplo para reproducir el error:
Controlador:

public function newAction(Request $request)
    {
        $form = $this->createForm(FormName::class);
        $form->handleRequest($request);
        return $this->render(
            "AppBundle:Default:form.html.twig",
            [
                'form' => $form->createView()
            ]
        );
    }

Formulario:

class FeatureType extends AbstractType implements EventSubscriberInterface
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->addEventSubscriber($this)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => 'Cat\AppBundle\PlainClasses\Form\FeatureDTO']);
    }

    public static function getSubscribedEvents()
    {
        return [
            FormEvents::SUBMIT => 'submit'
        ];
    }

    public function submit(FormEvent $event)
    {
        $data = $event->getData();
        $data->name = 'test';
        $event->setData($data);
    }
}

DTO:

class FeatureDTO
{
    /**
     * <strong i="18">@var</strong> string
     */
    public $name;
}

Con este código, verá que normdata, viewdata y modeldata del formulario completo featureType se actualizan y el nombre se establece en 'prueba' pero el formulario secundario, el formulario de nombre que es un TextType, todavía tiene un valor vacío, así que si renderizar el formulario, el campo de nombre permanece vacío.

Bug Form Needs Review Unconfirmed

Comentario más útil

Puedo reproducirlo, pero no es un error. Es un poco complicado de explicar, digamos que los niños se someten antes.

tienes dos opciones para solucionarlo:

  • Agregue el evento al subtipo como
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        ;

        $builder
            ->get('name')
            ->addEventSubscriber($this);
    }
  • Utilice PRE_SUBMIT de los eventos de formulario

Espero que esto te ayude

Todos 3 comentarios

En resumen: el cambio de datos al usar setData cambia los datos, pero este cambio no se propaga a los niños. Entonces, al representar el formulario después de esto, los campos del formulario aún tienen los valores anteriores.

Puedo reproducirlo, pero no es un error. Es un poco complicado de explicar, digamos que los niños se someten antes.

tienes dos opciones para solucionarlo:

  • Agregue el evento al subtipo como
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        ;

        $builder
            ->get('name')
            ->addEventSubscriber($this);
    }
  • Utilice PRE_SUBMIT de los eventos de formulario

Espero que esto te ayude

Ya esperaba que el envío de los niños se hubiera manejado antes. No puedo usar la primera opción porque quiero cambiar un campo diferente (por ejemplo, 'edad') que está en el mismo nivel que 'nombre'. Entonces, si manejo un evento en el nombre, no puedo cambiar los datos de otro campo, luego el nombre, AFAIK.
Entonces tendré que ir por las segundas opciones. Luego tengo que resolver algunas entidades yo mismo que se habrían resuelto automáticamente si pudiera usar el evento SUBMIT.

En mi humilde opinión, sería muy útil agregar un flujo de trabajo extendido con formularios secundarios a la página Eventos de formulario en el libro de recetas (http://symfony.com/doc/current/components/form/form_events.html). Esto ayudaría a comprender cuándo se activa qué evento en qué formulario (padre o hijo).

¿Fue útil esta página
0 / 5 - 0 calificaciones