Registración de usuarios nuevos

Hola, estoy desarrollando un sistema en el cual los usuarios deben registrarse para acceder.
El usuario al registrarse recibe un mail en su casilla para la confirmacion.
Al hacer clic en el link debe llevarlo a la pagina de inicio de sesion para que pueda logearse.
La consulta seria como se debe armar ese link de confirmacion que lo lleve directo a la pagina de login desde el mail recibido.
Adjunto la imagen del arbol de componentes y el código referido.
Mil gracias!


<?php
 class ci_registracion extends proyecto_ci{
 
 function evt__formulario__alta($datos)
 {
 	try {
			toba::instancia()->agregar_usuario($datos['usuario'],$datos['nombre'], $datos['contrasenia']);
			toba::instancia()->vincular_usuario('proyecto', $datos['usuario'], 'admin',200000001);
			} catch (toba_error_validacion $e) {
				toba::notificacion()->agregar($e->getMessage());
			}


 	$this->dep('dt_jugadores')->set($datos);
 	$this->dep('dt_jugadores')->sincronizar();
    $this->enviar_mail_aviso_cambio($datos);
 	$this->controlador->set_pantalla('login');
 }

 	function evt__formulario__cancelar() {
 		$this->controlador->set_pantalla('login');
 	}

 	//----------------------------------------------------------------------------------------
	//-------- Envio del email de solicitud de registro----------------------------------------
	//----------------------------------------------------------------------------------------
	
	//Envio un primer mail con un link para confirmar el cambio, si no lo usa... fue
	function enviar_mail_aviso_cambio($datos)
	{
		//Genero un pseudorandom unico...
		$tmp_rand = $this->get_random_temporal();
		//Genero el link para el mail
		$vinculos = $this->generar_link_confirmacion($datos['usuario'], $tmp_rand);
		//Se envia el mail a la direccion especificada por el usuario.
	    $asunto   = 'Solicitud de cambio de contraseña';
		$cuerpo_mail =	'<p>Este mail fue enviado a esta cuenta porque se <strong>solicito la registracion al Portal de proyecto</strong>.'
						.'Si usted solicito dicho cambio haga click en el siguiente enlace para confirmarlo:
'
						.$vinculos['click'].'

'
						.'Si tiene problemas para conectarse al mismo, copie la siguiente dirección en la ventana de su navegador preferido:
'
						.$vinculos['enlace'].'</p>';
		//Guardo el random asociado al usuario y envio el mail
		toba::instancia()->get_db()->abrir_transaccion();
		try {
			//$this->guardar_datos_solicitud_cambio($datos['usuario'], $tmp_rand, $datos['email']);
			toba::instancia()->get_db()->cerrar_transaccion();
			$mail = new toba_mail($datos['email'], $asunto, $cuerpo_mail);
			$mail->set_html(true);
			$mail->enviar();
		} catch (toba_error $e) {
			toba::instancia()->get_db()->abortar_transaccion();
			throw new toba_error($this->error_cambio);
		}
	}

	function get_random_temporal()
	{
		$uuid = uniqid(rand(), true);
		$rnd  = sha1(microtime().$uuid.rand());
		return $rnd;
	}

	function generar_link_confirmacion($usuario, $random)
	{
		$path            = toba::proyecto()->get_www();
	    $opciones        = array('param_html' => array('tipo' => 'normal' , 'texto' => 'Cliquee aquí'), 'prefijo' => 'http://'.$_SERVER['SERVER_NAME'].$path['url']);
	    $opciones_enlace = array('prefijo' => 'http://'.$_SERVER['SERVER_NAME'].$path['url']);
	    $parametros      = array('usuario' => $usuario, 'randr' => $random);
	    $vinculos        = array('click'  => toba::vinculador()->get_url(null, null, $parametros, $opciones),
								 'enlace' => toba::vinculador()->get_url(null, null, $parametros, $opciones_enlace));
		return $vinculos;
	}
 }
