Bienvenidos sean a este post, hoy veremos todo lo necesario para agregar el reseteo de la contraseña.
Para comenzar primero crearemos un nuevo archivo llamado reset.php dentro del directorio:
app/views/admin/auth
Una vez creado el nuevo archivo le agregaremos el siguiente codigo:
reset.php
<?php include(APPDIR.'Views/layouts/header.php');?>
<div class="wrapper well">
<?php include(APPDIR.'Views/layouts/errores.php');?>
<h1>Reseteo de Cuenta</h1>
<form method="post">
<div class="control-group">
<label class="control-label" for="email"> Email</label>
<input class="form-control" id="email" type="text" name="email" />
</div>
<br>
<p class="pull-left">
<button type="submit" class="btn btn-sm btn-success" name="submit">Enviar email de reseteo</button>
</p>
<p class="pull-right"><a href="/admin/login">Login</a></p>
<div class="clearfix"></div>
</form>
</div>
<?php include(APPDIR.'Views/layouts/footer.php');?>
Este sera una pagina simple para que ingresemos en un formulario la direccion de correo electronico donde lo usaremos para que la persona reciba el link para el reseteo, tal como se hace en muchas paginas actualmente, recuerden que muchos de los class que tenemos son provenientes del bootstrap que configuramos para este proyecto, el siguiente paso sera ir al archivo admin.php en el directorio Controllers y en este agregaremos un nuevo metodo dentro de la clase llamado reset, veamos el codigo:
public function reset()
{
if(Sesion::get('logueado'))
Url::redireccionar('/admin');
$errores = [];
if (isset($_POST['submit']))
{
$email = (isset($_POST['email']) ?
$_POST['email'] : null);
if (!filter_var($email,FILTER_VALIDATE_EMAIL))
{
$errores[]='Ingresa un email valido';
} else {
if ($email!=$this->usuario->
get_email($email))
{
$errores[]="Correo no encontrado";
}
}
if (count($errores) == 0)
{
$token=md5(uniqid(rand(),true));
$datos=['token_reset'=>$token];
$where=['email'=>$email];
$this->usuario->update($datos,$where);
$mail = new PHPMailer(true);
$mail->setFrom('noreply@tinchicus.com');
$mail->addAddress($email);
$mail->isHTML(true);
$mail->Subject="Reset a tu clave";
$mail->Body = "<p>Para cambiar tu contraseña haz click <a href='http://localhost:8000/admin/cambia_clave/$token'>en este link</a></p>";
$mail->AltBody = "Para cambiar tu contraseña ve a la siguiente direccion: http://localhost:8000/admin/cambia_clave/$token";
$mail->send();
Sesion::set('exito',"Email enviado a " .
htmlentities($email));
Url::redireccionar('/admin/reset');
}
}
$titulo = "Reseteo de cuenta";
$this->view->render('admin/auth/reset',
compact('titulo','errores'));
}
Lo primero que tendremos en este metodo sera un condicional donde verificamos si existe la clave logueado, en caso de ser verdadero nos redirecciona a admin, luego tenemos un array de errores tal como vimos en este post cuando hablamos del metodo login, nuestro siguiente paso sera un condicional donde verificamos si hicimos el submit de nuestro formulario, si esto es verdadero tendremos el siguiente condicional:
$email = (isset($_POST['email']) ? $_POSt['email'] : null);
Donde verificaremos si se paso una direccion de correo al momento de apretar el boton de envio de reset.php, en caso de ser verdadero lo almacena en email de lo contrario almacena un valor null en email, lo siguiente sera este condicional:
if (!filter_var($email,FILTER_VALIDATE_EMAIL))
{
$errores[]='Ingresa un email valido';
} else {
if ($email!=$this->usuario->
get_email($email))
{
$errores[]="Correo no encontrado";
}
}
En este caso utilizaremos a filter_var para verificar que el valor almacenado en email sera una direccion valida de correo electronico, para esta condicion le agregamos un negador lo cual hara que se cumpla la condicion cuando la direccion de correo no sea valida, de esta forma ingresara un valor dentro del array llamado errores indicando que ingresemos un mail valido, despues tendremos un else donde habra otro condicional donde verifica si el valor de email es distinto del obtenido por el metodo get_email, en caso de ser verdadero procede a almacenar en errores que no fue encontrado el correo, por lo tanto ahora tenemos una condicion donde no solo verifica si existe o no el correo en la base sino tambien su sintaxis para validar solo correos correctos.
Lo siguiente es un condicional donde cuenta los elementos en errores, en caso de ser cero procede a ejecutar el bloque, en este caso primero crearemos a nuestro «token» de reset, por medio de md5 para obtener un hash del numero al azar generado por rand, despues crearemos un array llamado datos donde almacenaremos el token antes generado con la clave token_reset, despues definiremos un array llamado where donde le pasaremos el email que supuestamente esta correcto, por ultimo a traves de update actualizamos el token del email, con esto ya tenemos el token para el reseteo de nuestro usuario en la tabla, lo siguiente es lo mas interesante.
Esta es la parte mas interesante, primero crearemos un objeto de PHPMailer al cual llamaremos mail, con nuestro objeto creado estableceremos los distintos campos del correo electronico, veamos cada uno de ellos:
- setFrom, establece cual es el remitente
- addAddress, agrega el destinatario
- isHTML, establece si es un mensaje HTML
- Subject, establece el asunto del mensaje
- Body, establece el cuerpo del mensaje en HTML
- AltBody, establece el cuerpo del mensaje como solo texto
Por ultimo tenemos el metodo send para enviar el mail que creamos anteriormente, por ultimo creamos una nueva clave llamado exito con el mensaje de email enviado, por ultimo nos redireccionamos al metodo reset nuevamente, con esto terminamos el condicional, por ultimo definimos el titulo y llamamos a render para que dibuje la pagina de reset y enviemos al valor del titulo y errores (en caso de existir).
Nota: Recuerden que la direccion http://localhost:8000/ es solo para hacer las pruebas ahora y en caso de usarlo deben usar una direccion real.
Pero antes de finalizar debemos agregar las siguientes dos lineas junto a la importacion de las otras clases al comienzo de la clase admin:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
Con esto nos permitira crear correctamente el objeto de PHPMailer para poder enviar nuestros correos desde el formulario.
En resumen, hoy hemos visto al metodo reset y su pagina, tambien hemos visto como armar el mail y enviarlo, asi como tambien verificar que se haya pasado o ingresado correctamente, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
