Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Campo password vacio

Estas en el tema de Campo password vacio en el foro de Symfony en Foros del Web. Estoy generando un formulario para el perfil de usuario, y no se como dejar el campo contraseña vacío. He usado la instrucción 'data' => null ...
  #1 (permalink)  
Antiguo 22/07/2014, 07:23
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Campo password vacio

Estoy generando un formulario para el perfil de usuario, y no se como dejar el campo contraseña vacío.

He usado la instrucción 'data' => null y no parece funcionar.
He intentado con empty_value y empty_data, pero como veo en la documentación no valen para ese tipo de campo password repeated.

Código:
	public function buildForm(FormBuilderInterface $builder, array $options)
	{
		$builder
		->add('nombre')
		->add('apellidos')
		->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' => 'Repetir contraseña'),
			'required' => false,
			'data' => null	
			))
		->add('direccion')
		->add('provincia')
		->add('localidad')
		->add('cp')
		->add('fecha_nacimiento', 'birthday')
		->add('permite_email', 'checkbox', array('required' => false));
	}
Tambien desde twig he añadido el value null y tampoco

Código:
{{ form_widget(formulario.password, {value : null}) }}
El caso es que siempre que genera el formulario sale la contraseña anterior, y me gustaría dejarla vacía si el usuario solo quiere cambiar su dirección, etc.
  #2 (permalink)  
Antiguo 22/07/2014, 08:16
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Debes de usar la opción: always_empty
Con eso cuando hagas el submit y el form ejecute el metodo handleRequest la propiedad password sera null. ya lo demás es que el objeto determine si existe un cambio o bien traslades esa lógica al controlador.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 22/07/2014, 09:44
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

He sustituido el 'data' => null por 'always_empty' => true y me lanza el siguiente error:

Código:
The option "always_empty" does not exist. Known options are: "action", "attr", "auto_initialize", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_provider", "csrf_token_id", "csrf_token_manager", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "first_name", "first_options", "inherit_data", "intention", "invalid_message", "invalid_message_parameters", "label", "label_attr", "mapped", "max_length", "method", "options", "pattern", "post_max_size_message", "property_path", "read_only", "required", "second_name", "second_options", "translation_domain", "trim", "type", "validation_groups", "virtual"
Leí en la documentación que always_empty era por defecto true, lo que no entiendo es por que me dice que no existe o_O
  #4 (permalink)  
Antiguo 22/07/2014, 10:50
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Debes de utilizar la propiedad options para pasar a los dos password que se generan en el repeat
Código PHP:
Ver original
  1. ->add('password', 'repeated', array(
  2.             'type' => 'password',
  3.             'options' => array('required' => false, 'always_empty' => true)
  4.             'invalid_message' => 'Las dos contraseñas deben coincidir',
  5.             'first_options'  => array('label' => 'Contraseña'),
  6.             'second_options' => array('label' => 'Repetir contraseña'),
  7.             ))
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 23/07/2014, 11:03
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Muchas gracias pero sigue sin funcionar
El required false no funciona dentro del options, lo he sacado, como estaba. He probado con empty_data y data y tampoco

Código:
		->add('password', 'repeated', array(
			'type' => 'password',
			'invalid_message' => 'Las dos contraseñas deben coincidir',
			'first_options'  => array('label' => 'Contraseña'),
			'second_options' => array('label' => 'Repetir contraseña'),
			'options' => array('always_empty' => true),
			'required' => false
			))
La otra opción que veía más sencilla era modificar la pantilla twig, pero me pasa lo mismo, no me hace ni caso.

Código:
		<div class="error">{{ form_errors(formulario.password) }}</div>
		<span>{{ form_widget(formulario.password, {value : null}) }}</span>
  #6 (permalink)  
Antiguo 23/07/2014, 11:16
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: Campo password vacio

Una consulta... tienes guardada esa contraseña en el navegador? porque si es asi, nunca te mostrara este campo vacio, la forma que indica es hhs esta bien, yo lo tengo asi


Código PHP:
Ver original
  1. $builder->add('password', 'repeated', array(
  2.             'type' => 'password',
  3.             'first_options'  => array('label' => 'Contraseña'),
  4.             'second_options' => array('label' => 'Repita Contraseña'),
  5.             'invalid_message' => 'Las Contraseñas no son iguales',
  6.         ));