?>

estructura.png

estructura.png

Hola

Ya solucionastes este problema?

Emilio

Aun no. No le encuentro la vuelta.

la funcion

toba::vinculador()->get_url(null, null, $parametros, $opciones),

el primer parametro es el proyecto y el segundo es el item.

Si pones el item en el segundo, no funciona?

otra chance, en el mismo vinculador es la funcion “navegar_a” que dispara un javascript.

depende del funcionamiento que le quieras dar.

Probe con la primera opcion:
Reemplace la linea que decia con esto toba::vinculador()->get_url(null, null, ‘tenis’, ‘login’) , login porque es el identificador del componente
y el link que me crea esa funcion es: l?&ai=tenis||login&ts=l&tcm=l&toba-cron=1&tm=1 y probe ponerlo en el navegador pero no funciona.

con otra funcion, aunque van todas a parar al mismo lado

$vinculo_recuperar = toba::vinculador()->crear_vinculo('gestion','3787',array(),array('param_html'=>array('texto'=>'Recuperaci&oacute;n de clave')));

echo "<div class='login-titulo'><strong> $vinculo_recuperar.</strong></div>";

donde gestion es el proyecto y 3787 es el item de la operacion que hace referencia

Emilio

Hola Martin,

te hago una consulta… que URL te devuelve con el codigo que pasteaste en el primer post?. Decis que no funciona… pero no detallas porque no funciona o que error ves.

Tene en cuenta que algunos de los caracteres que se usan al armar la url de toba no son validos para la web… sin embargo, existe un parametro $uri_valida en el metodo get_url que te codifica dichos caracteres para que los clientes de mail puedan interpretar correctamente los links generados.

Saludos

Volvi a probar lo primero que tenia y salio andando, asi que quedo solucionado el problema de la creacion del link a la pagina de inicio pero ahora necesitaria que el usuario al hacer click en el link se habilite su cuenta, o sea vuelve al inicio y desde ahi habilitar la cuenta, hay alguna forma de pasarle parametros u obtener el mail del cual se obtiene la confirmacion ya que el link que me crea me lo muestra dentro del mismo.
Muchas gracias!

Hola Martin,

la habilitacion de la cuenta se deberia hacer previo al login, asi que probablemente la operacion que haga esa habilitacion, no deberia ser la misma. Una vez habilitada, redireccionas hacia el login para que la persona se autentique.

hay alguna forma de pasarle parametros u obtener el mail del cual se obtiene la confirmacion ya que el link que me crea me lo muestra dentro del mismo.

No entiendo bien que es lo que queres recuperar, el mail de origen va a estar bastante complicado… de hecho no creo que los browser lo reporten en el referrer cuando se abren desde un cliente de mail. Si encima se acceden desde un servicio online, mas complicado por el redirect que hacen justamente para que no quede registro desde donde venis.

Al link le podes pasar los parametros que quieras, todo lo que le envies al metodo get_url va a terminar en el link, en particular me parece que pasar la cuenta de mail via URL no es muy sano… fijate que nosotros intentamos enviar un RND de unico uso al link, que es lo que queda asociado al id de cliente.

A ese RND podes tener asociados todos los datos que quieras, de la otra forma tenes que pasar cada vez mas parametros y al ser legibles, la tentacion a ser cambiados es mayor :stuck_out_tongue: jajaja.

Saludos

No entiendo bien que es lo que queres recuperar, el mail de origen va a estar bastante complicado... de hecho no creo que los browser lo reporten en el referrer cuando se abren desde un cliente de mail. Si encima se acceden desde un servicio online, mas complicado por el redirect que hacen justamente para que no quede registro desde donde venis.
La idea seria recuperar algo identificatorio para saber quien fue el usuario que abrio ese link y al probar los link que me generaba mostraban el mail del usuario por eso decia lo de recuperar el mail.
fijate que nosotros intentamos enviar un RND de unico uso al link, que es lo que queda asociado al id de cliente.
Hay alguna forma de recuperar esa RND cuando el usuario abra el link de forma que pueda obtenerlo y asi identificar al cliente?

