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

Se salta el error del formulario introducido por un listener

18 de diciembre de 2014

Hola, estoy intentando hacer como en el libro de "Desarrollo web ágil con Symfony" el Acepto las Condiciones a la hora de registrarse, pero en el momento de comprobar si es válido o no el formulario, aun añadiendo con el listener el error de que debe aceptar las condiciones, lo da como valido.

Haciendo debug, entra en el listener, me añade el error, cuando se va a hacer en el controlador $form->isValid() devuelve true, y al mirar los campos del formulario con el debug pone que el campo condiciones no tiene ningún error.

$builder->add('condiciones', 'checkbox', array(
    'required' => false,
    'mapped' => false
));
 
$listener = new RegistroTypeListener();
$builder->addEventListener(FormEvents::PRE_SUBMIT, array($listener, 'preSubmit'));
public function preSubmit(FormEvent $event)
{
    $formulario = $event->getForm();
    if (false == $formulario->get('condiciones')->getData()) {
        $formulario->get('condiciones')->addError(new FormError(
            'Debes aceptar las condiciones legales.'
        ));
    }
}

Respuestas

#1

Buenas, ¿puedes colocar el código completo del método buildForm() del formulario? Y el de la acción del controlador, porque con lo que muestras, parece estar todo bien.

Por otro lado, revisa los issues de Symfony en GitHub, me parece haber leído sobre ese problema en Symfony 2.6.

Saludos!

@manuel_j555

18 diciembre 2014, 19:33
#2

Hola, estoy usando la 2.5, te pongo lo que me pides:

public function registroAction(Request $request)
{
    $usuario = new Usuario();
    $formulario = $this->createForm(new RegistroFrontendType(), $usuario);
    $formulario->add('registrarme', 'submit', array(
        'label' => 'Registrarse'
    ));
    $formulario->handleRequest($request);
 
    if ($formulario->isValid()) {
        $encoder = $this->get('security.encoder_factory')
            ->getEncoder($usuario);
        $usuario->setSalt(md5(time()));
        $passwordCodificado = $encoder->encodePassword(
            $usuario->getPassword(),
            $usuario->getSalt()
        );
        $usuario->setPassword($passwordCodificado);
 
        $usuario->subirFoto($this->container->getParameter('imagenes.usuario'));
 
        $em = $this->getDoctrine()->getManager();
        $em->persist($usuario);
        $em->flush();
 
        //Lo añadimos a mailchimp
        $mailChimp = $this->get('MailChimp');
        $list = $mailChimp->getList();
        $list->Subscribe($usuario->getEmail());
        if($usuario->getEmailJugador()){
            $list->Subscribe($usuario->getEmailJugador());
        }
 
        $this->get('session')->getFlashBag()->add('success',
            '<strong>¡Enhorabuena!</strong> Te has registrado correctamente.'
        );
 
        $this->get('session')->getFlashBag()->add('info',
            '<strong>¡Confirmación!</strong> En brebe le llegará un correo de confirmación, mire su carpeta de entrada o spam y pinche en confirmar.'
        );
 
        $token = new UsernamePasswordToken($usuario, $usuario->getPassword(), 'frontend', $usuario->getRoles());
 
        $this->container->get('security.context')->setToken($token);
 
        return $this->redirect($this->generateUrl('usuarios_frontend_zonausuario'));
    }
 
    $this->getBreadCrumbs("Registro");
 
    return $this->render('UsuariosBundle:Frontend:registro.html.twig', array(
        'formulario' => $formulario->createView()
    ));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email', 'email')
        ->add('password', 'repeated', array(
            'type' => 'password',
            'invalid_message' => 'Las dos contraseñas deben coincidir',
            'first_options' => array('label' => 'Contraseña'),
            'second_options' => array('label' => 'Repite Contraseña'),
            'required' => false,
        ))
        ->add('licencia')
        ->add('primerApellido')
        ->add('segundoApellido')
        ->add('nombre')
        ->add('emailJugador', 'email', array(
            'required' => false,
        ))
        ->add('tutor')
        ->add('telefono')
        ->add('fechaNacimiento', 'mask', array(
            'format' => 'dd/MM/yyyy',
            'widget'  => 'single_text'
        ))
        ->add('genero', 'choice', array(
            'choices'   => array('m' => 'Chico', 'f' => 'Chica'),
            'empty_value' => 'Elige una opción',
 
        ))
        ->add('clubProcedencia')
        ->add('provincia')
        ->add('foto', 'file', array(
            'required' => false
        ))
    ;
 
    $builder->add('condiciones', 'checkbox', array(
        'required' => false,
        'mapped' => false
    ));
 
    $listener = new RegistroTypeListener();
    $builder->addEventListener(FormEvents::PRE_SUBMIT, array($listener, 'preSubmit'));
}
public function preSubmit(FormEvent $event)
{
    $formulario = $event->getForm();
    if (false == $formulario->get('condiciones')->getData()) {
        $formulario->get('condiciones')->addError(new FormError(
            'Debes aceptar las condiciones legales.'
        ));
    }
}

@AlbertoVioque

18 diciembre 2014, 21:10
#3

Bueno, todo se sigue viendo bien.

¿Qué versión exacta de symfony estás usando? las primeras versiones 2.5.x se que tuvieron problemas con la API de validación, por lo que saber eso ayudará.

Lo otro es que pruebes hacer un update de Symfony a ver si es un problema corregido:

$ composer update symfony/*

Y aprovechas de una vez y actualiza a symfony 2.6 que tiene unos añadidos muy útiles :)

@manuel_j555

19 diciembre 2014, 23:18
#4

Como te dije la versión es la 2.5 exacta o sea 2.5.0, ahora mismo no puedo cambiar de versión por limitación del servidor y fallo con algunas cuestiones de algún bundle, por lo que me tengo que ceñir a esta que no me falla excepto en esto que no se porque el valor de error para ese campo sale nulo después de que salte el listener.

Actualizado y sigue fallando

@AlbertoVioque

23 diciembre 2014, 11:35