Y en la plantilla o vista

Código HTML:
Ver original
  1. <div class="div_cvEstandar_campo">
  2.           {{ form_label(form.password.first, null, {'label_attr': {'class': 'div_cvEstandar_label'}}) }}
  3.           {{ form_widget(form.password.first, {'attr': {'class': 'div_cvEstandar_input'}}) }}
  4. </div>
  5.                
  6. <div class="div_cvEstandar_campo">
  7.           {{ form_label(form.password.second, null, {'label_attr': {'class': 'div_cvEstandar_label'}}) }}
  8.           {{ form_widget(form.password.second, {'attr': {'class': 'div_cvEstandar_input'}}) }}
  9.                     <div class="msgbox error">{{ form_errors(form.password.first) }}</div>
  10. </div>
Saludos
__________________
Si encuentras que tu pregunta fue respondida, se agradeceria enormemente que la marcaras como solucionada... si... es el boton verde gigante que esta al final de la pagina :)
  #7 (permalink)  
Antiguo 24/07/2014, 04:39
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Si, desde Chrome borre todos los datos de navegación para asegurarme.

Yo creo que me sale por el propio contrrolador, lo raro es que si desde Twig le pongo value null, no se por que no me lo respeta.

Código:
	public function perfilAction()
	{
		$peticion = $this->getRequest();
		
		$usuario = $this->get('security.context')->getToken()->getUser();
		$formulario = $this->createForm(new UsuarioPerfilType(), $usuario);
		
		$passwordOriginal = $formulario->getData()->getPassword();
		$formulario->handleRequest($peticion);
		
		if ($formulario->isValid()) {
			// Si el usuario no ha cambiado el password, su valor es null después de hacer el getRequest(),
			// por lo que hay que recuperar el valor $passwordOriginal
			if (null == $usuario->getPassword()) {
				$usuario->setPassword($passwordOriginal);
			// Si el usuario ha cambiado su password, hay que codificarlo antes de guardarlo
			} else {
				$encoder = $this->get('security.encoder_factory')->getEncoder($usuario);
				$passwordCodificado = $encoder->encodePassword($usuario->getPassword(),$usuario->getSalt());
				$usuario->setPassword($passwordCodificado);
			}
			
			$em = $this->getDoctrine()->getManager();
			$em->persist($usuario);
			$em->flush();
			
			$this->get('session')->getFlashBag()->add('info', 'Los datos de tu perfil se han actualizado correctamente');

			return $this->redirect($this->generateUrl('compras'));
		}
		
		
		return $this->render('UsuariosBundle:Default:perfil.html.twig', array(
				'usuario' => $usuario,
				'formulario' => $formulario->createView()
		));
	}
  #8 (permalink)  
Antiguo 24/07/2014, 07:51
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Vaya que esta raro. Y si trabaja de forma correcta la acción ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 24/07/2014, 08:48
Avatar de fhederico  
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: Campo password vacio

Estimado,

Una consulta, tu formulario que campos muestra? o es solo para cambiar la password?? porque la verdad es que esta muy extraño xD

Te dejare una correcion basica, pero la logica interna de cuando se envia tu formulario no esta correcta tampoco, pero necesito saber la respuesta a la pregunta que te hago arriba primero.

Controller

Código PHP:
Ver original
  1. public function perfilAction()
  2. {
  3.         //Request actual
  4.     $request = $this->getRequest();
  5.     //Datos de la sesion del usuario que esta logueado actualmente
  6.     $usuario = $this->getUser();
  7.  
  8.         //Creamos el formulario
  9.     $form   = $this->createForm(new UsuarioPerfilType(), $usuario);
  10.        
  11.     $form->handleRequest($request);
  12.        
  13.     if ($form->isValid())
  14.        {
  15.             exit("ok, se envio");
  16.     }
  17.        
  18.     return $this->render('UsuariosBundle:Default:perfil.html.twig', array(
  19.         'usuario' => $usuario,
  20.         'form' => $form->createView()
  21.     ));
  22. }

NOTA: Fijate que cambie "formulario" por "form", asi que para la plantilla debera ir el nombre que tu indicas ahi

