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
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
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
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
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