miércoles, 25 de noviembre de 2015

14 - Tutorial de Laravel 5 - Update (Actualizar password de usuario)




En este capítulo del Tutorial de Laravel 5 continuamos agregando opciones al Panel de Usuario, concretamente agregaremos la opción para que el usuario pueda actualizar su password. Para que el usuario pueda cambiar su password le solicitaremos la condición de que introduzca su actual password.

Primero agregaremos la clase "Hash" al controlador UserController ...

use Hash;


Crearemos dos acciones en UserController, la acción password que contendrá el formulario y la acción updatePassword que procesará los datos del formulario.

Código de la acción password ...

    public function password(){
        return View('user.password');
    }


Código de la acción updatePassword ...

    public function updatePassword(Request $request){
        $rules = [
            'mypassword' => 'required',
            'password' => 'required|confirmed|min:6|max:18',
        ];
        
        $messages = [
            'mypassword.required' => 'El campo es requerido',
            'password.required' => 'El campo es requerido',
            'password.confirmed' => 'Los passwords no coinciden',
            'password.min' => 'El mínimo permitido son 6 caracteres',
            'password.max' => 'El máximo permitido son 18 caracteres',
        ];
        
        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails()){
            return redirect('user/password')->withErrors($validator);
        }
        else{
            if (Hash::check($request->mypassword, Auth::user()->password)){
                $user = new User;
                $user->where('email', '=', Auth::user()->email)
                     ->update(['password' => bcrypt($request->password)]);
                return redirect('user')->with('status', 'Password cambiado con éxito');
            }
            else
            {
                return redirect('user/password')->with('message', 'Credenciales incorrectas');
            }
        }
    }


La acción password regresa una vista llamada "password". La acción updatePassword primero valida los atributos del formularios, si la validación falla el usuario es redireccionado nuevamente al formulario con los mensajes de error, si pasa la validación primero comprobamos si el atributo "mypassword" coincide con el actual password del usuario, de ser así, actualizamos el password del usuario y lo redireccionamos a "user" con un "status", de lo contrario, lo redireccionamos nuevamente al formulario con un mensaje flash "message" con un error indicando que sus credenciales son incorrectas.

A continuación crearemos las rutas en "routes.php" para conectar las acciones:

Route::get('user/password', 'UserController@password');
Route::post('user/updatepassword', 'UserController@updatePassword');


Ahora creamos la vista "password.blade.php" en la carpeta "user", esta vista es la que regresa la acción "password", el código es el siguiente ...

@extends('layouts.home')
@section('content')
<h1>Cambiar mi password</h1>
@if (Session::has('message'))
 <div class="text-danger">
 {{Session::get('message')}}
 </div>
@endif
<hr />
<form method="post" action="{{url('user/updatepassword')}}">
 {{csrf_field()}}
 <div class="form-group">
  <label for="mypassword">Introduce tu actual password:</label>
  <input type="password" name="mypassword" class="form-control">
  <div class="text-danger">{{$errors->first('mypassword')}}</div>
 </div>
 <div class="form-group">
  <label for="password">Introduce tu nuevo password:</label>
  <input type="password" name="password" class="form-control">
  <div class="text-danger">{{$errors->first('password')}}</div>
 </div>
 <div class="form-group">
  <label for="mypassword">Confirma tu nuevo password:</label>
  <input type="password" name="password_confirmation" class="form-control">
 </div>
 <button type="submit" class="btn btn-primary">Cambiar mi password</button>
</form>
@stop



Por último agregamos la nueva la opción a la vista "user" ...

@extends('layouts.home')
@section('content')
<h1>Bienvenid@ {{Auth::user()->name}} a su Panel de Control</h1>
@if (Session::has('status'))
<hr />
<div class='text-success'>
    {{Session::get('status')}}
</div>
<hr />
@endif

<img src='{{url(Auth::user()->perfiles)}}' class='img-responsive' style='max-width: 150px' />

<h3>Opciones:</h3>
<ul>
    <li><a href="{{url('user/profile')}}">Cambiar mi imagen de perfil</a></li>
    <li><a href="{{url('user/password')}}">Cambiar mi password</a></li>
</ul>

@stop


Ahora prueben a cambiar su password desde el Panel de Control.