En tu UsuarioPerfilType, asumo que solo tiene dos campos por ahora a mostrar, tu deberas agregarle el tema de los botones "enviar", yo asumo que ya los tienes ahi agregados

Código PHP:
Ver original
  1. $builder->add('username', null, array('label'  => 'Nombre de Usuario'));
  2.        
  3.         $builder->add('password', 'repeated', array(
  4.                 'type' => 'password',
  5.                 'first_options'  => array('label' => 'Contraseña'),
  6.                 'second_options' => array('label' => 'Repita Contraseña'),
  7.                 'invalid_message' => 'Las Contraseñas no son iguales',
  8.             ));

Plantilla Twig o vista, como es una prueba podemos poner que el nos genere todo

Código HTML:
Ver original
  1. {{ form_rest(form) }}

Ahora si quieres mostrar los dos campos

Código HTML:
Ver original
  1. {# Username #}
  2. {{ form_label(form.username, null, {'label_attr': {'class': 'div_cvEstandar_label'}}) }}
  3. {{ form_widget(form.username, {'attr': {'class': 'div_cvEstandar_input'}}) }}
  4. <div class="msgbox error">{{ form_errors(form.username) }}</div>
  5.  
  6. {# Password Uno #}
  7.  
  8. {{ form_label(form.password.first, null, {'label_attr': {'class': 'div_cvEstandar_label'}}) }}
  9. {{ form_widget(form.password.first, {'attr': {'class': 'div_cvEstandar_input'}}) }}
  10.  
  11. {# Password Dos - repetir Pass #}
  12. {{ form_label(form.password.second, null, {'label_attr': {'class': 'div_cvEstandar_label'}}) }}
  13. {{ form_widget(form.password.second, {'attr': {'class': 'div_cvEstandar_input'}}) }}
  14. <div class="msgbox error">{{ form_errors(form.password.first) }}</div>


Fijarse que yo le agrego algunos estilos css con "attr" o "label_attr" o el mismo "msgbox error" esto lo puedes dejar o quitar, eso obviamente se debe adaptar a lo que requieras

Saludos
__________________
Si encuentras que tu pregunta fue respondida, se agradeceria enormemente que la marcaras como solucionada... si... es el boton verde gigante que esta al final de la pagina :)
  #10 (permalink)  
Antiguo 25/07/2014, 03:51
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Cita:
Iniciado por hhs Ver Mensaje
Vaya que esta raro. Y si trabaja de forma correcta la acción ?
Si, funciona todo correctamente, el problema es que si no quieres cambiar la contraseña, el usuario debe borrar la contraseña que sale en el primer campo, (el segundo campo si sale vacío).

Igual es que lo he enfocado mal, en un principio utilizaba el mismo formulario para el registro y el perfil, pero por este problema tuve que hacer uno para cada uno, por el asunto del campo required en la contraseña, que en el registro si debe de tener.

Fhederico, efectivamente se llama formulario, fíjate que en el ywig lo llamo también por formulario.password

El formulario es para cambiar el perfil entero del usuario, puedes ver el código completo en el primer post. No te pongo el código entero del twig por que s bastante extenso, en realidad lo que nos interesa es la parte de la contraseña.

Código:
		<div class="error">{{ form_errors(formulario.password) }}</div>
		<span>{{ form_widget(formulario.password, {value : null}) }}</span>
La label misteriosamente sale sola, si la incluyo sale dos veces, debe ser por la mecánica propia del tipo de campo repeated.
  #11 (permalink)  
Antiguo 25/07/2014, 15:27
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Generalmente puede resolverlo con un solo formulario, pero necesitas hacer uso de eventos: http://symfony.com/doc/current/cookb...ification.html
Estoy corto de tiempo pero en cuanto pueda extiendo un poco a lo que voy con todo esto.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #12 (permalink)  
Antiguo 25/07/2014, 17:41
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 21 años, 2 meses
Puntos: 24
Respuesta: Campo password vacio

Si colocas array ( 'mapped' => false ) no te seteará la propiedad del objeto $usuario, eso también te permite cambiar de nombre al campo para que el navegador no lo rellene, luego en el controlador (o mejor en un evento del formulario) puedes setear el nuevo password si es necesario.

Última edición por lisandro Arg; 25/07/2014 a las 18:02
  #13 (permalink)  
Antiguo 28/07/2014, 05:58
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Gracias hhs, voy leerme bien esa documentación que parece muy interesante.

Lisandro, una magnifica idea, he añadido el mapped al campo y..... nada, no funciona, lo sigue rellenando, esto es de brujas.

Código:
		->add('password', 'repeated', array(
			'type' => 'password',
			'invalid_message' => 'Las dos contraseñas deben coincidir',
			'first_options'  => array('label' => 'Contraseña'),
			'second_options' => array('label' => 'Repetir contraseña'),
			'options' => array('always_empty' => null),
			'required' => false,
			'mapped' => false
			))
Le estoy dando vueltas, y me huele que todo puede ser por el campo repeated. voy a probar un par de cosas a ver si funciona, que ahora estoy liado con el problema para subirlo a producción. Esto de pasar de la 1.4 a la 2.4 de golpe es demasiado para mi.
  #14 (permalink)  
Antiguo 28/07/2014, 06:26
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 21 años, 2 meses
Puntos: 24
Respuesta: Campo password vacio

si le cambias el nombre al campo me parece imposible que lo rellene de alguna forma
  #15 (permalink)  
Antiguo 28/07/2014, 08:47
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Derec puede publicar tu FormType completo para hacer una prueba.
Y otro detalle que no mencionaste pero es importante si estas migrando proyectos las dos versiones que se recomiendan son la 2.3 o la 2.5.2 que es la considerada estable con las características nuevas. Esta ultima tendrá soporte hasta este mes dando paso a la versión 2.6 después de esta estará disponible la versión 2.7 que sera la próxima versión TLS.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #16 (permalink)  
Antiguo 29/07/2014, 01:54
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Es la versión 2.4, de hecho el salto de la 1.4 a la 2.0 lo di con la 2.3 por que quería empezar con una versión más estable.

Te adjunto el Formtype:

Código:
<?php
namespace Magic\UsuariosBundle\Form\Frontend;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UsuarioPerfilType extends AbstractType
{
	public function buildForm(FormBuilderInterface $builder, array $options)
	{
		$builder
		->add('nombre')
		->add('apellidos')
		->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' => 'Repetir contraseña'),
			'options' => array('always_empty' => null),
			'required' => false,
			'mapped' => false
			))			
		->add('direccion')
		->add('provincia')
		->add('localidad')
		->add('cp')
		->add('fecha_nacimiento', 'birthday')
		->add('permite_email', 'checkbox', array('required' => false));
	}
	
	public function setDefaultOptions(OptionsResolverInterface $resolver)
	{
        $resolver->setDefaults(array(
            'data_class' => 'Magic\UsuariosBundle\Entity\Usuarios',
            'validation_groups' => array('default', 'registro')
        ));
	}

	public function getName()
	{
		return 'frontend_usuario';
	}
}
  #17 (permalink)  