Saludos.

Hola Martin,

nunca vas a saber a ciencia cierta quien abre el link, si es el usuario real o un flaco que intercepto el mismo y pego el link en el browser, solo podes saber si el link que te envian es valido o no y si se mapea a un usuario que tenes vos internamente. Pero quien estaba detras del teclado cuando se clickeo?.. unicamente la NSA.

Hay alguna forma de recuperar esa RND cuando el usuario abra el link de forma que pueda obtenerlo y asi identificar al cliente?

Todo lo que pases por parametro al vinculo te va a venir cuando se invoque el mismo, es una URL con parametros como cualquier otra.

Saludos

En mi caso, tengo una pantalla de “Recurperar mi clave” donde el usuario ingresa su DNI (que es el usuario registrado en Toba_usuarios). El sistema debería enviarle un mail con una clave autogenerada.
Mi pregunta es:
Sin conectarme y hacer una consulta manual a la base de toba… existe algún método (de la clase toba_usuario por ejemplo) que me permita obtener el DNI almacenado en toba_usuarios a partir del id de usuario?
Gracias!

Hola Marcelo,

Hasta donde veo no, no existe un metodo para recuperar el DNI. Creo que vas a tener que hacer la consulta manualmente a la instancia.
Saludos

Richard, lo pude solucionar mediante la clase toba_instancia, de la siguiente manera:

$datos_usuario = toba::instancia()->get_info_usuarios(array($usuario))

Espero le sirva a alguien mas!
Saludos y gracias!

Había un error en mi comentario… lo que necesitaba saber era como obtener el MAIL (no el DNI como decía, y que no se almacena en toba_usuarios).
Gracias y disculpas!

Marcelo,

te iba a proponer el uso de dicha funcion hasta que note que necesitabas recuperar el DNI, dato que no viene entre los recuperados por esa consulta. No siendo el caso, es la forma correcta de recuperar los datos del usuario.

Saludos

Retomo el tema con la siguiente situación:
Estoy con una operación en la que el usuario se auto-genera usuario y clave (en la misma operación ingresa su dirección de correo), y toda esa info se guarda con:

  • toba::instancia()->agregar_usuario( --datos del usuario --)
  • toba::instancia()->vincular_usuario( --datos-- ) para vincularlo al proyecto.

Esa dirección de correo, es luego utilizada para la opción “Recuperar clave” (se envía un mail con una nueva clave).

La pregunta puntual es: Luego de crear el usuario por primera vez (con todos sus datos), es posible que el usuario pueda actualizar su mail (todo esto sin crear una conexión manual a la base), y solo utilizando métodos ya definidos (como se usa para la creación)?

Gracias!

Hola Marcelo,

como los usuarios son de la instancia, siempre se pensó que toda actualización de datos se hiciera via toba_usuarios , de todas formas… eso no impide que el proyecto pueda “importar” la operacion de usuarios, hacerle las modificaciones que crea convenientes y luego exponerla como propia, permitiendo asi que el usuario pueda por sí mismo modificar sus datos.

Obviamente para que esto funcione, vas a tener que registrar la instancia de toba como fuente del proyecto y ademas copiar alguna clase desde toba_usuarios. Una vez tengas aggiornada la operación podes hacer que el usuario entre a modificar los datos que creas pertinentes.

Si vas por el camino de hacer una operación puntual para el cambio del mail, las dos opciones que tenes son:

  • Registrar la fuente y usar DT.
  • Hacer uso del modelo para obtener la conexión a la instancia.

La API está definida alrededor de lo que necesita el runtime del framework para operar, que mayormente es recuperación de datos… no la manipulación de los mismos, por lo que no existe un método especifico para manipular los datos del usuario.

Saludos