Antiguo 31/07/2014, 14:39
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Campo password vacio

Delek en tu clase cambia esto:
Código PHP:
Ver original
  1. 'options' => array('always_empty' => null),
Por esto
Código PHP:
Ver original
  1. 'options' => array('always_empty' => true),
Probando en un sitio que tengo con acceso , me tope que cuando tengo guardado el acceso con usuario y contraseña en algunas circunstancias el navegador (Firefox) rellena el campo de usuario y password con los datos guardados. Debe de ser algo con el navegador por eso cuando haces null el value del campo no te lo respeta.
Intente probar en tu sitio en la liga que publicaste, pero todavía tienes el problema de la extensión intl.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #18 (permalink)  
Antiguo 01/08/2014, 07:30
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Campo password vacio

Perfecto hhs, funciona perfectamente, mil gracias.
¡¡¡menuda chorrada, y los quebraderos de cabeza que me ha dado!!! Y fíjate que al principio lo tenia como true, no se por que lo cambiaría XD

De nuevo muchas gracias a todos y disculpas por el tiempo que habéis empleado en este problema.

Respecto a lo del intl, llevan tres dias sin contestar, ya les comenté si me podían mandar un tutorial o algo para instalar la extensión.

Última edición por Delek; 01/08/2014 a las 07:35

Etiquetas: campo, password, vacio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:38.